Errors

The problem format the Developer API answers with, and every code it can return, with its status and what to do about it.

Errors are RFC 9457 problem responses, sent as application/problem+json. Read code, which is stable. title and detail are for people and can change.

{
  "type": "https://usehalo.net/problems/insufficient_scope",
  "title": "Forbidden",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "This key's scopes don't include data.query.",
  "requestId": "4f1c2a90-…"
}
FieldMeans
typehttps://usehalo.net/problems/{code}. It identifies the problem, and isn't a page to open
titleThe HTTP status in words
statusThe HTTP status
codeThe stable, machine-readable code
detailWhat went wrong this time, in a sentence. With several problems, the first of errors
requestIdThe request's id, also in the X-Request-Id header. Quote it to Halo
errorsWith validation_failed, bad_request and unsupported_media_type: each problem's location, message and value
signInMethodsWith sign_in_method_required: the methods the organization allows
featureWith plan_feature_unavailable: the product the plan doesn't include
trashWith in_trash: the item's kind, id, name and canRestore

You can send your own X-Request-Id, of 8 to 64 letters, digits, dots, underscores or hyphens. Halo keeps it, and otherwise makes one.

Every code

The request

CodeStatusMeansWhat to do
key_in_query400A key was in the query string, as access_token, api_key, apikey, key or tokenSend it in the Authorization header. Roll the key if the URL may have been logged
bad_request400The body isn't JSON, or a POST has no bodySend a JSON object
request_entity_too_large413The body is over 1 MiBSend fewer filter values
unsupported_media_type415The body's Content-Type isn't one Halo readsSend Content-Type: application/json
validation_failed422The request doesn't fit the API's shape: an unknown body field, a limit over 1,000, an id that isn't a UUID, an unknown op or aggregateRead errors, and see Query data

These are checked before the key is, so they aren't in the request log and don't use up your limits.

The key and the person

CodeStatusMeansWhat to do
invalid_api_key401The key is missing, unknown, expired or revoked. The answer doesn't say which, and carries WWW-Authenticate: Bearer error="invalid_token"Check it's being sent, then see what stops a key. Don't retry with the same key
insufficient_scope403The key's scopes don't include what this operation needsMake a key with that scope
forbidden403The person's role doesn't allow this: it lacks api.use or content.view, has no role in Halo CMS or Halo CRM for their routes, or asks for a draft without edit accessAsk an Admin about the role, or read the published version
api_disabled403The Developer API is off for the organization, as it is until an Owner or Admin turns it onAn Owner or Admin can turn it on in Settings, under API access
api_stopped503Halo has stopped the Developer API for now, for this organization or everyoneKeep your keys, and try again after Retry-After. Contact Halo if it goes on
playground_key403A playground key was used away from the portal's pagesMake an API key
org_suspended403The organization is suspendedIts Owners were emailed, and can still use Contact Halo in Halo Data
member_suspended403The person's membership is suspended. Suspending also revokes their keys, so you'll usually see invalid_api_key insteadAsk one of its Admins
mfa_enrollment_required403The organization requires two-factor, and the person hasn't set it upSet it up, then make a new key, since that revokes the old one
sign_in_method_required403The organization no longer allows how the person signed in when they made the keySign in a way signInMethods lists, and make a new key

What you asked for

CodeStatusMeansWhat to do
export_not_allowed403Reading rows through the API counts as exporting, and the role doesn't allow itAsk an Admin for a role with data.export
marketplace_data_not_available403The dataset is Marketplace data. Its fields can be read, and its rows only in HaloUse it in Halo, or query your own data
plan_feature_unavailable403The organization's plan doesn't include Halo CMS or Halo CRM, which websites, listings and businesses read from. feature says which: cms or crmContact Halo about the plan
not_found404It doesn't exist, or the person doesn't have accessCheck the id. The answer never says which
report_not_published409The report has no published versionPublish it, or ask for version=draft with edit access
in_trash410The item, or the connection a dataset reads, is in the TrashRestore it if trash.canRestore says you can, or ask someone who can
hidden_field422The query names a field hidden in this datasetUse a field the dataset's description lists
invalid_query422The query doesn't fit the dataset, such as an unknown field, a sort on a field that isn't in the query, or an unknown time zone. detail says whichFix the query

Limits and the source

CodeStatusMeansWhat to do
rate_limited429Too many requests from the key, the person or the address, or too many running at once. Carries Retry-After: 60Wait, then retry. See Rate limits
row_budget_exceeded429The person's keys have read today's rows. Carries Retry-After: 3600Aggregate more, or resume later. See the budget
query_busy429The organization is running as many queries as it canRetry in a moment, with backoff
internal500Something went wrong in HaloRetry a little later. Quote requestId if it keeps happening
source_error502The source couldn't run the query. detail holds the source's words only for people who can view connectionsRetry later, or aggregate or filter differently
request_timeout503A request that isn't a query ran out of timeRetry with backoff
query_timeout504The source took too longNarrow the date range or filters. Retrying the same query rarely helps

Which to retry

RetryCodes
After Retry-Afterrate_limited, api_stopped
With backoff, a few timesquery_busy, source_error, request_timeout, internal
Later, or not at allrow_budget_exceeded, query_timeout
Never as they areEverything else: they need a change to the request, the key or the person's access

Snippets has this as code.

When managing keys

These come from the portal's key routes, which take a signed-in session rather than a key. You'll see them there, not from your own code.

CodeStatusMeansWhat to do
step_up_required401The session didn't finish two-factorSign in again, finishing two-factor
view_only403Halo staff are viewing as someoneKeys can't be made in this mode
api_disabled403The Developer API is off for the organization, as it is until an Owner or Admin turns it onAn Owner or Admin can turn it on in Settings, under API access
forbidden403The role lacks api.use, or the change needs org.manageAsk an Admin
not_found404The key isn't there, or isn't yours to change, or has already endedCheck the key
sign_in_again403The session signed in more than 15 minutes agoSign in again, then make or roll the key. Playground keys and revoking don't need it
too_many_keys409The person has 25 live keys in the organizationRevoke one you no longer use
temporary_key409A playground key can't be rolledIt ends within the hour. Make another
key_replaced409This key was already rolledRoll the newer key, which has the same name
validation_failed422The name is empty, a scope is unknown, or the key would last over 365 daysRead detail, and errors for each problem
rate_limited429More than 30 keys made or rolled in an hour, or more than 20 playground keys in an hourWait a while, and try again

The MCP server has its own error format: see The MCP protocol.