Skip to content

Errors

We use normal HTTP status codes. Read the status first, and then the body.

Status codes on the API routes

Status What it means What to do
400 A parameter, header or body is not valid Fix the request
401 The key is missing or not valid Check the key. See A good key that gets a 401.
403 Your integration does not have this route, filter or sort Ask your contact
404 The venue is not available to your key Check the id
409 The request conflicts with the current state. See the code. See Safe retries
413 The body is too large Send a smaller batch
429 You went over a limit See Rate limits
500 Something went wrong on our side Try again later, and tell us with the X-Request-Id
503 A service we need is down for a moment Try again with a wait

What an error looks like

Most errors look like this. message can be one text or a list of texts.

{
  "statusCode": 400,
  "message": "skip cannot be used with cursor pagination",
  "error": "Bad Request"
}

The import routes add a stable code, and an errors list for validation problems. In errors, the entries of your request are counted from 0.

{
  "statusCode": 400,
  "code": "CONCIERGE_ENTRY_IMPORT_VALIDATION_FAILED",
  "message": "Concierge entry import validation failed.",
  "errors": [
    {
      "path": "[1].phoneNumber",
      "code": "MATCHES",
      "message": "phoneNumber must use canonical E.164 format."
    }
  ]
}

Use code when it is there. The text in message can change.

Status codes on the venue routes

The venue routes answer 400 for a bad key, not 401.

Status Body What it means
400 "Token is required" No token header
400 "Invalid token" or "Unable to validate token" The key is not valid
400 "Venue ID is required" This route needs a venue key, and you sent a publisher key
400 ["lastSyncedAt must be a string"] lastSyncedAt is missing
400 ["Invalid Date"] lastSyncedAt is not in the right format
400 ["lastSyncedAt must not be older than 15 days"] Your checkpoint is too old. See Keep your data in sync.

Request ids

Every answer from /external/v1 has an X-Request-Id header. You can send your own value in that header (letters, numbers, dots, dashes and underscores, up to 128 characters) and we use it. Include it when you report a problem.

Errors on orders, reservations and guests

These three routes answer every error in one shape:

{
  "error": {
    "type": "not_found",
    "code": "venue_not_found",
    "message": "A venue in venueIds does not exist or is not available to this key.",
    "param": "venueIds",
    "requestId": "6f1c..."
  }
}

Match on code. message is for people and can change. param names the parameter when the error is about one. A database or Redis problem answers 503, also while we check your key, so a 401 always means the key itself. 429 and 503 come with a Retry-After header in seconds.

Status type code What to do
400 invalid_request validation_failed A parameter has a wrong value. See param.
400 invalid_request unknown_parameter This route does not take that parameter. Check the spelling.
400 invalid_request conflicting_filters Send updatedSince or createdSince, not both.
400 invalid_request invalid_cursor Send a nextCursor with the same filters it came with.
401 authentication_failed invalid_credential The key is missing, wrong or no longer active.
403 permission_denied not_provisioned The key does not have this route or field. Ask your Speakeasy contact.
404 not_found venue_not_found, order_not_found, reservation_not_found, guest_not_found It does not exist, or your key cannot read it.
429 rate_limited rate_limit_exceeded Wait for Retry-After seconds.
503 service_unavailable backend_unavailable Wait for Retry-After seconds and try again.
500 internal_error internal_error Something went wrong on our side. Send us the requestId.