Documentation
API reference
Every resource, parameter and error of the /v1 REST API.
The REST API lives under https://api.allomi.ai/v1 (or your own server when you self-host). The OpenAPI 3.1 file is packages/contracts/openapi.yaml in the repository, and this page is generated from it.
Authentication
Send an API key as a bearer token. Keys are created in the app (Connectors and API) or with POST /v1/api-keys, and carry scopes. Each operation below lists the scope it needs.
Authorization: Bearer alm_live_…
Errors
Every non-2xx response has the same body, and a Request-Id header you can quote to the support.
{ "error": { "type": "invalid_request", "code": "validation_error", "message": "prompt is required", "param": "prompt", "requestId": "req_…" } }
Pagination
List endpoints return { "data": [...], "nextCursor": "…" | null }, newest first. Pass cursor with the previous nextCursor to get the next page, and limit (1 to 100, default 20) to size it.
Idempotency
POST endpoints that create resources accept an Idempotency-Key header. The same key with the same body returns the first response for 24 hours (with Idempotent-Replayed: true). The same key with another body returns 409 idempotency_conflict.
Endpoints
Allomi API 0.1.0 · generated from openapi.yaml
Calls
GET/v1/calls
List calls
Key scope: calls:read
Parameters
| Field | Type | Description |
|---|---|---|
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
status (query) | CallStatus | |
direction (query) | CallDirection | |
contactId (query) | string (uuid) | Resource id (UUIDv7) |
Responses
200Calls, newest firstCallList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/calls
Create a call
Key scope: calls:write
Places an outbound call driven by a free `prompt`. Calls to contacts need the `callable` permission; calls to other numbers need a number the account verified. Hourly, daily and minute caps apply. The result (status, duration, transcript, summary) arrives by webhook and on `GET /v1/calls/{callId}`.
Parameters
| Field | Type | Description |
|---|---|---|
Idempotency-Key (header) | string | Makes the POST safe to retry: the same key with the same body returns the first response for 24 hours (with `Idempotent-Replayed: true`); the same key with another body returns 409 `idempotency_conflict`. |
Request body CreateCallRequest
| Field | Type | Description |
|---|---|---|
to | E164 | Number to call. Exactly one of `to`, `contactId` or `owner` is required |
contactId | string (uuid) | Contact to call (must have the `callable` permission) |
owner | true | Call the account owner on their own phone ("call me") |
prompt (required) | string | What the assistant must do on this call, in natural language |
language | Language | Defaults to the contact's language, then the assistant's |
voice | string | |
maxMinutes | integer | Default: 10. Range: 1 to 60. |
useContactMemory | boolean | Give the assistant the contact's notes and history Default: true. |
reportToOwner | boolean | Mission: when the call ends, report the result to the owner (in their ongoing call if they are on the line, otherwise by calling them back). Needs `contactId` with the `missionsAllowed` permission Default: false. |
webhookUrl | string (uri) | Receives this call's events in addition to the account's webhook endpoints |
metadata | Metadata | Free key/value strings attached by the developer (max 20 keys). Returned as is, never spoken. |
Responses
201The call, usually `queued`Call400Invalid request (validation error)Error401Missing or invalid API keyError402Minute budget exhausted (`quota_exceeded`)Error403The API key lacks the required scopeError404Contact not foundError409Idempotency key reused with another bodyError422Call policy refused the call (`policy_violation`)Error429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/calls/{callId}
Get a call (with transcript)
Key scope: calls:read
Parameters
| Field | Type | Description |
|---|---|---|
callId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The callCall400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Call not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/calls/{callId}/hangup
Hang up a call
Key scope: calls:write
Ends a ringing or ongoing call. A no-op on a call that already ended.
Parameters
| Field | Type | Description |
|---|---|---|
callId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The callCall400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Call not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/calls/{callId}/say
Say something in an ongoing call
Key scope: calls:write
Injects information the assistant relays in its own words. Treated as data, never as instructions.
Parameters
| Field | Type | Description |
|---|---|---|
callId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body SayInCallRequest
| Field | Type | Description |
|---|---|---|
text (required) | string | What the assistant says now, as information to relay |
interrupt | boolean | Cut the assistant off if it is speaking Default: false. |
Responses
202Queued for the assistantAccepted400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Call not foundError409The call is not in progress (`conflict`)Error429Rate limited; retry after `Retry-After` secondsError500Internal errorError
Asks
Ask a human by phone (ask_owner, ask_contact)
GET/v1/asks
List asks
Key scope: asks:read
Parameters
| Field | Type | Description |
|---|---|---|
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
status (query) | "pending" | "calling" | "answered" | "unanswered" | "expired" | "failed" | "canceled" |
Responses
200Asks, newest firstAskList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/asks
Ask a human by phone (ask_owner / ask_contact)
Key scope: asks:write
Calls the owner (`target: owner`) or a contact (`target: contact`), reads the question, collects the answer and returns it by webhook (`ask.answered` / `ask.expired`) and on `GET /v1/asks/{askId}`.
Parameters
| Field | Type | Description |
|---|---|---|
Idempotency-Key (header) | string | Makes the POST safe to retry: the same key with the same body returns the first response for 24 hours (with `Idempotent-Replayed: true`); the same key with another body returns 409 `idempotency_conflict`. |
Request body CreateAskRequest
Responses
201The ask, `pending`Ask400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Contact not foundError409Idempotency key reused with another bodyError422Call policy refused the callError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/asks/{askId}
Get an ask
Key scope: asks:read
Parameters
| Field | Type | Description |
|---|---|---|
askId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The askAsk400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Ask not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/asks/{askId}/cancel
Cancel an ask
Key scope: asks:write
Parameters
| Field | Type | Description |
|---|---|---|
askId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The ask, `canceled`Ask400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Ask not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
Schedules
GET/v1/schedules
List schedules
Key scope: schedules:read
Parameters
| Field | Type | Description |
|---|---|---|
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
status (query) | ScheduleStatus |
Responses
200Schedules, newest firstScheduleList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/schedules
Schedule a call (one-off or recurring)
Key scope: schedules:write
Parameters
| Field | Type | Description |
|---|---|---|
Idempotency-Key (header) | string | Makes the POST safe to retry: the same key with the same body returns the first response for 24 hours (with `Idempotent-Replayed: true`); the same key with another body returns 409 `idempotency_conflict`. |
Request body CreateScheduleRequest
| Field | Type | Description |
|---|---|---|
contactId | string (uuid) | Omit to call the owner |
prompt (required) | string | |
rrule | string | RFC 5545 recurrence rule, evaluated in `timezone` |
runAt | string (date-time) | RFC 3339 date-time |
timezone | string | IANA time zone Default: "Europe/Paris". |
language | Language | BCP 47 language tag (language, optional region) |
voice | string | |
maxMinutes | integer | Default: 10. Range: 1 to 60. |
metadata | Metadata | Free key/value strings attached by the developer (max 20 keys). Returned as is, never spoken. |
Responses
201The scheduleSchedule400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Contact not foundError409Idempotency key reusedError422Schedule refused (rule too frequent, or `runAt` in the past)Error429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/schedules/{scheduleId}
Get a schedule
Key scope: schedules:read
Parameters
| Field | Type | Description |
|---|---|---|
scheduleId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The scheduleSchedule400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Schedule not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
PATCH/v1/schedules/{scheduleId}
Update, pause or resume a schedule
Key scope: schedules:write
Parameters
| Field | Type | Description |
|---|---|---|
scheduleId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body UpdateScheduleRequest
| Field | Type | Description |
|---|---|---|
status | "active" | "paused" | |
prompt | string | |
rrule | string | null | |
runAt | string (date-time) | null | |
timezone | string | IANA time zone |
language | Language | null | |
voice | string | null | |
maxMinutes | integer | Range: 1 to 60. |
metadata | Metadata | Free key/value strings attached by the developer (max 20 keys). Returned as is, never spoken. |
Responses
200The scheduleSchedule400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Schedule not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
DELETE/v1/schedules/{scheduleId}
Delete a schedule
Key scope: schedules:write
Parameters
| Field | Type | Description |
|---|---|---|
scheduleId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200DeletedDeleted400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Schedule not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
Contacts
Contacts with memory: notes and commitments
GET/v1/contacts
List contacts
Key scope: contacts:read
Parameters
| Field | Type | Description |
|---|---|---|
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
q (query) | string | Search by name or number |
Responses
200Contacts, newest firstContactList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/contacts
Create a contact
Key scope: contacts:write
Parameters
| Field | Type | Description |
|---|---|---|
Idempotency-Key (header) | string | Makes the POST safe to retry: the same key with the same body returns the first response for 24 hours (with `Idempotent-Replayed: true`); the same key with another body returns 409 `idempotency_conflict`. |
Request body CreateContactRequest
| Field | Type | Description |
|---|---|---|
name (required) | string | |
numbers (required) | E164[] | |
relationship | string | |
language | Language | BCP 47 language tag (language, optional region) Default: "fr". |
formality | "tu" | "vous" | Default: "vous". |
permissions | object |
Responses
201The contactContact400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError409Idempotency key reusedError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/contacts/{contactId}
Get a contact
Key scope: contacts:read
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The contactContact400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Contact not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
PATCH/v1/contacts/{contactId}
Update a contact
Key scope: contacts:write
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body UpdateContactRequest
| Field | Type | Description |
|---|---|---|
name | string | |
numbers | E164[] | |
relationship | string | null | |
language | Language | BCP 47 language tag (language, optional region) |
formality | "tu" | "vous" | |
permissions | object |
Responses
200The contactContact400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Contact not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
DELETE/v1/contacts/{contactId}
Delete a contact (with its notes and commitments)
Key scope: contacts:write
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200DeletedDeleted400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Contact not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/contacts/{contactId}/notes
List a contact's notes
Key scope: contacts:read
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
Responses
200Notes, newest firstContactNoteList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Contact not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/contacts/{contactId}/notes
Add a note to a contact
Key scope: contacts:write
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body CreateContactNoteRequest
| Field | Type | Description |
|---|---|---|
text (required) | string |
Responses
201The note, `confirmed`ContactNote400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Contact not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
PATCH/v1/contacts/{contactId}/notes/{noteId}
Edit, confirm or reject a note
Key scope: contacts:write
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
noteId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body UpdateContactNoteRequest
| Field | Type | Description |
|---|---|---|
text | string | |
status | "proposed" | "confirmed" | "rejected" |
Responses
200The noteContactNote400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Note not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
DELETE/v1/contacts/{contactId}/notes/{noteId}
Delete a note
Key scope: contacts:write
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
noteId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200DeletedDeleted400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Note not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/contacts/{contactId}/commitments
List a contact's commitments
Key scope: contacts:read
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
Responses
200Commitments, newest firstCommitmentList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Contact not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/contacts/{contactId}/commitments
Add a commitment
Key scope: contacts:write
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body CreateCommitmentRequest
| Field | Type | Description |
|---|---|---|
text (required) | string | |
dueAt | string (date-time) | RFC 3339 date-time |
Responses
201The commitment, `open`Commitment400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Contact not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
PATCH/v1/contacts/{contactId}/commitments/{commitmentId}
Update or close a commitment
Key scope: contacts:write
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
commitmentId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body UpdateCommitmentRequest
| Field | Type | Description |
|---|---|---|
text | string | |
dueAt | string (date-time) | null | |
status | "proposed" | "open" | "done" | "canceled" |
Responses
200The commitmentCommitment400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Commitment not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
DELETE/v1/contacts/{contactId}/commitments/{commitmentId}
Delete a commitment
Key scope: contacts:write
Parameters
| Field | Type | Description |
|---|---|---|
contactId (path) (required) | string (uuid) | Resource id (UUIDv7) |
commitmentId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200DeletedDeleted400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Commitment not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/memory/search
Search the assistant's memory
Key scope: contacts:read
Full-text search across contacts, confirmed and proposed notes, commitments and call summaries. Returns the best matches first.
Parameters
| Field | Type | Description |
|---|---|---|
q (query) (required) | string | Words to look for |
contactId (query) | string (uuid) | Only search this contact's memory |
limit (query) | integer | Maximum hits (1 to 50, default 10) |
Responses
200Matches, best firstMemorySearchResult400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
Assistants
GET/v1/assistants
List assistants
Key scope: assistants:read
One assistant per user in v1.
Parameters
| Field | Type | Description |
|---|---|---|
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
Responses
200AssistantsAssistantList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/assistants/{assistantId}
Get an assistant
Key scope: assistants:read
Parameters
| Field | Type | Description |
|---|---|---|
assistantId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The assistantAssistant400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Assistant not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
PATCH/v1/assistants/{assistantId}
Update an assistant
Key scope: assistants:write
Parameters
| Field | Type | Description |
|---|---|---|
assistantId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body UpdateAssistantRequest
| Field | Type | Description |
|---|---|---|
name | string | |
voice | string | |
language | Language | BCP 47 language tag (language, optional region) |
persona | string | null | |
instructions | string | null | |
aiDisclosure | boolean | |
recording | boolean | |
unknownCallers | "take_message" | "reject" | |
hours | AssistantHours | null | |
websiteUrl | string (uri) | null |
Responses
200The assistantAssistant400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Assistant not foundError422Setting not allowed (AI disclosure cannot be turned off in the cloud)Error429Rate limited; retry after `Retry-After` secondsError500Internal errorError
Numbers
GET/v1/numbers
List phone numbers
Key scope: numbers:read
Parameters
| Field | Type | Description |
|---|---|---|
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
Responses
200NumbersPhoneNumberList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/numbers
Request an own phone number
Key scope: numbers:write
Cloud only. Own numbers need an identity check (KYC) with the carrier; until it is automated this returns 422 `number_provisioning_unavailable` and the request is handled by support.
Parameters
| Field | Type | Description |
|---|---|---|
Idempotency-Key (header) | string | Makes the POST safe to retry: the same key with the same body returns the first response for 24 hours (with `Idempotent-Replayed: true`); the same key with another body returns 409 `idempotency_conflict`. |
Request body ProvisionNumberRequest
| Field | Type | Description |
|---|---|---|
country | "FR" | ISO 3166-1 alpha-2 country of the number Default: "FR". |
Responses
202Request accepted; the number appears as `pending`Accepted400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError422Provisioning not available for this account (`policy_violation`)Error429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/numbers/{numberId}
Get a phone number
Key scope: numbers:read
Parameters
| Field | Type | Description |
|---|---|---|
numberId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The numberPhoneNumber400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Number not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
Webhooks
GET/v1/webhook-endpoints
List webhook endpoints
Key scope: webhooks:read
Parameters
| Field | Type | Description |
|---|---|---|
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
Responses
200EndpointsWebhookEndpointList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/webhook-endpoints
Create a webhook endpoint
Key scope: webhooks:write
Parameters
| Field | Type | Description |
|---|---|---|
Idempotency-Key (header) | string | Makes the POST safe to retry: the same key with the same body returns the first response for 24 hours (with `Idempotent-Replayed: true`); the same key with another body returns 409 `idempotency_conflict`. |
Request body CreateWebhookEndpointRequest
| Field | Type | Description |
|---|---|---|
url (required) | string (uri) | |
description | string | |
events (required) | WebhookEventType[] | |
enabled | boolean | Default: true. |
Responses
201The endpoint, with its signing secretWebhookEndpointWithSecret400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError409Idempotency key reusedError422The endpoint URL is not a public https URLError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/webhook-endpoints/{endpointId}
Get a webhook endpoint
Key scope: webhooks:read
Parameters
| Field | Type | Description |
|---|---|---|
endpointId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The endpointWebhookEndpoint400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Endpoint not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
PATCH/v1/webhook-endpoints/{endpointId}
Update a webhook endpoint
Key scope: webhooks:write
Parameters
| Field | Type | Description |
|---|---|---|
endpointId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body UpdateWebhookEndpointRequest
| Field | Type | Description |
|---|---|---|
url | string (uri) | |
description | string | null | |
events | WebhookEventType[] | |
enabled | boolean |
Responses
200The endpointWebhookEndpoint400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Endpoint not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
DELETE/v1/webhook-endpoints/{endpointId}
Delete a webhook endpoint
Key scope: webhooks:write
Parameters
| Field | Type | Description |
|---|---|---|
endpointId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200DeletedDeleted400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Endpoint not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/webhook-endpoints/{endpointId}/rotate-secret
Rotate the signing secret
Key scope: webhooks:write
Parameters
| Field | Type | Description |
|---|---|---|
endpointId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200The endpoint, with its new secretWebhookEndpointWithSecret400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Endpoint not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/webhook-endpoints/{endpointId}/test
Send a test event
Key scope: webhooks:write
Sends one signed sample event to the endpoint and waits for the answer (10 seconds). The delivery is recorded and listed with the others.
Parameters
| Field | Type | Description |
|---|---|---|
endpointId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Request body TestWebhookEndpointRequest
| Field | Type | Description |
|---|---|---|
type | WebhookEventType | Event type of the sample payload Default: "call.completed". |
Responses
200The delivery, `succeeded` or `failed`WebhookDelivery400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Endpoint not foundError422The endpoint URL is not a public https URLError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
GET/v1/webhook-endpoints/{endpointId}/deliveries
List deliveries of an endpoint
Key scope: webhooks:read
Parameters
| Field | Type | Description |
|---|---|---|
endpointId (path) (required) | string (uuid) | Resource id (UUIDv7) |
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
status (query) | "pending" | "succeeded" | "failed" |
Responses
200Deliveries, newest firstWebhookDeliveryList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404Endpoint not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
API keys
GET/v1/api-keys
List API keys
Key scope: api_keys:read
Parameters
| Field | Type | Description |
|---|---|---|
limit (query) | integer | Page size (1 to 100, default 20) |
cursor (query) | string | Opaque cursor from `nextCursor` of the previous page |
Responses
200Keys (never the secret)ApiKeyList400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
POST/v1/api-keys
Create an API key
Key scope: api_keys:write
Parameters
| Field | Type | Description |
|---|---|---|
Idempotency-Key (header) | string | Makes the POST safe to retry: the same key with the same body returns the first response for 24 hours (with `Idempotent-Replayed: true`); the same key with another body returns 409 `idempotency_conflict`. |
Request body CreateApiKeyRequest
| Field | Type | Description |
|---|---|---|
name (required) | string | |
mode | "live" | "test" | Default: "live". |
scopes | ApiScope[] | Defaults to every scope |
expiresAt | string (date-time) | RFC 3339 date-time |
Responses
201The key; `key` is shown only onceCreatedApiKey400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError409Idempotency key reusedError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
DELETE/v1/api-keys/{apiKeyId}
Revoke an API key
Key scope: api_keys:write
Parameters
| Field | Type | Description |
|---|---|---|
apiKeyId (path) (required) | string (uuid) | Resource id (UUIDv7) |
Responses
200RevokedDeleted400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError404API key not foundError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
Usage
GET/v1/usage
Minutes used in a billing period
Key scope: usage:read
Parameters
| Field | Type | Description |
|---|---|---|
period (query) | string | Month to report, defaults to the current one |
Responses
200Usage of the periodUsage400Invalid request (validation error)Error401Missing or invalid API keyError403The API key lacks the required scopeError429Rate limited; retry after `Retry-After` secondsError500Internal errorError
Webhook events
The payloads sent to your webhook endpoints. How to receive and verify them is explained in Webhooks.
Allomi API 0.1.0 · generated from openapi.yaml
Webhook events
Payloads POSTed to your webhook endpoints
EVENTcall.started
A call was answered
Request body CallStartedEvent
| Field | Type | Description |
|---|---|---|
id (required) | string (uuid) | Event id; the same event is delivered with the same id on every retry |
type (required) | "call.started" | |
apiVersion (required) | "2026-11-01" | |
createdAt (required) | string (date-time) | RFC 3339 date-time |
data (required) | object |
Responses
200Any 2xx acknowledges the event
EVENTcall.completed
A call ended normally
Request body CallCompletedEvent
| Field | Type | Description |
|---|---|---|
id (required) | string (uuid) | Event id; the same event is delivered with the same id on every retry |
type (required) | "call.completed" | |
apiVersion (required) | "2026-11-01" | |
createdAt (required) | string (date-time) | RFC 3339 date-time |
data (required) | object |
Responses
200Any 2xx acknowledges the event
EVENTcall.failed
A call failed, was not answered or was canceled
Request body CallFailedEvent
| Field | Type | Description |
|---|---|---|
id (required) | string (uuid) | Event id; the same event is delivered with the same id on every retry |
type (required) | "call.failed" | |
apiVersion (required) | "2026-11-01" | |
createdAt (required) | string (date-time) | RFC 3339 date-time |
data (required) | object |
Responses
200Any 2xx acknowledges the event
EVENTask.answered
An ask got its answer
Request body AskAnsweredEvent
| Field | Type | Description |
|---|---|---|
id (required) | string (uuid) | Event id; the same event is delivered with the same id on every retry |
type (required) | "ask.answered" | |
apiVersion (required) | "2026-11-01" | |
createdAt (required) | string (date-time) | RFC 3339 date-time |
data (required) | object |
Responses
200Any 2xx acknowledges the event
EVENTask.expired
An ask expired without answer
Request body AskExpiredEvent
| Field | Type | Description |
|---|---|---|
id (required) | string (uuid) | Event id; the same event is delivered with the same id on every retry |
type (required) | "ask.expired" | |
apiVersion (required) | "2026-11-01" | |
createdAt (required) | string (date-time) | RFC 3339 date-time |
data (required) | object |
Responses
200Any 2xx acknowledges the event
EVENTcontact.created
A contact was created
Request body ContactCreatedEvent
| Field | Type | Description |
|---|---|---|
id (required) | string (uuid) | Event id; the same event is delivered with the same id on every retry |
type (required) | "contact.created" | |
apiVersion (required) | "2026-11-01" | |
createdAt (required) | string (date-time) | RFC 3339 date-time |
data (required) | object |
Responses
200Any 2xx acknowledges the event