Error codes

Errors are RFC 9457 application/problem+json. Branch on code, never on title or detail: the code is stable, the wording can change. Each code's type is a link to its entry here.

Shape

{
  "type": "https://staging.callmeawake.com/docs/errors#invalid_timezone",
  "title": "Unknown time zone",
  "status": 400,
  "detail": "'Tokio' is not a time zone we know. Did you mean 'Asia/Tokyo'?",
  "code": "invalid_timezone",
  "field": "timezone",
  "instance": "/api/v1/schedules"
}

field names the request field at fault when there is one. errors appears on validation_error only, one item per problem. Rate limits and outages add Retry-After (seconds); see the API reference for the rest.

400 Bad Request

invalid_timezone Unknown time zone

The time zone is not an IANA city zone we know, such as Asia/Tokyo or America/Los_Angeles. Abbreviations like PST and legacy aliases are refused too. Search GET /timezones for the right name.

timezone_not_allowed Time zone not allowed

The zone is a fixed offset (such as Etc/GMT+8), not a place, so it would not follow the clocks where you are. Pick a city zone, or UTC.

time_in_past Time is in the past

The wall time you asked for has already passed in that zone. Choose a later time or date.

date_too_far Date is too far ahead

The date is further ahead than we schedule. Pick a nearer date and create the call again.

invalid_time Invalid time

local_time is not a 24-hour HH:MM clock time.

days_of_week_empty No days of the week

A recurring wake-up call needs at least one day of the week, from mon to sun.

local_date_required Date required

A one-off call at a wall time needs local_date as well as local_time. To call after a delay, send in_minutes instead.

in_minutes_out_of_range Minutes out of range

in_minutes is outside the range we accept for a delay.

invalid_retry_policy Invalid retry policy

The retry policy is not allowed: the offsets, snooze length, snooze count or ring timeout are outside the limits. Send null to use the default.

phone_number_unverified Phone number not verified

The number has not been verified yet. Start verification, then check the code it was sent.

phone_number_not_owned Phone number not yours

The phone number does not belong to this account. List yours with GET /phone-numbers.

message_disallowed_content Message not allowed

The label or spoken note is too long or has something we do not read aloud: only letters, digits and basic punctuation are allowed, and no links or phone numbers.

not_recurring Not a recurring wake-up call

This action only applies to a recurring wake-up call, and this one is a one-off.

invalid_phone_number Invalid phone number

The number is not a valid phone number. Send it in E.164 form, for example +14155551212.

country_not_supported Country not supported

We do not place wake-up calls to numbers in that country.

verification_code_invalid Wrong or expired code

The verification code is wrong or has expired. Too many wrong codes lock the number (see verification_locked); ask for a new code.

confirmation_required Confirmation required

A destructive or consent-giving request must carry its explicit confirmation field, such as confirm set to DELETE when deleting the account.

validation_error Invalid request

The request is malformed: a field is missing, has the wrong type or breaks a limit. The errors array lists each problem with its location.

401 Unauthorized

unauthenticated Not signed in

No usable credentials. Send an API key or an app session token as Authorization: Bearer, or use the web session with its CSRF token.

api_key_revoked API key revoked

This API key was revoked. Create a new key in Settings.

session_expired Session expired

The session has ended. Sign in again to get a new session token.

402 Payment Required

no_entitlement No wake-up calls left

The account has no wake-up calls left on its trial or plan, so the call would not be placed. See GET /me/usage.

403 Forbidden

insufficient_scope Not allowed with these credentials

These credentials cannot do this. A read-only key cannot change anything, the full data export needs a key made with the export scope, and some actions (API keys, registering or removing a device, deleting the account) need the app or the web rather than an API key.

calls_revoked Calls are turned off

Calls are turned off for this account, for example after someone pressed 9 on a call. Only the account holder can turn them back on, with explicit consent, in the app or on the web (POST /me/resume-calls refuses API keys and MCP clients).

demo_not_available Demo not available

The demo call is not available for this number or country.

web_checkout_disabled Web checkout not offered

Subscribing on the web from the app is not offered right now (it is switched off, or payments are not set up). Subscribe in the app with in-app purchase instead. GET /me says whether it is offered: billing.web_checkout_link.

number_blocked Number blocked

Calls and texts to this number are blocked: it replied STOP, filed a complaint or was blocked by us. A STOP block is lifted only when the number's owner texts START; a complaint or manual block only by support. A number blocked because someone pressed 9 on a demo call is the exception: its owner can verify it with a code, which lifts it.

404 Not Found

not_found Not found

There is nothing at this path, or it belongs to another account. We answer the same way for both.

405 Method Not Allowed

method_not_allowed Method not allowed

This path exists but not for this HTTP method. The Allow header lists the methods it accepts.

Returned by the HTTP layer itself, before any request handler runs.

409 Conflict

occurrence_in_progress Call in progress

The call is ringing right now, so it cannot be changed or deleted. Cancel it first, or wait for it to finish.

occurrence_terminal Call already finished

The call has already finished (confirmed, missed, failed or cancelled), so this action no longer applies.

number_in_use Number in use

An enabled wake-up call still rings this number. Change or delete that call first.

idempotency_key_reused Idempotency key reused

This Idempotency-Key was already used with a different request. Send a new key for a new request; to retry safely, repeat the same request with the same key.

already_subscribed Already subscribed

The account already has a plan. Change or cancel it with POST /billing/portal instead of starting a new checkout.

429 Too Many Requests

verification_locked Verification locked

Too many wrong verification codes. Verification for this number is locked for a while; wait for Retry-After seconds.

rate_limited Too many requests

Too many requests. Wait for Retry-After seconds; the RateLimit-* headers show the limit and when it resets.

demo_rate_limited Too many demo calls

The demo call limit was reached for this number or network.

daily_cap_reached Daily call limit reached

The account has reached its limit of calls placed in a UTC day. The count starts again at midnight UTC; Retry-After says how many seconds that is.

500 Internal Server Error

internal_error Internal error

Something failed on our side that we did not plan for; we have been alerted. If the request was a change, it may not have been applied: read the resource again before retrying.

503 Service Unavailable

provider_unavailable Provider unavailable

Our telephony or payment provider is not answering (or payments are not set up yet). Nothing was sent, placed or charged; try again later.