scoco.ai

Webhooks: scoco events in your own systems

Webhooks let scoco notify your own systems in real time — e.g. “call completed” or “appointment booked”. In the dashboard under Settings → Integrations → Automation you register an HTTPS address; scoco then sends a signed JSON message there for every event. Zapier, Make and n8n connect the same way (choose “Catch Hook” / “Webhook trigger” there and paste the generated URL into scoco).

Event types

TypeFired when
call.completeda call ended (with result, duration, caller number)
call.summary_readythe AI summary of a call is available
ticket.status_changeda call ticket was opened/resolved
ticket.assigneda call ticket was assigned
message.sms_receivedan SMS arrived at your scoco number
message.sms_sentscoco sent an SMS
appointment.bookedthe assistant booked an appointment
contact.createda contact was created (manually or automatically from a call)

When creating an endpoint you can filter the types; without a filter you receive all of them. New types are added strictly additively — your receiver should simply ignore unknown types.

Message format

Every delivery is a POST with Content-Type: application/json:

{
  "id": "5f0c…",
  "type": "call.completed",
  "created_at": "2026-08-06T12:58:41+00:00",
  "tenant_id": "a319…",
  "data": {
    "call_id": "…",
    "caller_e164": "+49621123456",
    "result": "message_taken",
    "duration_seconds": 151
  }
}

data differs per event type but always carries the relevant IDs — the dashboard shows the full details at any time. Fields inside data are also only ever added, never removed.

Verifying the signature (recommended)

When you create an endpoint, the dashboard shows a secret (whsec_…) exactly once. Store it safely — it cannot be retrieved again (if lost: delete the endpoint and create a new one).

Every delivery carries the header:

X-Scoco-Signature: t=1754481521,v1=5257a869e7…

Verification: v1 is the HMAC-SHA256 (hex) of the string "<t>.<raw request body>", keyed with your secret. Reject messages whose t is older than ~5 minutes (replay protection).

import hashlib, hmac, time

def verify(secret: str, body: bytes, header: str, tolerance: int = 300) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    t, v1 = int(parts["t"]), parts["v1"]
    if abs(time.time() - t) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, v1)

Delivery, retries, deactivation

  • Your endpoint counts as successful when it answers with a 2xx status within 10 seconds. Answer fast (ideally an immediate 200, processing asynchronous).
  • On failure scoco makes up to 5 delivery attempts in total (roughly 1 min → 5 min → 15 min → 1 h apart).
  • After 20 consecutive failures spanning at least 24 hours the endpoint is disabled automatically and the account owner is notified by e-mail. It can be re-enabled in the dashboard at any time; events that occurred while disabled are not re-delivered.
  • The delivery log of the last 30 days is visible in the dashboard (“Log”); older entries are deleted automatically.
  • “Test” delivers a signed ping event any time, to verify your setup.

Data protection

The messages contain personal data (caller numbers, names, call summaries). By registering an endpoint you instruct scoco to transmit this data to the system you named; make sure it is adequately protected there. Creating endpoints is therefore restricted to owners and administrators.