API referenceWebhooksRegister a webhook

Register a webhook

⚠️
Preview — this feature is being built; the design below is the spec.
POST https://app.syntic.ai/v1/webhooks

Register an HTTPS endpoint to receive signed event deliveries for the key’s workspace. The response contains the signing secret, which is shown only here; store it with your other secrets and use it to verify every delivery.

For how this fits into a full workflow, see Webhooks.

Headers

HeaderRequiredValue
AuthorizationYesBearer <key>: a private inference key (sk_live_...). See Authentication.
syntic-betaYes, while in previewwebhooks-2026-11-01. Without it the call fails with 400 beta_required. See Versioning.
Content-TypeYesapplication/json
Idempotency-KeyNoUp to 255 characters. Retrying with the same key within 24 hours returns the first result instead of creating a duplicate. See Idempotency.

Body parameters

ParameterTypeRequiredNotes
urlstringYeshttps:// only, a public address, up to 2,048 characters. Redirects are not followed.
eventsarray of stringsYesEvent types such as batch.completed, or ["*"] for every type.
descriptionstringNoUp to 200 characters.
statusstringNoenabled (default) or disabled.

Response

201 Created, Content-Type: application/json

{
  "id": "whk_01JCA4C6E8G0J2L4N6Q8",
  "object": "webhook",
  "url": "https://hooks.example.com/syntic",
  "events": [
    "batch.completed",
    "session.requires_action",
    "deployment.run.failed"
  ],
  "description": "Ops alerts",
  "status": "enabled",
  "workspace_id": "wrkspc_01JC0A2C4E6G8J0L2N4Q",
  "created_at": "2026-11-05T09:00:00Z",
  "updated_at": "2026-11-05T09:00:00Z",
  "last_delivery": null,
  "signing_secret": "whsec_6Jt2Qm9...redacted"
}
FieldTypeDescription
idstringStarts with whk_.
objectstringAlways webhook.
urlstringWhere deliveries are sent. HTTPS, public address.
eventsarrayEvent types delivered, or ["*"] for all.
descriptionstring or nullUp to 200 characters.
statusstringenabled or disabled. Syntic disables an endpoint that has failed every delivery for 3 days.
workspace_idstringOnly this workspace’s events are delivered.
created_atstringRFC 3339 UTC.
updated_atstringRFC 3339 UTC.
last_deliveryobject or nullTime, HTTP status and outcome of the most recent attempt.
signing_secretstringStarts with whsec_. Returned only by this call and by rotate-secret.

Examples

curl -sS https://app.syntic.ai/v1/webhooks \
  -H "Authorization: Bearer $SYNTIC_API_KEY" \
  -H "syntic-beta: webhooks-2026-11-01" \
  -H "Idempotency-Key: 8d6f0c1e-4b2a-4a57-9f0e-2f1d3c4b5a69" \
  -H "Content-Type: application/json" \
  -d '{
      "url": "https://hooks.example.com/syntic",
      "events": [
        "batch.completed",
        "session.requires_action",
        "deployment.run.failed"
      ],
      "description": "Ops alerts"
    }'

Errors

Errors use the error envelope and carry a request_id. Codes specific to this operation:

StatustypecodeWhen
400invalid_request_errorbeta_requiredThe syntic-beta header is missing.
400invalid_request_errorinvalid_urlNot HTTPS, not a public address, or too long.
400invalid_request_errorunknown_event_typeAn entry in events is not a known type.
409conflict_errorwebhook_limit_reachedThe workspace already has 20 endpoints.
401authentication_errorinvalid_api_keyThe key is missing, unknown, revoked or expired.
429rate_limit_errorrate_limitedToo many requests; wait for Retry-After. See Rate-limit headers.

Organization-wide events

Spend and security events that concern the whole organization can also be registered with an Admin API key at /v1/organizations/webhooks, which accepts the same body and returns the same object.

Was this page helpful?