Error codes

API errors use RFC 9457 application/problem+json. The value for programs is in code.

{
  "type": "https://www.blipdrop.net/nodd/en/docs/errors/#open_actions_exceeded",
  "title": "The limit of open requests has been reached",
  "status": 409,
  "code": "open_actions_exceeded"
}

invalid_key

HTTP 401 ・ The key could not be verified

The key is missing, malformed, revoked, expired, the wrong type, or its workspace is closed. The response does not say which.

What to do: Check the Authorization: Bearer value. Read keys cannot send, and send keys cannot read GET /v1/actions/events. If in doubt, reissue the key in the app.

key_revoked

HTTP 401 ・ (not returned at present)

This value is listed in the API specification, but the current server does not return it. A revoked key gets invalid_key.

What to do: Handle it like invalid_key.

invalid_session

HTTP 401 ・ Sign in again

The app session has ended or the Apple sign-in could not be verified. Returned by the app API.

What to do: Sign in again in the app. The send key API does not return this.

plan_required

HTTP 402 ・ A plan change is required

The request goes beyond the plan. detail gives the reason: multiple approvers or escalation on Free, an Open channel on Free, the channel or member limit, a second free workspace, or another Apple ID already using the free plan on this device.

What to do: Read detail, then move to Team or drop the option.

forbidden

HTTP 403 ・ You cannot do this

You lack the permission: a Viewer responded, someone who is not a Manager managed keys, or a send went to a closed channel.

What to do: Check the roles described in the Manual.

channel_paused

HTTP 403 ・ has Retry-After ・ The channel is paused

A channel took more than 60 requests in a minute, so it is paused for 5 minutes. The channel gets one notice when this happens.

What to do: Wait for Retry-After seconds. It resumes by itself. Check that the sender is not looping.

channel_read_only

HTTP 403 ・ This channel is over your plan's limit

The plan went down and the channel count is over the limit, so sending stops on the newest channels first. Receiving and responding continue.

What to do: Return to Team, or close channels to get within the limit.

invalid_signature

HTTP 403 ・ The signature could not be verified

A device signature could not be verified. This also covers an operation that needs Face ID without it. Returned by the app API.

What to do: Update the app and try again. If it continues, sign in again.

attestation_failed

HTTP 403 ・ This device could not be verified

App Attest failed when registering a device. Returned by the app API.

What to do: Use a physical iPhone with the app from the App Store.

not_found

HTTP 404 ・ Not found

The target does not exist or this key cannot see it. A message in another channel gives this code too.

What to do: Check the ID and which channel the key belongs to.

open_actions_exceeded

HTTP 409 ・ The limit of open requests has been reached

Open requests reached the plan limit (3 on Free, 500 on Team). The message is refused rather than delivered without buttons.

What to do: Wait for responses, or withdraw requests with POST /v1/messages/{id}/cancel.

already_claimed

HTTP 409 ・ This has already been answered

Another response was recorded first. For a cancel, the message was already answered.

What to do: Read the result with GET /v1/messages/{id}.

invalid_state

HTTP 409 ・ Varies by case

The operation is not possible in the current state. title gives the reason: updating finished progress, updating something other than progress, reporting a result too early, approving twice, reissuing a revoked key, or deleting an Owner account while others remain.

What to do: Read title, check the state, then try again.

action_expired

HTTP 410 ・ The response deadline has passed

The device signed after the response deadline, or the response arrived more than 10 minutes after it.

What to do: Send it again. Never treat no response as approval.

payload_too_large

HTTP 413 ・ The payload is too large

The body is over 16 KB for POST /v1/messages and PATCH, or over 256 KB for inbound URLs.

What to do: Shorten the body. Field limits are in the API reference.

validation_failed

HTTP 422 ・ The request is invalid

A value does not match the specification. Unknown fields are refused too. detail gives the reason.

What to do: Read detail and fix the request.

unsupported_level

HTTP 422 ・ (not returned at present)

This value is listed in the API specification, but the current server does not return it. An unknown level such as critical gets validation_failed.

What to do: Use low, normal, or high.

callback_unverified

HTTP 422 ・ URL ownership could not be verified

When registering a callback, the URL did not return challenge. This appears in the app.

What to do: Return the value in a 2xx body as described in Registering a URL.

rate_limited

HTTP 429 ・ has Retry-After ・ Too many requests

One key made more than 10 requests in 10 seconds. Polling one message has its own window of the same size.

What to do: Wait for Retry-After seconds.

monthly_limit

HTTP 429 ・ has Retry-After ・ The monthly message limit has been reached

The monthly limit is reached. Only high can go on, up to 10% over the limit.

What to do: Retry-After is the time until the first of next month (UTC). Retrying will not help, so wait or move to Team.

internal

HTTP 500 ・ The request could not be processed

The server failed internally.

What to do: Wait and retry. With Idempotency-Key a retry does not send twice. If it continues, email support@blipdrop.net with the time.

not_implemented

HTTP 501 ・ Not implemented

The app API has no such operation.

What to do: Check the URL and method, and update the app.

maintenance

HTTP 503 ・ has Retry-After ・ The service is not accepting requests right now

The service mode is read_only or intake_stopped. intake_stopped stops only new messages, so cancels and resolves still work.

What to do: Wait for Retry-After (300 seconds). GET /v1/meta shows the mode.

overloaded

HTTP 503 ・ has Retry-After ・ The service is busy

The server is too busy to accept the request.

What to do: Retry after Retry-After (30 seconds).