API reference
Generated from the API's OpenAPI document, version 1.0.0. The document itself is in the repository, the SDK is typed from it, and the API serves an interactive version for trying requests.
Basics
The base URL is https://api.simhook.dev (or your own host). Requests and responses are JSON; timestamps are RFC 3339 in UTC; ids are UUIDs.
Authenticate with an API key from the dashboard in the X-Api-Key header. Authorization: Bearer <key> is accepted too. Keys carry scopes (send, read, devices, webhooks) and an endpoint refuses a key without the scope it needs; each endpoint below says which. Account operations need a dashboard session and cannot be done with a key.
Lists return data and a next_cursor; pass it back as cursor for the next page. limit defaults to 50.
Errors
Every error has the same shape. code is stable and meant for your code; message is for people.
| Field | Type | |
|---|
| code | string | Stable machine-readable code. |
| errors | FieldError[] | Per-field problems, when applicable. |
| message | string | Human-readable explanation. |
| status | integer | HTTP status code. |
Common codes: unauthenticated (401), insufficient_scope (403, a key without the scope the endpoint needs), not_found (404), validation_failed (422, with per-field errors), no_device (no paired phone can take the send), and the plan limits plan_limit_daily, plan_limit_monthly, plan_limit_batch, plan_limit_devices, plan_limit_webhooks (429).
Endpoints
Messages
Send texts, follow sends, and read what was sent and received.
GET/v1/batches
List sends
needs an API key with the read scope
Every send on the account, newest first, with per-status counts.
parameters
| cursor | query | string | |
| limit | query | integer | |
response 200
GET/v1/batches/{id}
Get a send
needs an API key with the read scope
The batch plus one message per recipient. Poll this to follow a send.
parameters
response 200
GET/v1/messages
List messages
needs an API key with the read scope
Sent and received messages across the account, newest first, with delivery state on each. To poll for new messages, request order=asc with a from bound and follow next_cursor.
parameters
| device_ids | query | string | Comma-separated device ids. Default: all paired devices. |
| direction | query | "outbound" | "inbound" | Filter by direction. |
| status | query | "queued" | "dispatched" | "sent" | "delivered" | "failed" | "unknown" | "received" | |
| batch_id | query | string | Only messages from one send. |
| q | query | string | Match against text, recipient, and sender. |
| from | query | string | Inclusive lower bound on created_at, RFC 3339. |
| to | query | string | Exclusive upper bound on created_at, RFC 3339. |
| order | query | "desc" | "asc" | desc (default) for newest first; asc to walk forward when polling. |
| cursor | query | string | next_cursor from a previous page. |
| limit | query | integer | Page size, default 50. |
response 200
| data | Message[] | |
| next_cursor | string | Pass as cursor to get the next page. Absent on the last page. |
POST/v1/messages
Send an SMS
needs an API key with the send scope
Queues one text to one or more recipients from a phone on the account. Acceptance is not delivery: follow the batch or subscribe to webhooks for the outcome. Every recipient counts as one message against the plan.
request body
| body | string, required | Message text. Long texts are sent as concatenated SMS. |
| device_id | string | Phone to send from. Defaults to the account's default device, else the most recently online one. |
| scheduled_at | timestamp | Send later, up to 7 days ahead. |
| sim_subscription_id | integer | SIM to use on a multi-SIM phone. Unknown ids fall back to the phone's preferred SIM. |
| to | string[], required | Recipient phone numbers, ideally E.164 such as +14155550123. |
response 202
| batch | Batch | |
| message_ids | string[] | One id per recipient, in the order given after de-duplication. |
GET/v1/messages/{id}
Get a message
needs an API key with the read scope
parameters
response 200
GET/v1/stats
Account totals
needs an API key with the read scope
response 200
| devices | integer | |
| received | integer | |
| sent | integer | |
Phones
The phones paired with the account: list them, change their settings, pair new ones.
GET/v1/devices
List devices
needs an API key with the read scope
Every phone paired with the account, default first.
response 200
DELETE/v1/devices/{id}
Unpair a device
needs an API key with the devices scope
Revokes the phone's token and stops sends to it. Message history is kept.
parameters
| id | path, required | string | Device id from GET /v1/devices. |
response 204
No body.
GET/v1/devices/{id}
Get a device
needs an API key with the read scope
parameters
| id | path, required | string | Device id from GET /v1/devices. |
response 200
PATCH/v1/devices/{id}
Update device settings
needs an API key with the devices scope
Only the fields you send change. The phone is told at once and reloads its settings within seconds; a phone that is offline picks them up when it is back.
parameters
request body
| clear_preferred_sim | boolean | Set true to fall back to the phone's default SIM. |
| enabled | boolean | A disabled phone receives no new sends, and sends already queued for it fail. |
| heartbeat_interval_minutes | integer | |
| name | string | |
| preferred_sim_subscription_id | integer | SIM to send from when a send names none. |
| receive_enabled | boolean | Forward incoming SMS from this phone. |
| send_delay_seconds | integer | Pause between consecutive sends on the phone. |
response 200
POST/v1/devices/{id}/default
Make this the default device
needs an API key with the devices scope
Sends that omit device_id go out from the default device.
parameters
| id | path, required | string | Device id from GET /v1/devices. |
response 200
POST/v1/devices/pairing-codes
Create a pairing code
needs an API key with the devices scope
Mints a code valid for 10 minutes. Enter it in the phone app, or show pair_url as a QR code for the app to scan.
response 201
| code | string | Type this into the app, or scan pair_url as a QR code. |
| expires_at | timestamp | |
| id | string | Poll GET /v1/devices/pairing-codes/{id} to learn when a phone has used the code. |
| pair_url | string | Deep link the app understands. Encode it as a QR code. |
GET/v1/devices/pairing-codes/{id}
Check a pairing code
needs an API key with the devices scope
Whether a phone has used the code yet, and which one. Poll it while showing the code.
parameters
| id | path, required | string | Pairing code id from POST /v1/devices/pairing-codes. |
response 200
| consumed | boolean | True once a phone has paired with this code. |
| device | Device | The phone that used the code, once one has. |
| expires_at | timestamp | |
Webhooks
Endpoints that receive events, and the log of every delivery attempt.
GET/v1/webhooks
List webhooks
needs an API key with the webhooks scope
response 200
POST/v1/webhooks
Create a webhook
needs an API key with the webhooks scope
Subscribes an https URL to events. Each delivery is a JSON POST signed with the returned secret: X-Simhook-Signature is t=<unix>,v1=<hex hmac-sha256 of "<t>.<body>">. Respond 2xx within 30 seconds; other responses are retried for about two days.
request body
| events | string[], required | Any of message.received, message.sent, message.delivered, message.failed, message.unknown, device.online, device.offline, ping. |
| name | string | |
| url | string, required | HTTPS endpoint that receives POSTs. |
response 201
| secret | string | Signing secret, shown once. Verify X-Simhook-Signature with it. |
| webhook | Webhook | |
DELETE/v1/webhooks/{id}
Delete a webhook
needs an API key with the webhooks scope
parameters
response 204
No body.
GET/v1/webhooks/{id}
Get a webhook
needs an API key with the webhooks scope
parameters
response 200
PATCH/v1/webhooks/{id}
Update a webhook
needs an API key with the webhooks scope
parameters
request body
| enabled | boolean | Re-enabling clears any automatic pause. |
| events | string[] | |
| name | string | |
| url | string | |
response 200
POST/v1/webhooks/{id}/rotate-secret
Rotate the signing secret
needs an API key with the webhooks scope
Deliveries queued from now on are signed with the new secret.
parameters
response 200
POST/v1/webhooks/{id}/test
Send a test event
needs an API key with the webhooks scope
Queues a ping delivery so you can check your endpoint and signature verification.
parameters
response 202
GET/v1/webhooks/deliveries
List deliveries
needs an API key with the webhooks scope
Delivery attempts across every webhook on the account, newest first, including webhooks since deleted.
parameters
| webhook_id | query | string | |
| status | query | "pending" | "delivered" | "retrying" | "failed" | |
| event | query | "message.received" | "message.sent" | "message.delivered" | "message.failed" | "message.unknown" | "device.online" | "device.offline" | "ping" | |
| from | query | string | |
| to | query | string | |
| cursor | query | string | |
| limit | query | integer | |
response 200
GET/v1/webhooks/deliveries/{id}
Get a delivery
needs an API key with the webhooks scope
parameters
response 200
API keys
Keys for the API. Each has scopes; the secret is shown once, at creation.
GET/v1/api-keys
List API keys
needs a dashboard session; an API key cannot do this
parameters
| include_revoked | query | boolean | Also return revoked keys. |
response 200
POST/v1/api-keys
Create an API key
needs a dashboard session; an API key cannot do this
The full key is returned once. Only its hash is stored.
request body
| expires_at | timestamp | Optional expiry. |
| name | string | Label shown in the dashboard. |
| scopes | string[] | Any of send, read, devices, webhooks. Defaults to all. |
response 201
| api_key | APIKey | |
| key | string | The full key. It is shown once and never stored. |
DELETE/v1/api-keys/{id}
Delete an API key
needs a dashboard session; an API key cannot do this
parameters
| id | path, required | string | API key id. |
response 204
No body.
PATCH/v1/api-keys/{id}
Rename an API key
needs a dashboard session; an API key cannot do this
parameters
request body
response 204
No body.
POST/v1/api-keys/{id}/revoke
Revoke an API key
needs a dashboard session; an API key cannot do this
Stops the key working immediately while keeping its record.
parameters
| id | path, required | string | API key id. |
response 204
No body.
Plans
The plans and their limits.
GET/v1/plans
List plans
The public plan catalogue with limits and prices. No credentials needed.
response 200
Accounts and sessions
Used by the dashboard with a session cookie. Listed for self-hosters building their own front end.
GET/v1/auth/config
Sign-in options
What the sign-in page needs to know: whether Google sign-in is on, and the Turnstile site key when a bot check is required on the sign-in, sign-up, and password reset forms.
response 200
| google_sign_in | boolean | Whether Continue with Google is available at GET /v1/auth/google/start. |
| turnstile_site_key | string | Site key for the Cloudflare Turnstile widget, or empty when no bot check is needed. |
POST/v1/auth/login
Sign in
Checks the password and sets the session cookies the dashboard uses. A session lives 30 days without use, longer while it is used, and 180 days at most.
request body
| email | string, required | |
| password | string, required | |
| turnstile_token | string | Cloudflare Turnstile token. Required when GET /v1/auth/config reports a turnstile_site_key. |
response 200
POST/v1/auth/logout
Sign out
needs a dashboard session; an API key cannot do this
Ends this session and clears the cookies. Always succeeds, so a browser with a dead cookie can still clean up.
response 204
No body.
GET/v1/auth/me
Current account
The account behind the credentials, with its plan limits and usage this period.
response 200
POST/v1/auth/password
Change password
needs a dashboard session; an API key cannot do this
Requires the current password. Every other session is signed out.
request body
| current_password | string, required | |
| new_password | string, required | |
response 204
No body.
POST/v1/auth/password-reset
Set a new password with a reset code
Completes a reset. Every existing session is signed out.
request body
| code | string, required | |
| email | string, required | |
| new_password | string, required | |
response 204
No body.
POST/v1/auth/password-reset/request
Request a password reset code
Emails a code if the address has an account. The response is the same either way.
request body
| email | string, required | |
| turnstile_token | string | Cloudflare Turnstile token. Required when GET /v1/auth/config reports a turnstile_site_key. |
response 202
No body.
PATCH/v1/auth/profile
Update profile
needs a dashboard session; an API key cannot do this
request body
response 200
POST/v1/auth/register
Create an account
Creates the account, signs it in with the session cookies, and emails a verification code. Sending is blocked until the email is verified.
request body
| email | string, required | Sign-in email. A verification code is sent to it. |
| name | string | Display name. |
| password | string, required | At least 10 characters. |
| turnstile_token | string | Cloudflare Turnstile token. Required when GET /v1/auth/config reports a turnstile_site_key. |
response 201
GET/v1/auth/sessions
List sessions
needs a dashboard session; an API key cannot do this
Every browser signed in to this account, most recently used first. The one making the request is marked current.
response 200
DELETE/v1/auth/sessions/{id}
End a session
needs a dashboard session; an API key cannot do this
Signs that browser out. Ending the current session also clears its cookies.
parameters
| id | path, required | string | Session id. |
response 204
No body.
POST/v1/auth/sessions/revoke-others
End every other session
needs a dashboard session; an API key cannot do this
Signs out every browser but this one.
response 204
No body.
POST/v1/auth/verify-email
Verify the email address
needs a dashboard session; an API key cannot do this
request body
| code | string, required | The 6-digit code from the email. |
response 200
POST/v1/auth/verify-email/send
Resend the verification code
needs a dashboard session; an API key cannot do this
response 202
No body.
Phone endpoints
Called by the phone app with the token it received at pairing. Listed for anyone writing their own client.
DELETE/v1/device
Unpair this phone
needs the phone's device token
Removes this phone from the account and revokes its token. Message history is kept.
response 204
No body.
GET/v1/device
This phone's record
needs the phone's device token
response 200
PATCH/v1/device
Change this phone's settings
needs the phone's device token
request body
| clear_preferred_sim | boolean | Set true to fall back to the phone's default SIM. |
| enabled | boolean | A disabled phone receives no new sends. |
| name | string | |
| preferred_sim_subscription_id | integer | SIM to send from when a send names none. |
| receive_enabled | boolean | Forward incoming SMS from this phone. |
| send_delay_seconds | integer | Pause between consecutive sends. |
response 200
POST/v1/device/heartbeat
Check in
needs the phone's device token
Reports the phone is alive and uploads its state. The response carries the settings the phone should apply.
request body
| app_version_code | integer | |
| app_version_name | string | |
| os_api_level | integer | |
| os_version | string | |
| push_token | string | |
| sims | any | Array of SIM descriptors with subscription_id, carrier, slot, country. |
| telemetry | any | Battery, network, storage, uptime, timezone, locale. Free-form object. |
response 200
POST/v1/device/inbound
Report a received SMS
needs the phone's device token
Stores an incoming message and fans out message.received. Returns 201 when stored, 200 when it was already known.
request body
| body | string, required | The text, with concatenated parts already joined. |
| fingerprint | string | Hash of sender, body, and timestamp computed on the phone. Repeats are ignored. |
| received_at | timestamp, required | |
| sender | string, required | |
| sim_subscription_id | integer | |
response 200
| inserted | boolean | False when this message was already stored. |
| message | Message | |
GET/v1/device/messages
This phone's messages
needs the phone's device token
parameters
| direction | query | "outbound" | "inbound" | |
| cursor | query | string | |
| limit | query | integer | |
response 200
| data | Message[] | |
| next_cursor | string | Pass as cursor to get the next page. Absent on the last page. |
POST/v1/device/messages/{id}/status
Report a send outcome
needs the phone's device token
Idempotent. Out-of-order reports never move a message backwards.
parameters
| id | path, required | string | Message id from the outbox. |
request body
| at | timestamp | When it happened on the phone. Defaults to now. |
| error_code | string | |
| error_message | string | |
| status | "sent" | "delivered" | "failed", required | |
response 200
GET/v1/device/outbox
Messages to send
needs the phone's device token
The messages this phone should send now, oldest first. Fetching marks them dispatched. A message stays in the list until the phone reports its outcome, so a phone that lost one gets it again.
parameters
| limit | query | integer | At most this many messages. Default 100. |
response 200
POST/v1/device/pair
Pair a phone
Exchanges a pairing code for a device record and a device token. Called by the phone app.
request body
| app_version_code | integer | |
| app_version_name | string | |
| brand | string | |
| build_id | string | |
| code | string, required | Pairing code from the dashboard. |
| hardware_key | string, required | Stable hash the app derives from the handset, so re-pairing finds the same device. |
| manufacturer | string | |
| model | string | |
| name | string | |
| os_api_level | integer | |
| os_version | string | |
| push_token | string | |
response 201
| device | Device | |
| device_token | string | Bearer token for /v1/device endpoints. Shown once. |
POST/v1/device/push-token
Register a new push token
needs the phone's device token
request body
response 204
No body.
Objects
The shapes that appear in requests and responses above.
APIKey
| created_at | timestamp, required | |
| expires_at | timestamp | null, required | |
| id | string, required | |
| last_used_at | timestamp | null, required | |
| name | string, required | |
| prefix | string, required | |
| revoked_at | timestamp | null, required | |
| scopes | string[], required | |
| use_count | integer, required | |
AuthConfigOutputBody
| google_sign_in | boolean, required | Whether Continue with Google is available at GET /v1/auth/google/start. |
| turnstile_site_key | string, required | Site key for the Cloudflare Turnstile widget, or empty when no bot check is needed. |
Batch
| body | string, required | |
| completed_at | timestamp | null, required | |
| created_at | timestamp, required | |
| delivered_count | integer, required | |
| device_id | string, required | |
| dispatched_count | integer, required | |
| error | string | null, required | |
| estimated_completion_at | timestamp | null, required | |
| failed_count | integer, required | |
| id | string, required | |
| recipient_count | integer, required | |
| recipient_preview | string, required | |
| scheduled_at | timestamp | null, required | |
| sent_count | integer, required | |
| status | string, required | |
| unknown_count | integer, required | |
| updated_at | timestamp, required | |
BatchesOutputBody
| data | Batch[], required | |
| next_cursor | string | |
ChangePasswordInputBody
| current_password | string, required | |
| new_password | string, required | |
CreateKeyInputBody
| expires_at | timestamp | Optional expiry. |
| name | string | Label shown in the dashboard. |
| scopes | string[] | Any of send, read, devices, webhooks. Defaults to all. |
CreateKeyOutputBody
| api_key | APIKey, required | |
| key | string, required | The full key. It is shown once and never stored. |
CreateWebhookInputBody
| events | string[], required | Any of message.received, message.sent, message.delivered, message.failed, message.unknown, device.online, device.offline, ping. |
| name | string | |
| url | string, required | HTTPS endpoint that receives POSTs. |
Delivery
| abandoned_at | timestamp | null, required | |
| attempt_count | integer, required | |
| created_at | timestamp, required | |
| delivered_at | timestamp | null, required | |
| device_id | string, required | |
| error | string | null, required | |
| event | string, required | |
| http_status | integer | null, required | |
| id | string, required | |
| last_attempt_at | timestamp | null, required | |
| message_id | string, required | |
| next_attempt_at | timestamp | null, required | |
| payload | any, required | |
| response_excerpt | string | null, required | |
| status | string, required | |
| url | string, required | |
| webhook_id | string, required | |
Device
| app_version_code | integer | null, required | |
| app_version_name | string | null, required | |
| brand | string | null, required | |
| created_at | timestamp, required | |
| enabled | boolean, required | |
| heartbeat_interval_minutes | integer, required | |
| id | string, required | |
| is_default | boolean, required | |
| last_heartbeat_at | timestamp | null, required | |
| manufacturer | string | null, required | |
| model | string | null, required | |
| name | string, required | |
| online | boolean, required | |
| os_api_level | integer | null, required | |
| os_version | string | null, required | |
| preferred_sim_subscription_id | integer | null, required | |
| push_token_invalid_reason | string | null, required | |
| push_token_invalidated_at | timestamp | null, required | |
| receive_enabled | boolean, required | |
| received_count | integer, required | |
| send_delay_seconds | integer, required | |
| sent_count | integer, required | |
| sims | any, required | |
| telemetry | any, required | |
| updated_at | timestamp, required | |
DevicePatchBody
| clear_preferred_sim | boolean | Set true to fall back to the phone's default SIM. |
| enabled | boolean | A disabled phone receives no new sends, and sends already queued for it fail. |
| heartbeat_interval_minutes | integer | |
| name | string | |
| preferred_sim_subscription_id | integer | SIM to send from when a send names none. |
| receive_enabled | boolean | Forward incoming SMS from this phone. |
| send_delay_seconds | integer | Pause between consecutive sends on the phone. |
DevicePatchSelfBody
| clear_preferred_sim | boolean | Set true to fall back to the phone's default SIM. |
| enabled | boolean | A disabled phone receives no new sends. |
| name | string | |
| preferred_sim_subscription_id | integer | SIM to send from when a send names none. |
| receive_enabled | boolean | Forward incoming SMS from this phone. |
| send_delay_seconds | integer | Pause between consecutive sends. |
FieldError
| field | string | Location of the problem, for example body.to[0]. |
| message | string, required | What is wrong with it. |
HeartbeatInputBody
| app_version_code | integer | |
| app_version_name | string | |
| os_api_level | integer | |
| os_version | string | |
| push_token | string | |
| sims | any | Array of SIM descriptors with subscription_id, carrier, slot, country. |
| telemetry | any | Battery, network, storage, uptime, timezone, locale. Free-form object. |
InboundInputBody
| body | string, required | The text, with concatenated parts already joined. |
| fingerprint | string | Hash of sender, body, and timestamp computed on the phone. Repeats are ignored. |
| received_at | timestamp, required | |
| sender | string, required | |
| sim_subscription_id | integer | |
InboundOutputBody
| inserted | boolean, required | False when this message was already stored. |
| message | Message, required | |
Limits
| batch_limit | integer, required | |
| daily_limit | integer, required | |
| device_limit | integer, required | |
| monthly_limit | integer, required | |
| plan_id | string, required | |
| plan_name | string, required | |
LoginInputBody
| email | string, required | |
| password | string, required | |
| turnstile_token | string | Cloudflare Turnstile token. Required when GET /v1/auth/config reports a turnstile_site_key. |
Message
| batch_id | string, required | |
| body | string, required | |
| created_at | timestamp, required | |
| delivered_at | timestamp | null, required | |
| device_id | string, required | |
| direction | string, required | |
| dispatched_at | timestamp | null, required | |
| error_code | string | null, required | |
| error_message | string | null, required | |
| failed_at | timestamp | null, required | |
| id | string, required | |
| received_at | timestamp | null, required | |
| recipient | string | null, required | |
| sender | string | null, required | |
| sent_at | timestamp | null, required | |
| sim_subscription_id | integer | null, required | |
| status | string, required | |
| updated_at | timestamp, required | |
MessagesOutputBody
| data | Message[], required | |
| next_cursor | string | Pass as cursor to get the next page. Absent on the last page. |
OutboxRow
| batch_id | string, required | |
| body | string, required | |
| id | string, required | |
| sim_subscription_id | integer | null, required | |
| to | string, required | |
PairInputBody
| app_version_code | integer | |
| app_version_name | string | |
| brand | string | |
| build_id | string | |
| code | string, required | Pairing code from the dashboard. |
| hardware_key | string, required | Stable hash the app derives from the handset, so re-pairing finds the same device. |
| manufacturer | string | |
| model | string | |
| name | string | |
| os_api_level | integer | |
| os_version | string | |
| push_token | string | |
PairOutputBody
| device | Device, required | |
| device_token | string, required | Bearer token for /v1/device endpoints. Shown once. |
PairingCodeOutputBody
| code | string, required | Type this into the app, or scan pair_url as a QR code. |
| expires_at | timestamp, required | |
| id | string, required | Poll GET /v1/devices/pairing-codes/{id} to learn when a phone has used the code. |
| pair_url | string, required | Deep link the app understands. Encode it as a QR code. |
PairingStatusOutputBody
| consumed | boolean, required | True once a phone has paired with this code. |
| device | Device, required | The phone that used the code, once one has. |
| expires_at | timestamp, required | |
Plan
| active | boolean, required | |
| batch_limit | integer, required | |
| daily_limit | integer, required | |
| device_limit | integer, required | |
| id | string, required | |
| monthly_limit | integer, required | |
| monthly_price_cents | integer, required | |
| name | string, required | |
| yearly_price_cents | integer, required | |
RegisterInputBody
| email | string, required | Sign-in email. A verification code is sent to it. |
| name | string | Display name. |
| password | string, required | At least 10 characters. |
| turnstile_token | string | Cloudflare Turnstile token. Required when GET /v1/auth/config reports a turnstile_site_key. |
ResetInputBody
| code | string, required | |
| email | string, required | |
| new_password | string, required | |
ResetRequestInputBody
| email | string, required | |
| turnstile_token | string | Cloudflare Turnstile token. Required when GET /v1/auth/config reports a turnstile_site_key. |
SendInputBody
| body | string, required | Message text. Long texts are sent as concatenated SMS. |
| device_id | string | Phone to send from. Defaults to the account's default device, else the most recently online one. |
| scheduled_at | timestamp | Send later, up to 7 days ahead. |
| sim_subscription_id | integer | SIM to use on a multi-SIM phone. Unknown ids fall back to the phone's preferred SIM. |
| to | string[], required | Recipient phone numbers, ideally E.164 such as +14155550123. |
SendOutputBody
| batch | Batch, required | |
| message_ids | string[], required | One id per recipient, in the order given after de-duplication. |
SessionView
| created_at | timestamp, required | When it signed in. |
| current | boolean, required | True for the session making this request. |
| expires_at | timestamp, required | When it ends if it stays idle. |
| id | string, required | |
| ip | string | null, required | The address it signed in from. |
| last_seen_at | timestamp, required | |
| user_agent | string | null, required | The browser that signed in, as it described itself. |
Stats
| devices | integer, required | |
| received | integer, required | |
| sent | integer, required | |
StatusReportInputBody
| at | timestamp | When it happened on the phone. Defaults to now. |
| error_code | string | |
| error_message | string | |
| status | "sent" | "delivered" | "failed", required | |
UpdateWebhookInputBody
| enabled | boolean | Re-enabling clears any automatic pause. |
| events | string[] | |
| name | string | |
| url | string | |
UsageView
| received_this_month | integer, required | |
| received_today | integer, required | |
| sent_this_month | integer, required | |
| sent_today | integer, required | |
User
| avatar_url | string | null, required | |
| created_at | timestamp, required | |
| deletion_requested_at | timestamp | null, required | |
| email | string, required | |
| email_verified_at | timestamp | null, required | |
| google_linked | boolean, required | |
| has_password | boolean, required | |
| id | string, required | |
| last_login_at | timestamp | null, required | |
| name | string | null, required | |
| onboarding | any, required | |
| role | string, required | |
| updated_at | timestamp, required | |
VerifyEmailInputBody
| code | string, required | The 6-digit code from the email. |
Webhook
| created_at | timestamp, required | |
| disabled_reason | string | null, required | |
| enabled | boolean, required | |
| events | string[], required | |
| failure_count | integer, required | |
| id | string, required | |
| last_attempt_at | timestamp | null, required | |
| last_failure_at | timestamp | null, required | |
| last_success_at | timestamp | null, required | |
| name | string | null, required | |
| success_count | integer, required | |
| updated_at | timestamp, required | |
| url | string, required | |
WebhookCreatedOutputBody
| secret | string, required | Signing secret, shown once. Verify X-Simhook-Signature with it. |
| webhook | Webhook, required | |