Skip to content

API error codes

Every API error response carries a machine-readable code alongside the human-readable message:

json
{
  "error": {
    "message": "API key lacks required scope",
    "code": "SCOPE_DENIED"
  }
}

Branch on the HTTP status and the code — never on the message text, which can change without notice. This page catalogues every code the API currently emits. The "HTTP status" column shows the status(es) each code ships with; where a code appears with more than one, the first listed is the most common.

Authentication, keys, and scopes

These are the codes every integration must handle. The 401s mean your credential is the problem; the 403s mean the credential is fine but is not allowed to do what it tried.

CodeHTTP statusMeaning
AUTH_REQUIRED401No valid credentials supplied — missing, invalid, expired, or revoked bearer token
UNAUTHENTICATED401No authenticated user in context
UNAUTHORIZED401No organisation context — the credential is not tied to a tenant
AUTH_FAILED401Login failed — wrong username or password
AUTH_INVALID401The supplied registration or auth token is invalid or expired
AUTH_DISABLED401The account is disabled
AUTH_FORBIDDEN403Authenticated, but this credential type may not perform the action
SESSION_EXPIRED401Session expired
ACCOUNT_LOCKED423Account temporarily locked due to too many failed login attempts
MFA_TOKEN_INVALID401Invalid or expired MFA token
INVALID_CODE400/401The supplied one-time/TOTP or invite code is invalid
CHALLENGE_REQUIRED428Additional verification required
SCOPE_DENIED403The API key's scopes do not cover this operation — add the required scope or use a broader key
API_KEY_FORBIDDEN403This endpoint cannot be called with an API key at all (session-only, e.g. key management itself)
FORBIDDEN403Authenticated, but your role or the resource ownership does not allow this
ACCESS_DENIED403Remote-access request was denied by policy or by the end user
PLATFORM_ADMIN_REQUIRED403Platform admin required
RATE_LIMITED429Too many requests — honour Retry-After and back off

In practice: a 401 means re-check the key itself (see API → Authentication); a 403 with SCOPE_DENIED means the key needs an extra scope; API_KEY_FORBIDDEN means the endpoint is deliberately closed to API keys regardless of scopes; 429 with RATE_LIMITED means back off and honour Retry-After.

All other codes

Bad request (400)

The request itself is wrong — fix the payload before retrying.

