API v2 problem types

Every v2 failure answers RFC 9457 application/problem+json carrying a stable code. Branch on code, never on the prose. Each row below is the page a document's type URI resolves to.

CodeStatusMeaning
contact_already_confirmed409This contact is already confirmed.
contact_type_not_creatable422Contacts of this type can no longer be created.
credential_write_only422The read sentinel cannot be sent as a credential value.
duplicate_contact409A contact with this type, address, gateway and alert delay already exists.
duplicate_monitor409A monitor with this url and type already exists on this account.
duplicate_resource409A resource with this key already exists on this account.
filter_required422This operation refuses to run without an explicit filter.
idempotency_key_conflict409This idempotency key is already in use for a different request.
idempotency_key_required400This operation requires an Idempotency-Key header.
insufficient_agents422Not enough monitoring locations match the requested selection.
insufficient_balance402The account balance is too low to deliver this message.
insufficient_rights403The subaccount does not hold the rights this operation requires.
internal_error500The request failed because of an unexpected server error.
interval_below_type_floor422The requested check interval is below this monitor type's floor.
invalid_alert_delay422The requested alert delay is not one of the supported values.
invalid_confirmation_code422The confirmation code is not valid.
invalid_cursor422The pagination cursor is not valid.
invalid_interval422The requested check interval is not allowed for this account.
invalid_limit422The requested page size is outside the allowed range.
invalid_range422The requested time range is not valid.
invalid_settings422A value inside settings is not valid for this monitor type.
invalid_token401The access token is missing, malformed or expired.
invalid_url422The url is not usable for this check.
ip_not_allowed403The caller's IP address is not on this token's allow-list.
job_not_cancellable409This job has already reached a terminal state.
job_not_resumable409This job cannot be resumed.
malformed_request400The request could not be parsed.
method_not_allowed405This method is not allowed on this resource.
missing_scope403The token does not carry the scope this operation requires.
monitor_type_discontinued422This monitor type is discontinued.
not_found404The requested resource does not exist.
package_interval_conflict403No check interval satisfies both this monitor type and the account's plan.
package_limit403The account's package does not allow this operation.
payload_too_large413The request payload is larger than this endpoint accepts.
quota_exceeded429The account's API quota for this scope is exhausted.
rate_limited429Too many requests - slow down.
selection_mismatch409The selection changed since it was reported.
service_unavailable503The service is temporarily unavailable.
too_many_items422The request carries more items than this operation accepts.
type_immutable422This resource's type cannot be changed after creation.
unknown_contact_ref422A subscription references a contact ref that no contacts[] item declares.
unknown_enum_value422The value is not one this field accepts.
unknown_event_type422The webhook declares an event type outside the published catalogue.
unknown_expand422The request asked to expand a value this endpoint does not offer.
unknown_field422The request asked for a field this row does not publish.
unknown_parameter422The request carries a query parameter this endpoint does not define.
unknown_pool422The requested agent pool does not exist.
unsupported_media_type415The request's media type is not one this endpoint reads.
unsupported_report_channel422Reports cannot be delivered to a contact of this type.
upstream_error502A service this request depends on failed.
url_blacklisted403This url is not accepted for monitoring.
validation_failed422The request body or query is not valid.

52 registered types. A code that is not on this list can never reach the wire.