Integrations

One verdict. Every place it’s useful.

When a call qualifies or books, Saylia sends the outcome to the ad platforms that paid for the click and to your own systems — each matched the way that platform expects.

Booked · AC repair · $389

From a Google search ad · (512) 555-0143

Example
  • Google Ads“Booked call” · $389 · by click ID Sent
  • Microsoft AdvertisingNo MSCLKID on this call Not sent
  • MetaSchedule · phone_call · by hashed phone Sent
  • Your CRMcall.completed · signed webhook Sent

For developers

Webhooks and an API, built to be relied on.

Get every call into your own systems the moment it starts, ends or has a recording — and pull anything else you need on your schedule.

Webhooks

Subscribe any endpoint to the events it needs:

  • call.started
  • call.answered
  • call.completed
  • call.missed
  • recording.available
  • Signed

    Every delivery carries an HMAC-SHA256 signature of the body in X-Webhook-Signature, made with your endpoint’s secret.

  • Retried, safely

    A failed delivery is retried up to seven more times over about four hours, backing off from one minute to two hours, under the same X-Webhook-Delivery ID — so a repeat is easy to drop on your side.

  • Logged

    Every delivery and retry is logged with its status and your endpoint’s response, so a failed one is easy to spot. Send a test event any time.

  • Private addresses refused

    Endpoints that resolve to an internal network are refused before anything is sent.

REST API

  • Keys that stay in their laneAn API key never carries more access than the person who created it holds today — demote them, and the key shrinks too.
  • Per-key rate limitsEach key has its own limit, reported back on every response.
  • Cursor paginationPage through calls with a stable cursor, so new calls never shift what you have already read.
Verify a delivery · Node.js
import { createHmac, timingSafeEqual } from 'node:crypto';

// rawBody: the request body exactly as received, before JSON.parse
export function isFromSaylia(rawBody, signature, secret) {
  const expected = createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');
  return typeof signature === 'string'
    && signature.length === expected.length
    && timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
A delivery, abridgedExample
// POST https://your-app.example.com/hooks/saylia
// X-Webhook-Event: call.completed
// X-Webhook-Delivery: 3f0c9e62-…
// X-Webhook-Signature: 9b1d4e…

{
  "event": "call.completed",
  "data": {
    "call_id": "8f3c2a71-…",
    "account_id": "5b0e9d14-…",
    "duration_seconds": 376,
    "talk_duration_seconds": 351,
    "ended_at": "2026-09-29T15:48:47Z"
  }
}

Delivery

Every upload accounted for.

A conversion that silently fails to arrive is worse than none: bidding learns from the gap. Saylia treats every upload as something to prove.

  • Sent once

    Duplicates are caught before they go out, and click conversions carry an order ID the platform can check too.

  • Retried automatically

    Anything a platform doesn’t accept is sent again on the next scheduled pass.

  • Paced to each platform

    Uploads stay inside each platform’s rate limits, and pause while a platform is having trouble.

  • Logged

    Every send is logged with the platform’s answer, including the reason when a platform says no.

Connect the tools you already use.

Google Ads, Microsoft Advertising, Meta and your own systems — see exactly what each one receives from your calls.