CodeHTTP statusMeaning
ADDRESS_INCOMPLETE400A postal address is missing required fields
AGENT_MISMATCH400Agent does not belong to endpoint's client
AGENT_NOT_FOUND400Agent not found in this org
AI_NOT_CONFIGURED400AI features are not configured for this organisation
ALL_EXCLUDED400Every targeted item was excluded by current rules; nothing to act on
BAD_ID400An identifier in the URL is malformed
BAD_JSON400The request body is not valid JSON
BAD_PERIOD400Invalid period — must be monthly or annual
BAD_REQUEST400The request is malformed — check body, parameters, and types
BAD_TIER400Invalid tier — must be ease_in or crack_on
BETA_CODE_UNKNOWN400Invite code not recognised
BITDEFENDER_NOT_PROVISIONED400Client has not been provisioned in Bitdefender yet
BITDEFENDER_NOT_READY400The Bitdefender company is not ready for this operation yet
BITDEFENDER_NO_INSTALLERS400No installer URLs cached for this client
BITDEFENDER_PLATFORM_UNSUPPORTED400Bitdefender does not support this device platform
BOT_CHECK_FAILED400Verification failed, please refresh and try again
CLIENT_NOT_ENABLED400Threatdown is not enabled for this client
CLIENT_NOT_MATCHED400Client is not matched to a OneView site yet
COMMAND_ERROR400The command payload is invalid
COUNTER_NOT_FORWARD400Next_ticket_number must be greater than the current next number; the counter only moves forward
CRITERIA_INVALID400Smart-group criteria failed validation
DECODE_FAILED400Image decode failed
ENDPOINT_NO_CLIENT400Endpoint has no client to scope link
FILE_ERROR400The uploaded file could not be read or processed
GATEWAY_REJECTED400Mail gateway rejected the domain
INVALID_ACTION400Invalid action
INVALID_ASSIGNMENT400A referenced template or assignment target does not exist in this tenant
INVALID_BODY400The request body failed validation
INVALID_COMPANY_NUMBER400Company_number must be 6 to 10 alphanumeric characters
INVALID_DATE400Effective_from must be YYYY-MM-DD
INVALID_EMAIL400Reply_to is not a valid email address
INVALID_HEX400Accent_color must be #RRGGBB
INVALID_ID400An ID in the path or body is not a valid UUID/identifier
INVALID_INPUT400A request parameter failed validation
INVALID_JSON_BODY400Invalid JSON body
INVALID_KIND400Kind must be one of: cpu, memory, disk
INVALID_LOCALE400The requested locale is not supported
INVALID_MIME_TYPE400Mime_type must be image/*
INVALID_PARAM400A query or body parameter is invalid
INVALID_PASSWORD400Current password is incorrect
INVALID_PERIOD400Supply_period_start and supply_period_end must be set together
INVALID_PID400Invalid process ID
INVALID_PROVIDER400Provider ID mismatch
INVALID_QUERY400A query parameter failed validation
INVALID_RATE400Rate_bps must be between 0 and 10000
INVALID_REFERENCE400A referenced record (client, site, contact, user, category…) does not exist in this org
INVALID_REQUEST400Missing state or code
INVALID_STATE400/409The resource is not in a state that allows this operation
INVALID_TICKET_ID400Invalid ticket_id
INVALID_TIER400Invalid new_tier — must be ease_in or crack_on
INVALID_VERSION400Version must be a positive integer
INVOICE_CURRENCY_UNSUPPORTED400The invoice currency is not supported by the configured accounting provider
INVOICE_NOT_DRAFT400Invoice is no longer a draft; metadata is frozen on issue
INVOICE_NOT_ISSUED400Drafts use the live preview at GET /pdf; regenerate only applies after issue
MFA_NOT_ENABLED400MFA is not enabled
MFA_NOT_SETUP400MFA setup not initiated; call POST /mfa/setup first
MISSING_FIELDS400Company_name, firstname, lastname, email are required
MISSING_FILE400Missing 'file' form field
MISSING_IDENTIFIER400Identifier required
MISSING_JOB_ID400Missing job ID
MISSING_NUMBER400Number query parameter is required
MISSING_TOKEN400Missing token
NO_AGENT400Device has no associated agent for proxy polling
NO_CUSTOMER400No Stripe customer on file for this organisation
NO_SENDER400Ticket has no sender address to block
NO_TOKEN400Token required
OIDC_DISCOVERY_FAILED400OIDC discovery against the SSO provider failed
PLATFORM_UNSUPPORTED400Agent-side install is supported on Windows only
QUERY_ERROR400The query could not be executed as written
READ_FAILED400Failed to read upload
REGISTRY_ERROR400The registry query payload is invalid
SCAN_ERROR400The scan request is invalid
SIGNING_KEY_MISSING400No signing key configured; generate one first via POST /api/v1/settings/signing-key
SMTP_NOT_CONFIGURED400SMTP not configured, save SMTP settings first
SNIPPET_ERROR400The script snippet payload is invalid
TD_NOT_CONFIGURED400Threatdown credentials not configured
TD_NO_ACCOUNT400No account ID for this endpoint
TD_TOKEN_MISSING400OneView site no longer exposes an installer token for this client; re-match the site
TEMPLATE_ERROR400The template payload is invalid
TEMPLATE_PARSE_ERROR400The template failed to parse
UNSUPPORTED_MIME400Unsupported image type (allowed: png, jpeg, gif)
UPLOAD_TOO_LARGE400Upload too large or malformed multipart body
USE_TRANSITION_ENDPOINT400Status changes must use POST /{id}/transition
VALIDATION_ERROR400/422One or more fields failed validation — the message names the field
VAT_CODE_REQUIRED400Default VAT code is required to enable VAT
VAT_LINES_MISSING_CODE400One or more invoice lines are missing a VAT code
VAT_NUMBER_REQUIRED400VAT registration number is required to enable VAT
WEAK_PASSWORD400Password must be at least 12 characters

Unauthorised (401) — token lifecycle

Token-specific failures beyond the core list above: agent registration tokens, signup and reset links.

CodeHTTP statusMeaning
DEVICE_MISMATCH401Open link on signup device
INVALID_TOKEN401/400The supplied link token is invalid or expired
TOKEN_EXHAUSTED401Registration token has been used the maximum number of times — generate a new token from the portal
TOKEN_EXPIRED401Registration token has expired — generate a new token from the portal
TOKEN_INVALID401/410Registration token not recognised — check the token value

Payment required (402)

Subscription or billing state blocks the action.

CodeHTTP statusMeaning
BILLING_REQUIRED402Billing required
DUNNING_SUSPENDED402Account suspended
TRIAL_EXPIRED402Trial expired

Forbidden (403)

Permission, policy, and feature gates beyond the core auth/scope checks above.

CodeHTTP statusMeaning
FEATURE_DISABLED403Feature_disabled
OWNERSHIP_NOT_VERIFIED403Publish the ownership TXT record and verify before provisioning this domain
READONLY_CONTACT403Contact is managed by CIPP and cannot be deleted
READONLY_FIELD403Full_name is managed by CIPP
RUSTDESK_DISABLED403RustDesk remote access is disabled for this agent
SELF_REVIEW_FORBIDDEN403You cannot approve your own timesheet
SIGNUPS_PAUSED403OpsMerge is in closed beta — apply at https://opsmerge.cloud/beta
SSO_DOMAIN_NOT_ALLOWED403Email domain is not permitted for auto-provisioning with this SSO provider
TIER_REQUIRED403Subscription tier required

Not found (404)

The target does not exist, is outside your tenant, or the feature is not set up.

CodeHTTP statusMeaning
BITDEFENDER_NOT_CONNECTED404Bitdefender not connected
CHALLENGE_NOT_FOUND404No challenge issued for this domain; call /challenge first
CH_NOT_FOUND404Companies House: company not found
CLIENT_NOT_FOUND404Client not found
INVOICE_NOT_FOUND404Invoice no longer exists
NOT_CONNECTED404/409The integration is not connected
NOT_FOUND404The resource does not exist (or is outside your tenant)
RUSTDESK_NOT_CONFIGURED404RustDesk not configured on this agent
TD_NOT_LINKED404No Threatdown endpoint linked to this agent
TOKEN_NOT_FOUND404This quote link is no longer valid
UPDATES_PAUSED404Agent updates are temporarily paused
VERSION_NOT_FOUND404No installer stub has been published

Conflict (409)

The request is valid but the current state of the data refuses it.

CodeHTTP statusMeaning
AGENT_CROSS_TENANT409This device is already registered with another tenant; uninstall from the source tenant before reinstalling, or contact [email protected] for cross-tenant release
AGENT_OFFLINE409Agent is offline — log level change requires a live connection
ALREADY_BLOCKED409This sender is already on the blocklist
ALREADY_CLOSED409Ticket is already closed
ALREADY_CONNECTED409Provider is already connected
ALREADY_MAPPED409That local record is already linked to a different FreeAgent record. Unlink it (or pick another target) before mapping
ALREADY_MERGED409Source ticket has already been merged
BITDEFENDER_DISABLED_FOR_CLIENT409Bitdefender is not enabled for this client
CALENDAR_IN_USE409Calendar still referenced by plans
CATEGORY_IN_USE409Category still referenced by tickets
CATEGORY_NAME_COLLISION409A category with that name already exists at this level
CHAT_ACTIVE409A chat is already in progress on this device
CHAT_NOT_ACTIVE409Chat session is not active
CHAT_TERMINAL409Chat session is already closed
CLIENT_IN_USE409This client is in use and cannot be deleted. Archive it instead to retain the audit trail
CONFLICT409The request conflicts with the current state of the resource
DELETE_CURRENT409Cannot delete the current version; upload a replacement first
DEPTH_EXCEEDED409Category depth exceeds 3-level limit
DOMAIN_ALREADY_CLAIMED409This domain is already registered with another tenant
DOMAIN_CONFLICT409Mail gateway already has a domain registered for this tenant; contact support to reclaim it
DOMAIN_DESYNC409The mail gateway no longer has this domain registered; click Remove and add it again to resync
DUPLICATE409A record with the same unique value already exists
DUPLICATE_NAME409Site name already exists under this client
DUPLICATE_SLUG409Organization slug already exists
DUPLICATE_TIME_ENTRIES_LINE409Activating this contract would duplicate an active time & materials line (same client and service) already billed by another active contract; deactivate the duplicate line first
DUPLICATE_USERNAME409Username already exists
EMAIL_PENDING409Email has pending signup
ENDPOINT_SECURITY_CONFLICT409Disable Threatdown for this client before enabling Bitdefender
GROUP_IN_USE409This group is the target of an automated task; delete or retarget it first
GROUP_OVERSIZE409This smart group is too large to target (over 50,000 members); narrow its criteria first
INVALID_TRANSITION409/400The requested status transition is not allowed from the current status
MFA_ALREADY_ENABLED409MFA is already enabled
NOT_LOST409Device is not in lost mode
NOT_TRIAGE409Ticket is not in the triage queue
NO_PENDING_CHANGE409No pending tier change to cancel
NO_PENDING_SIGNUP409No pending signup to complete
NO_SUBSCRIPTION409No billable subscription
OAUTH_INVALIDATED409The FreeAgent connection was disconnected during this OAuth flow; please start a new connection
OFF_FLEET409Device has left the fleet and cannot be reported lost
PORTAL_LINK_CONFLICT409Email already in use by another contact or organisation
PROVIDER_CONFLICT409The operation conflicts with the connected accounting provider state
RECONNECT_REQUIRED409FreeAgent connection needs reconnecting
ROLE_IN_USE409Cannot delete role with assigned users
SAME_TIER409Already on this tier
SERVICE_IN_USE409This service is in use and cannot be deleted. Archive it instead to retain the audit trail
SIGNING_KEY_EXISTS409Signing key already exists for this organization; delete it first to regenerate
SITE_HAS_AGENTS409Cannot delete site with assigned agents
SLUG_TAKEN409Slug already taken
STALE_FLOW409A newer FreeAgent connection already completed for this organisation; this older flow will not overwrite it
TD_SUBSCRIPTION_EXISTS409Site already has a subscription — use the Update Subscription action instead
TELECOM_USAGE_NOT_SYNCED409Telecom usage has not been synced for the billing period yet
TICKET_HAS_BILLED_TIME409Ticket has invoiced time; void the invoice first
TIMERS_ACTIVE409Ticket has active timers
USERNAME_TAKEN409An account with this email address already exists; sign in instead, or use a different email
VERSION_CONFLICT409Ticket was modified by another update; reload and retry

Gone (410)

The resource or link existed but is no longer usable.

CodeHTTP statusMeaning
BETA_CODE_EXPIRED410Invite code has expired
BETA_CODE_REDEEMED410Invite code has already been used
EXPIRED410Survey expired
GONE410The resource existed but has been deleted or has expired
INVOICE_NOT_SENDABLE410This invoice is no longer in a sendable state

Precondition failed (412)

A prerequisite (configuration, region, companion component) is missing.

CodeHTTP statusMeaning
AI_KEY_INVALID412AI API key could not be decrypted; admin must re-enter it
AI_KEY_MISSING412AI API key not configured for this organisation
COMPANIES_HOUSE_NOT_AVAILABLE_FOR_REGION412Companies House lookup is only available for GB-registered tenants
REQ_AUTH_NO_TRAY412Require Auth is enabled but the tray is not installed on this endpoint; enable the tray at the matching scope first
VAT_NOT_AVAILABLE_FOR_REGION412VAT configuration is only available for UK-registered tenants

Payload too large (413)

The upload or request body exceeds a size limit.

CodeHTTP statusMeaning
ATTACHMENT_TOO_LARGE413Attachment too large or malformed multipart
FILE_TOO_LARGE413Size_bytes exceeds limit
PAYLOAD_TOO_LARGE413Bug report payload is too large (5 MB image cap)
QUOTA_EXCEEDED413Storage quota exceeded

Unsupported media type (415)

The file type is not allowed.

CodeHTTP statusMeaning
MIME_NOT_ALLOWED415Mime_type not allowed

Unprocessable (422)

Understood, but the operation cannot be applied to this entity.

CodeHTTP statusMeaning
AGENT_ERROR422The agent reported an error executing the request
BUILTIN_TEMPLATE422Cannot delete built-in compliance template
CONFIRM_MISMATCH422Confirm_enterprise_id does not match
CONFIRM_REQUIRED422This command is destructive and requires confirm=true
FORECAST_UNAVAILABLE422Forecast unavailable
INVOICE_HAS_PAYMENTS422The invoice has recorded payments and cannot be modified this way
NO_FILE422Document has no file
OBJECT_NOT_FOUND422Object not found in storage
PRORATION_ERROR422Subscription proration could not be calculated
QBO_LINE_MAPPING_REQUIRED422Some quote lines have no catalogue mapping. The customer invoice raised on accept would fail to push to QuickBooks. Attach a service or product to each line marked below, then send
SYSTEM_READONLY422System groups are read-only; clone to customise
VALIDATION422The request failed validation

Too many requests (429)

Throttled — wait and retry. Honour Retry-After when present.

CodeHTTP statusMeaning
CH_RATE_LIMIT429Companies House rate limit hit, try again shortly
REFRESH_RATE_LIMITED429Please wait before requesting another email; if you need it sooner, contact your supplier directly
RESEND_MAX429Maximum number of resends reached
RESEND_THROTTLED429Resend requested too soon — wait before retrying
SEND_COOLDOWN429Quote was sent moments ago — please wait 30 seconds before resending
SESSION_LIMIT429Concurrent remote session limit reached

Server and upstream errors (5xx)

Our side or a downstream service failed. These are retriable; report persistent ones.

CodeHTTP statusMeaning
AGENT_REJECTED502The agent rejected the command
AGENT_TIMEOUT504The agent did not respond in time — it may be offline or busy
AGENT_UNREACHABLE503Cannot reach agent to request approval
AI_UPSTREAM_ERROR502AI upstream error
AUDIT_WRITE_FAILED500Failed to record audit log
BITDEFENDER_PROVISION_FAILED502Bitdefender provisioning failed
BITDEFENDER_RECON_FAILED502Bitdefender reconcile failed
BOT_CHECK_UNAVAILABLE503Verification is temporarily unavailable, please try again
BUGREPORT_DISABLED503Bug reporting is not configured
BUGREPORT_FORWARD_FAILED502Failed to file bug report
CH_UPSTREAM_ERROR502Companies House request failed
CIPP_ERROR502The CIPP (Microsoft 365) integration returned an error
COMPANIES_HOUSE_KEY_INVALID503Companies House rejected the API key
COMPANIES_HOUSE_NOT_CONFIGURED503Companies House lookup is not configured on this server
CONFIG_ERROR500Server-side configuration is missing or invalid
CRYPTO_ERROR500A server-side cryptographic operation failed
DB_ERROR500A database operation failed — retry, and report if it persists
DECODE_ERROR502Failed to decode metric payload
DECRYPT_FAILED500Failed to decrypt keys
DISPATCH_FAILED502The downstream provider rejected the dispatch
ENCODE_FAILED500Image encode failed
GATEWAY_DISABLED503Email gateway not configured
GATEWAY_ERROR502The mail gateway returned an error
GENERATION_ERROR500Server-side document or content generation failed
GENERATION_FAILED500Invoice generation failed
INSTALL_FAILED502Remote agent install failed
INTERNAL500Unexpected server-side failure
INTERNAL_ERROR500/503Unexpected server-side failure — retry, and report if it persists
MAIL_UNAVAILABLE503Mail not configured for this deployment
MSP360_LOGIN_FAILED502Msp360 login failed (check credentials and base_url)
MSP360_SYNC_FAILED502MSP360 backup sync failed
NATS_PUBLISH_FAILED502Failed to publish command
NATS_RELOAD_FAILED503Could not reload NATS; password rotation aborted
NATS_UNAVAILABLE503/500The internal message bus is unavailable — agent commands cannot be delivered right now
NOT_CONFIGURED503/404/412/400The feature or integration is not configured for this server or organisation
NOT_IMPLEMENTED501Apple MDM is not available yet
OIDC_ERROR500/400The SSO (OIDC) flow failed
PARSE_FAILED500Failed to parse keys
PRICE_NOT_CONFIGURED503Pricing not configured for this plan/period
PROVIDER_ERROR502The downstream provider returned an error
PROVIDER_UNAVAILABLE503Billing provider unavailable
RENDER_ERROR500Markdown rendering failed
RENDER_FAILED500Could not render invoice; please contact your supplier
SEND_FAILED502Email send failed; please try again shortly
SIGNING_INVALID_KEY500Signing master key must be 64 hex characters (32 bytes)
SIGNING_NOT_CONFIGURED500Signing master key not configured (set RMM_SIGNING_MASTER_KEY)
SMTP_TEST_FAILED502SMTP test failed
STORAGE_ERROR500B2 upload failed
STORAGE_UNAVAILABLE503Storage not configured
STORAGE_UNCONFIGURED503Attachment storage not configured
STRIPE_ERROR502Stripe returned an error
SYNC_ERROR500Synchronisation with the provider failed
SYNC_UNAVAILABLE503FreeAgent sync not wired in this build
TD_API_ERROR502The ThreatDown OneView API returned an error
TD_AUTH_ERROR502Authentication with ThreatDown OneView failed
TD_CREATE_ERROR502Creating the ThreatDown OneView site failed
TD_SCAN_ERROR502Triggering the ThreatDown scan failed
TENANT_LOOKUP_FAILED503Could not resolve tenant region
TEST_FAILED502The integration test call failed
TRIGGER_ERROR500Manually triggering the job failed
UPSTREAM_ERROR502An upstream service call failed
  • API — authentication, scopes, rate limits, conventions
  • API changelog — what changed and when

OpsMerge is a product of Brindleford Technologies Ltd, company number 16871436, registered in England and Wales.