{
  "version": 1,
  "problems": [
    {
      "code": "project_required",
      "type": "https://screenrig.ai/problems/project-required",
      "title": "Select a project",
      "status": 400,
      "hint": "Use ?project= with a project carried by this token, or the explicit /api/projects/{project_id}/ parent route."
    },
    {
      "code": "free_organization_limit",
      "type": "https://screenrig.ai/problems/free-organization-limit",
      "title": "Free organization limit reached",
      "status": 409,
      "hint": "Create the project in the free organization the person already holds (screenrig project create NAME --organization-id ID), or in an organization holding Premium or Enterprise."
    },
    {
      "code": "organization_plan_required",
      "type": "https://screenrig.ai/problems/organization-plan-required",
      "title": "The organization needs a plan before it admits screens",
      "status": 409,
      "hint": "Move the project into the free organization its person holds (screenrig project moves, then screenrig project move --organization-id ID), or attach Premium or Enterprise to this organization."
    },
    {
      "code": "project_name_conflict",
      "type": "https://screenrig.ai/problems/project-name-conflict",
      "title": "Project name already used in the organization",
      "status": 409,
      "hint": "Choose a different project name in this organization."
    },
    {
      "code": "project_delete_blocked",
      "type": "https://screenrig.ai/problems/project-delete-blocked",
      "title": "Project cannot be deleted in its current state",
      "status": 409,
      "hint": "End any plan the project still holds of its own, archive its screens, resolve wallet obligations and stop live advertising, then read the deletion preview again. Automatic cleanup also requires an empty Screens project."
    },
    {
      "code": "owner_required",
      "type": "https://screenrig.ai/problems/owner-required",
      "title": "A responsible person is required",
      "status": 409,
      "hint": "The agent's invitation or first connection approval establishes its responsible person. Its existing project remains usable."
    },
    {
      "code": "owner_cannot_leave",
      "type": "https://screenrig.ai/problems/owner-cannot-leave",
      "title": "The project owner cannot leave",
      "status": 409,
      "hint": "The project owner keeps their membership and cannot be removed. Transfer ownership to another member first, then leave."
    },
    {
      "code": "internal_error",
      "type": "https://screenrig.ai/problems/internal-error",
      "title": "Internal server error",
      "status": 500,
      "retryable": false,
      "action": "retry_backoff",
      "hint": "The server failed unexpectedly and the request may not have taken effect. Read the resource back before retrying, and report the request_id if the failure repeats."
    },
    {
      "code": "invalid_request",
      "type": "https://screenrig.ai/problems/invalid-request",
      "title": "Request is invalid",
      "status": 400,
      "action": "hold_lkg",
      "hint": "Correct the request using detail and errors[], which name the field or header that was rejected, then send it again. Do not retry it unchanged."
    },
    {
      "code": "unauthorized",
      "type": "https://screenrig.ai/problems/unauthorized",
      "title": "Authentication is required",
      "status": 401,
      "action": "remint",
      "hint": "The credential is missing, expired, or revoked, so retrying with it fails again. If a stored agent credential was rejected, sign this installation in again (screenrig login); enroll a new project only when the user asked for one."
    },
    {
      "code": "credential_retired",
      "type": "https://screenrig.ai/problems/credential-retired",
      "title": "Credential was retired",
      "status": 401,
      "hint": "This screenRIG credential was retired. Update the screenRIG plugin (or the screenrig CLI) to the latest version, then sign in again with screenrig login; a person approves it in the dashboard."
    },
    {
      "code": "client_update_required",
      "type": "https://screenrig.ai/problems/client-update-required",
      "title": "Update the screenRIG plugin or CLI",
      "status": 410,
      "hint": "This version of the screenRIG plugin or CLI uses a sign-in that was retired. Update the plugin (or the screenrig CLI) to the latest version, then run screenrig login."
    },
    {
      "code": "forbidden",
      "type": "https://screenrig.ai/problems/forbidden",
      "title": "Request is not allowed",
      "status": 403,
      "action": "hold_lkg",
      "hint": "This credential or project may not do this. Check what it may do (screenrig project capabilities), then use a permitted operation or sign the agent in again (screenrig login) and have a person approve the capability it needs."
    },
    {
      "code": "insufficient_access",
      "type": "https://screenrig.ai/problems/insufficient-access",
      "title": "This access level cannot do this",
      "status": 403,
      "hint": "Read only access changes nothing; Propose access uploads media, writes notes and proposes playlist and screen changes for review, but cannot delete, control screens or spend credit. Ask a person to approve Manage access (screenrig login --access manage), or leave the change to a credential that has it."
    },
    {
      "code": "approver_required",
      "type": "https://screenrig.ai/problems/approver-required",
      "title": "Only an approver can do this",
      "status": 403,
      "hint": "Approving reviews and granting Manage access need the project owner or a member who can approve. Ask the project owner to turn on Can approve for this person, or choose Read only or Propose."
    },
    {
      "code": "review_not_pending",
      "type": "https://screenrig.ai/problems/review-not-pending",
      "title": "The review is no longer pending",
      "status": 409,
      "hint": "Someone already decided, withdrew or replaced this review. Read it again (screenrig reviews show ID) for its current state."
    },
    {
      "code": "review_stale",
      "type": "https://screenrig.ai/problems/review-stale",
      "title": "The playlist changed after this proposal",
      "status": 409,
      "hint": "The live playlist moved on after the change was proposed, so the proposal can no longer be applied as it was reviewed. Read the playlist again and propose the change on top of it."
    },
    {
      "code": "review_blocked",
      "type": "https://screenrig.ai/problems/review-blocked",
      "title": "Another review must be decided first",
      "status": 409,
      "hint": "This screen change uses a playlist that has no approved version yet. Decide the playlist's review first (detail names it), or approve it together with its related screen changes."
    },
    {
      "code": "playlist_not_approved",
      "type": "https://screenrig.ai/problems/playlist-not-approved",
      "title": "The playlist has no approved version",
      "status": 409,
      "hint": "A playlist proposed for review cannot reach a screen until a person approves it. Wait for the review (screenrig reviews show ID), or choose a playlist that is approved."
    },
    {
      "code": "not_found",
      "type": "https://screenrig.ai/problems/not-found",
      "title": "Resource was not found",
      "status": 404,
      "action": "hold_lkg",
      "hint": "Check the identifier in the request path; it is missing, archived, or belongs to another project. List the resource to find a current identifier."
    },
    {
      "code": "method_not_allowed",
      "type": "https://screenrig.ai/problems/method-not-allowed",
      "title": "Method is not allowed",
      "status": 405,
      "action": "hold_lkg",
      "hint": "This path does not accept this method; the Allow header lists the ones it does. If a screenrig CLI sent it, update the CLI."
    },
    {
      "code": "idempotency_mismatch",
      "type": "https://screenrig.ai/problems/idempotency-mismatch",
      "title": "Idempotency key does not match the original request",
      "status": 409,
      "action": "retry_backoff",
      "hint": "This idempotency key was already used for a different request. Retry the original request unchanged, or send the new request with a new key (Idempotency-Key / --idempotency-key)."
    },
    {
      "code": "credential_issuance_expired",
      "type": "https://screenrig.ai/problems/credential-issuance-expired",
      "title": "Credential issuance expired",
      "status": 410,
      "hint": "The one-time credential delivery for this installation cannot be recovered. Do not retry; report it and start a new enrollment or connection only with explicit approval."
    },
    {
      "code": "user_email_conflict",
      "type": "https://screenrig.ai/problems/user-email-conflict",
      "title": "Email address belongs to another person",
      "status": 409,
      "hint": "This email address already belongs to another person. Use a different address, or have that person sign in with it."
    },
    {
      "code": "provisioning_invalid",
      "type": "https://screenrig.ai/problems/provisioning-invalid",
      "title": "Browser provisioning invalid",
      "status": 404,
      "hint": "This browser provisioning is not recognized. Start browser setup again to get fresh provisioning."
    },
    {
      "code": "provisioning_expired",
      "type": "https://screenrig.ai/problems/provisioning-expired",
      "title": "Browser provisioning expired",
      "status": 410,
      "hint": "This browser provisioning expired. Start browser setup again to get fresh provisioning."
    },
    {
      "code": "provisioning_consumed",
      "type": "https://screenrig.ai/problems/provisioning-consumed",
      "title": "Browser provisioning consumed",
      "status": 409,
      "hint": "This browser provisioning was already used. If the browser is showing content it is paired; otherwise start browser setup again."
    },
    {
      "code": "provisioning_exchange_mismatch",
      "type": "https://screenrig.ai/problems/provisioning-exchange-mismatch",
      "title": "Browser provisioning exchange mismatch",
      "status": 409,
      "hint": "The provisioning exchange does not match the one issued. Start browser setup again from the same browser."
    },
    {
      "code": "browser_already_paired",
      "type": "https://screenrig.ai/problems/browser-already-paired",
      "title": "Browser already paired",
      "status": 409,
      "hint": "Treat the browser as already connected; do not pair it again."
    },
    {
      "code": "handoff_code_invalid",
      "type": "https://screenrig.ai/problems/handoff-code-invalid",
      "title": "Browser handoff code invalid",
      "status": 404,
      "hint": "Ask the user to open ScreenRig on the display and copy a fresh setup instruction, then claim that code."
    },
    {
      "code": "handoff_code_expired",
      "type": "https://screenrig.ai/problems/handoff-code-expired",
      "title": "Browser handoff code expired",
      "status": 410,
      "hint": "Ask the user to open ScreenRig on the display and copy a fresh setup instruction, then claim that code."
    },
    {
      "code": "handoff_session_rate_limited",
      "type": "https://screenrig.ai/problems/handoff-session-rate-limited",
      "title": "Browser handoff session rate limited",
      "status": 429,
      "hint": "Wait for the retry interval the response gives before starting another browser handoff; do not reload or retry in a loop."
    },
    {
      "code": "handoff_session_conflict",
      "type": "https://screenrig.ai/problems/handoff-session-conflict",
      "title": "Browser handoff session conflict",
      "status": 409,
      "hint": "This project cannot use first-screen handoff. Open the Player on the display and pair its six-character code (screenrig screen pair CODE)."
    },
    {
      "code": "browser_link_not_claimed",
      "type": "https://screenrig.ai/problems/browser-link-not-claimed",
      "title": "Browser link not claimed",
      "status": 409,
      "hint": "Claim the setup code first (screenrig browser setup), then let the browser continue."
    },
    {
      "code": "browser_link_project_mismatch",
      "type": "https://screenrig.ai/problems/browser-link-project-mismatch",
      "title": "Browser link project mismatch",
      "status": 403,
      "hint": "This setup code belongs to another project. Ask for a fresh code and claim it from the intended agent environment."
    },
    {
      "code": "origin_not_allowed",
      "type": "https://screenrig.ai/problems/origin-not-allowed",
      "title": "Origin is not allowed",
      "status": 403,
      "action": "hold_lkg",
      "hint": "Send this request from the ScreenRig origin that owns it; this request's Origin is not accepted for this route."
    },
    {
      "code": "resource_conflict",
      "type": "https://screenrig.ai/problems/resource-conflict",
      "title": "Resource state conflicts with the request",
      "status": 409,
      "action": "retry_backoff",
      "hint": "The resource is not in a state that allows this request; detail says which state. Read the resource, resolve that state, then retry."
    },
    {
      "code": "card_not_found",
      "type": "https://screenrig.ai/problems/card-not-found",
      "title": "Card not found",
      "status": 404,
      "hint": "Read GET /api/cards for project card instances or GET /api/card-types for catalogue types. Address instances by their global UID and write dynamic properties at /api/cards/{id}/data."
    },
    {
      "code": "card_invalid",
      "type": "https://screenrig.ai/problems/card-invalid",
      "title": "Card placement is invalid",
      "status": 400,
      "hint": "errors[0].field names the placement member the card catalog refused and errors[0].card names the card. Create a card with a catalogue type from /api/card-types and only its static params; reference its global UID in a placement. Write dynamic properties at /api/cards/{id}/data."
    },
    {
      "code": "card_data_invalid",
      "type": "https://screenrig.ai/problems/card-data-invalid",
      "title": "Card data document does not fit a card that reads it",
      "status": 409,
      "hint": "The card instance or a placement reading this data key refuses the document: errors[0].card names that card and errors[0].field the failing property. Correct the document to hold only that card's dynamic properties, valid against its schema, then write it again or republish."
    },
    {
      "code": "card_media_invalid",
      "type": "https://screenrig.ai/problems/card-media-invalid",
      "title": "Card media reference does not name a ready image",
      "status": 400,
      "hint": "errors[0].field names a string that begins with media:, which a card reads as a media reference, and errors[0].media_id the media it names. Use media:<id> with the id of a ready image in this project (screenrig media list); card data may name only approved media. Text that is not a reference must not begin with media:."
    },
    {
      "code": "revision_conflict",
      "type": "https://screenrig.ai/problems/revision-conflict",
      "title": "Resource revision does not match",
      "status": 412,
      "action": "hold_lkg",
      "hint": "The resource changed since you read it. Read it again, reapply your change, and retry with its current revision (current_revision when present) as the expected revision (If-Match / --expect-rev)."
    },
    {
      "code": "invalid_range",
      "type": "https://screenrig.ai/problems/invalid-range",
      "title": "Requested byte range is not satisfiable",
      "status": 416,
      "action": "retry_backoff",
      "hint": "The requested byte range starts past the end of the content. Request a range within the content length, or read the whole object."
    },
    {
      "code": "quota_exceeded",
      "type": "https://screenrig.ai/problems/quota-exceeded",
      "title": "Project content quota is exceeded",
      "status": 413,
      "action": "hold_lkg",
      "hint": "The project is at a content or screen limit. Delete or archive items it no longer needs, then retry."
    },
    {
      "code": "payment_required",
      "type": "https://screenrig.ai/problems/payment-required",
      "title": "Prepaid credit is required",
      "status": 402,
      "action": "hold_lkg",
      "hint": "The project's credit is below the allowed floor, so metered operations are refused. Check the balance (screenrig billing balance). Reading the project and disconnecting the agent still work."
    },
    {
      "code": "rate_limited",
      "type": "https://screenrig.ai/problems/rate-limited",
      "title": "Request rate is too high",
      "status": 429,
      "action": "retry_backoff",
      "hint": "Wait for the retry interval the response gives (Retry-After, retry_after_seconds in the CLI), then retry the same request. Do not retry sooner."
    },
    {
      "code": "revocation_unavailable",
      "type": "https://screenrig.ai/problems/revocation-unavailable",
      "title": "Credential revocation state is unavailable",
      "status": 500,
      "retryable": true,
      "retry_after": 5,
      "hint": "This is not a credential problem: keep the credential and retry the same request after a short wait."
    },
    {
      "code": "dependency_unavailable",
      "type": "https://screenrig.ai/problems/dependency-unavailable",
      "title": "Required dependency is unavailable",
      "status": 500,
      "retryable": true,
      "action": "retry_backoff",
      "retry_after": 5,
      "hint": "A service this request needs is briefly unavailable. Retry the same request after a short wait (Retry-After when present)."
    },
    {
      "code": "dependency_timeout",
      "type": "https://screenrig.ai/problems/dependency-timeout",
      "title": "Required dependency did not answer in time",
      "status": 500,
      "retryable": true,
      "action": "retry_backoff",
      "hint": "A service this request needs did not answer in time. Retry the same request after a short backoff; the unfinished attempt was not charged."
    },
    {
      "code": "schema_incompatible",
      "type": "https://screenrig.ai/problems/schema-incompatible",
      "title": "Database schema is incompatible",
      "status": 500,
      "retryable": false,
      "action": "retry_backoff",
      "hint": "The service is mid-upgrade and cannot serve this request. Retry later; the request cannot succeed until the upgrade completes."
    },
    {
      "code": "not_ready",
      "type": "https://screenrig.ai/problems/not-ready",
      "title": "Service is not ready",
      "status": 500,
      "retryable": true,
      "action": "retry_backoff",
      "retry_after": 5,
      "hint": "The service is starting or a component it needs is not ready. Retry the same request after a short wait (Retry-After when present)."
    },
    {
      "code": "server_draining",
      "type": "https://screenrig.ai/problems/server-draining",
      "title": "Service is draining",
      "status": 421,
      "action": "retry_backoff",
      "hint": "This host is shutting down. Retry the same request shortly; it will reach a host that is serving."
    },
    {
      "code": "manifest_degraded",
      "type": "https://screenrig.ai/problems/manifest-degraded",
      "title": "Runtime manifest projection is degraded",
      "status": 500,
      "retryable": true,
      "action": "hold_lkg",
      "retry_after": 60,
      "hint": "The screen's manifest could not be built right now. Keep showing current content and retry after a short wait."
    },
    {
      "code": "screenshot_unavailable",
      "type": "https://screenrig.ai/problems/screenshot-unavailable",
      "title": "Screenshot is not available",
      "status": 409,
      "action": "hold_lkg",
      "hint": "The screen's Player could not provide a screenshot. Check the screen is online (screenrig screen show ID) and request a new screenshot later."
    },
    {
      "code": "identity_invalid",
      "type": "https://screenrig.ai/problems/identity-invalid",
      "title": "Player public key is invalid",
      "status": 400,
      "action": "hold_lkg",
      "hint": "The Player public key is malformed. Generate a valid key and start pairing again."
    },
    {
      "code": "identity_conflict",
      "type": "https://screenrig.ai/problems/identity-conflict",
      "title": "Player public key does not match the enrollment",
      "status": 409,
      "hint": "The public key does not match the one this pairing or screen is bound to. Pair again with the key the device holds."
    },
    {
      "code": "enrollment_bound",
      "type": "https://screenrig.ai/problems/enrollment-bound",
      "title": "Player public key is already bound to a project",
      "status": 409,
      "hint": "This Player key is already bound to a project. Use that screen as it is, or archive it and move the screen to new hardware with screen recover."
    },
    {
      "code": "proof_invalid",
      "type": "https://screenrig.ai/problems/proof-invalid",
      "title": "Player identity proof is invalid",
      "status": 401,
      "action": "retry_backoff",
      "hint": "The signed proof did not verify. Re-sign the request with the Player key over the exact request, then retry."
    },
    {
      "code": "screen_archived",
      "type": "https://screenrig.ai/problems/screen-archived",
      "title": "Screen is archived",
      "status": 409,
      "action": "clear_lkg",
      "hint": "The screen is archived. Unarchive it first (screenrig screen unarchive ID) if you mean to use it."
    },
    {
      "code": "screen_archive_required",
      "type": "https://screenrig.ai/problems/screen-archive-required",
      "title": "Archive the screen instead of deleting or unbinding it",
      "status": 409,
      "action": "hold_lkg",
      "hint": "Archive the screen (screenrig screen archive ID) instead of deleting or unbinding it."
    },
    {
      "code": "passkey_invalid",
      "type": "https://screenrig.ai/problems/passkey-invalid",
      "title": "Passkey ceremony is invalid",
      "status": 401,
      "hint": "The passkey ceremony failed or expired. Start a new passkey sign-in and complete it once."
    },
    {
      "code": "passkeys_disabled",
      "type": "https://screenrig.ai/problems/passkeys-disabled",
      "title": "Passkeys are disabled on this server",
      "status": 403,
      "hint": "This server does not accept passkeys. Sign in another way."
    },
    {
      "code": "application_in_use",
      "type": "https://screenrig.ai/problems/application-in-use",
      "title": "A live manifest still references an application release",
      "status": 409,
      "hint": "A playlist on a live screen still references this application release. Remove it from those playlists or reassign the screens, then retry."
    },
    {
      "code": "agent_connection_invalid",
      "type": "https://screenrig.ai/problems/agent-connection-invalid",
      "title": "Agent connection is invalid",
      "status": 404,
      "hint": "This agent sign-in is not recognized. Start a new one (screenrig login)."
    },
    {
      "code": "agent_connection_code_mismatch",
      "type": "https://screenrig.ai/problems/agent-connection-code-mismatch",
      "title": "The code does not match this sign-in",
      "status": 400,
      "hint": "Compare the code with the one screenrig login printed in the terminal and enter it again. After five mismatches the sign-in expires; run screenrig login again."
    },
    {
      "code": "agent_connection_expired",
      "type": "https://screenrig.ai/problems/agent-connection-expired",
      "title": "Agent connection is expired",
      "status": 410,
      "hint": "This agent sign-in expired before it was approved. Start a new one (screenrig login) and approve it in the dashboard."
    },
    {
      "code": "agent_connection_conflict",
      "type": "https://screenrig.ai/problems/agent-connection-conflict",
      "title": "Agent connection is already resolved",
      "status": 409,
      "hint": "This connection was already approved or denied. Read its status (screenrig agent status) instead of resolving it again."
    },
    {
      "code": "agent_connection_not_approved",
      "type": "https://screenrig.ai/problems/agent-connection-not-approved",
      "title": "Agent connection is not approved",
      "status": 409,
      "hint": "The connection is still waiting for approval. Ask the user to approve it in the dashboard, then poll its status again."
    },
    {
      "code": "agent_connection_cancelled",
      "type": "https://screenrig.ai/problems/agent-connection-cancelled",
      "title": "Agent connection was cancelled",
      "status": 410,
      "hint": "This sign-in was cancelled. Start a new one (screenrig login) if one is still wanted."
    },
    {
      "code": "agent_limit_exceeded",
      "type": "https://screenrig.ai/problems/agent-limit-exceeded",
      "title": "Agent limit is exceeded",
      "status": 409,
      "hint": "The project has the maximum number of live agents. Disconnect an agent it no longer uses, then connect again."
    },
    {
      "code": "agent_lockout_risk",
      "type": "https://screenrig.ai/problems/agent-lockout-risk",
      "title": "Disconnecting the last active agent risks lockout",
      "status": 409,
      "hint": "This is the project's last active agent. Disconnect only if the user confirms, with the explicit override (screenrig agent disconnect --yes --allow-lockout)."
    },
    {
      "code": "recovery_ambiguous",
      "type": "https://screenrig.ai/problems/recovery-ambiguous",
      "title": "Device identifier is attached to more than one screen",
      "status": 409,
      "hint": "The device is attached to more than one screen, so recovery cannot pick one. List the screens (screenrig screen list), report the conflict, and do not retry."
    },
    {
      "code": "recovery_expired",
      "type": "https://screenrig.ai/problems/recovery-expired",
      "title": "Screen recovery offer has expired",
      "status": 410,
      "hint": "The recovery offer lapsed. Pair the device again so the screen receives a new recovery offer, then run screen recover."
    },
    {
      "code": "recovery_not_offered",
      "type": "https://screenrig.ai/problems/recovery-not-offered",
      "title": "No screen recovery is pending",
      "status": 404,
      "hint": "No new device is waiting to take over this screen. Pair the new device first, then run screen recover."
    },
    {
      "code": "invitation_limit_reached",
      "type": "https://screenrig.ai/problems/invitation-limit-reached",
      "title": "Project has the maximum outstanding invitations",
      "status": 409,
      "hint": "The project has the maximum outstanding invitations. Revoke an unused invitation (screenrig invitations revoke), then create the new one."
    },
    {
      "code": "organization_admin_limit",
      "type": "https://screenrig.ai/problems/organization-admin-limit",
      "title": "Organization admin limit reached",
      "status": 409,
      "hint": "An organization has at most 20 admins, counting pending admin invitations. An admin revokes a pending invitation or removes an admin in the dashboard, then invites again."
    },
    {
      "code": "version_required",
      "type": "https://screenrig.ai/problems/version-required",
      "title": "Playlist requires a newer API version",
      "status": 409,
      "hint": "This playlist has ad pages, which only the playlists API (/api/playlists) accepts. Write it there, or remove the ad pages to keep using this API."
    },
    {
      "code": "price_change_pending",
      "type": "https://screenrig.ai/problems/price-change-pending",
      "title": "Campaign is paused until new rates are accepted",
      "status": 409,
      "hint": "The seller changed rates and the campaign is paused. Preview the campaign for a fresh quote and accept it (screenrig ads campaigns accept-rates) only with the buyer's consent."
    },
    {
      "code": "quote_stale",
      "type": "https://screenrig.ai/problems/quote-stale",
      "title": "Advertising quote is stale or expired",
      "status": 409,
      "hint": "The quote expired or no longer matches the campaign. Preview the campaign again (screenrig ads campaigns preview) and use the new quote."
    },
    {
      "code": "insufficient_credits",
      "type": "https://screenrig.ai/problems/insufficient-credits",
      "title": "Eligible credits are insufficient",
      "status": 402,
      "hint": "The project's eligible credit does not cover this spend. Check the balance and source eligibility (screenrig billing balance), then reduce the spend."
    },
    {
      "code": "self_deal",
      "type": "https://screenrig.ai/problems/self-deal",
      "title": "A project cannot buy advertising in its own network",
      "status": 409,
      "hint": "A project cannot buy ads in its own network. Target another network's inventory."
    },
    {
      "code": "invitation_invalid",
      "type": "https://screenrig.ai/problems/invitation-invalid",
      "title": "Invitation is invalid",
      "status": 404,
      "hint": "This invitation link is not recognized. Ask a project member for a new invitation."
    },
    {
      "code": "invitation_expired",
      "type": "https://screenrig.ai/problems/invitation-expired",
      "title": "Invitation is expired",
      "status": 410,
      "hint": "This invitation expired. Ask a project member for a new invitation."
    },
    {
      "code": "invitation_consumed",
      "type": "https://screenrig.ai/problems/invitation-consumed",
      "title": "Invitation is already accepted",
      "status": 409,
      "hint": "This invitation was already accepted. Sign in instead."
    },
    {
      "code": "invitation_email_mismatch",
      "type": "https://screenrig.ai/problems/invitation-email-mismatch",
      "title": "Invitation belongs to a different email address",
      "status": 403,
      "hint": "The invitation was sent to a different email address. Sign in with that address or ask for an invitation to this one."
    },
    {
      "code": "reauthentication_required",
      "type": "https://screenrig.ai/problems/reauthentication-required",
      "title": "Fresh sign-in proof is required",
      "status": 401,
      "hint": "This action needs a fresh sign-in. Sign in again, then retry within a few minutes."
    },
    {
      "code": "member_limit_reached",
      "type": "https://screenrig.ai/problems/member-limit-reached",
      "title": "Project has the maximum members",
      "status": 409,
      "hint": "The project has the maximum members. Remove a member it no longer needs, then retry."
    },
    {
      "code": "last_credential",
      "type": "https://screenrig.ai/problems/last-credential",
      "title": "Last sign-in method cannot be removed",
      "status": 409,
      "hint": "Add another sign-in method before removing this one."
    },
    {
      "code": "no_project",
      "type": "https://screenrig.ai/problems/no-project",
      "title": "No current project is selected",
      "status": 409,
      "hint": "Select a project first, then retry."
    },
    {
      "code": "billing_unavailable",
      "type": "https://screenrig.ai/problems/billing-unavailable",
      "title": "This billing action is not available",
      "status": 404,
      "action": "hold_lkg",
      "hint": "Payment and payout rails are not configured for this route. Read the balance and statement (screenrig billing balance) instead, and do not retry this action."
    },
    {
      "code": "feature_unavailable",
      "type": "https://screenrig.ai/problems/feature-unavailable",
      "title": "This feature is not available on this server",
      "status": 404,
      "action": "hold_lkg",
      "hint": "This feature is not enabled on this server; detail says what to use instead. Do not retry."
    },
    {
      "code": "user_binding_stale",
      "type": "https://screenrig.ai/problems/user-binding-stale",
      "title": "Claiming user email binding is stale",
      "status": 409,
      "hint": "The verified email changed during sign-in. Start the sign-in again."
    },
    {
      "code": "session_expired",
      "type": "https://screenrig.ai/problems/session-expired",
      "title": "Runtime session is expired or no longer current",
      "status": 401,
      "action": "remint",
      "hint": "Mint a new runtime session, then retry."
    },
    {
      "code": "credential_revoked",
      "type": "https://screenrig.ai/problems/credential-revoked",
      "title": "Device credential no longer binds this device to a screen",
      "status": 401,
      "action": "repair",
      "hint": "This device key no longer binds a screen. Pair the device again with this key."
    },
    {
      "code": "proof_clock_skew",
      "type": "https://screenrig.ai/problems/proof-clock-skew",
      "title": "Player identity proof is outside the accepted time window",
      "status": 401,
      "action": "retry_backoff",
      "hint": "Re-sign the proof using a clock offset from server_time, then retry."
    },
    {
      "code": "key_retired",
      "type": "https://screenrig.ai/problems/key-retired",
      "title": "Player key was replaced and its grace window has closed",
      "status": 401,
      "action": "repair",
      "hint": "This key was replaced. Pair the device again with its current key."
    },
    {
      "code": "assignment_not_found",
      "type": "https://screenrig.ai/problems/assignment-not-found",
      "title": "Screen has no playlist assignment",
      "status": 404,
      "action": "clear_lkg",
      "hint": "Assign a playlist to the screen (screenrig screen assign), then the Player will load it."
    },
    {
      "code": "upgrade_required",
      "type": "https://screenrig.ai/problems/upgrade-required",
      "title": "Player version is below the supported minimum",
      "status": 403,
      "action": "upgrade_required",
      "hint": "Keep showing current content and update the Player to at least min_supported."
    },
    {
      "code": "reboot_unsupported",
      "type": "https://screenrig.ai/problems/reboot-unsupported",
      "title": "Screen cannot reboot remotely",
      "status": 409,
      "hint": "This screen's Player cannot reboot remotely. Use screen reload to refresh content, or restart the device by hand."
    },
    {
      "code": "webhook_limit_reached",
      "type": "https://screenrig.ai/problems/webhook-limit-reached",
      "title": "Project has the maximum webhooks",
      "status": 409,
      "hint": "The project has the maximum of 10 webhooks. Delete one it no longer needs (screenrig webhooks delete), then create the new one."
    },
    {
      "code": "fleet_link_limit_reached",
      "type": "https://screenrig.ai/problems/fleet-link-limit-reached",
      "title": "Project has the maximum fleet links",
      "status": 409,
      "hint": "The project has the maximum of 50 fleet links. Delete one it no longer needs (screenrig fleet-links delete), then create the new one."
    },
    {
      "code": "webhook_url_rejected",
      "type": "https://screenrig.ai/problems/webhook-url-rejected",
      "title": "Webhook URL must be HTTPS on a public Internet host",
      "status": 400,
      "hint": "Use an https:// URL on a public Internet host; private, loopback, and non-HTTPS addresses are refused."
    },
    {
      "code": "note_contains_credential",
      "type": "https://screenrig.ai/problems/note-contains-credential",
      "title": "Note text contains a credential",
      "status": 422,
      "hint": "Nothing was stored. Take the token, key or password out of the text (say where the secret is kept instead) and add the note again."
    },
    {
      "code": "note_rejected",
      "type": "https://screenrig.ai/problems/note-rejected",
      "title": "Note text was rejected",
      "status": 422,
      "hint": "Nothing was stored. A note is a plain fact for other agents, never an instruction to a model; rewrite it as a fact and add it again."
    },
    {
      "code": "note_not_open",
      "type": "https://screenrig.ai/problems/note-not-open",
      "title": "Note is not open",
      "status": 409,
      "hint": "The note is already resolved. List the open notes (screenrig notes) and confirm, resolve or replace one of those."
    },
    {
      "code": "note_limit_reached",
      "type": "https://screenrig.ai/problems/note-limit-reached",
      "title": "Project has the maximum open notes",
      "status": 409,
      "hint": "The project has 200 open notes. Resolve the ones that no longer hold (screenrig notes resolve ID REASON), starting with those the detail names, then add the note again."
    },
    {
      "code": "trigger_limit_reached",
      "type": "https://screenrig.ai/problems/trigger-limit-reached",
      "title": "Project has the maximum triggers",
      "status": 409,
      "hint": "The project has the maximum of 20 triggers. Delete one it no longer needs (screenrig triggers delete), then create the new one."
    },
    {
      "code": "kv_webhook_limit_reached",
      "type": "https://screenrig.ai/problems/kv-webhook-limit-reached",
      "title": "Application has the maximum key/value webhooks",
      "status": 409,
      "hint": "The application has the maximum of 20 key/value webhooks. Delete one it no longer needs (DELETE /api/applications/{application_id}/kv-webhooks/{webhook_id}), then create the new one."
    },
    {
      "code": "support_conversation_closed",
      "type": "https://screenrig.ai/problems/support-conversation-closed",
      "title": "Support conversation is closed",
      "status": 409,
      "hint": "Read the conversation history or start a new conversation with screenrig support submit."
    },
    {
      "code": "submission_too_short",
      "type": "https://screenrig.ai/problems/submission-too-short",
      "title": "Submission is too short to act on",
      "status": 422,
      "hint": "Describe what happened or what you need in at least a full sentence, then send it again with a new idempotency key."
    },
    {
      "code": "submission_unclear",
      "type": "https://screenrig.ai/problems/submission-unclear",
      "title": "Submission does not describe a problem or request",
      "status": 422,
      "hint": "Describe the problem, question or request in plain language, then send it again with a new idempotency key."
    },
    {
      "code": "submission_rejected",
      "type": "https://screenrig.ai/problems/submission-rejected",
      "title": "Submission was not accepted",
      "status": 422,
      "hint": "Do not resend this text. Send a plain-language description of a screenRIG problem, question or request instead."
    },
    {
      "code": "submission_screening_unavailable",
      "type": "https://screenrig.ai/problems/submission-screening-unavailable",
      "title": "Submission cannot be screened right now",
      "status": 500,
      "retryable": true,
      "retry_after": 120,
      "hint": "Send the same request again with the same idempotency key after the Retry-After interval."
    },
    {
      "code": "demo_slot_unavailable",
      "type": "https://screenrig.ai/problems/demo-slot-unavailable",
      "title": "Demo time is no longer available",
      "status": 409,
      "hint": "Refresh the available demo times and choose another time. Your saved request is retained."
    },
    {
      "code": "agentid_claim_invalid",
      "type": "https://screenrig.ai/problems/agentid-claim-invalid",
      "title": "AgentID claim is invalid or expired",
      "status": 400,
      "hint": "The AgentID claim code is missing, expired, or already redeemed. Sign in with AgentID again for a fresh claim code, or enroll with screenrig agent enroll --email ADDRESS."
    },
    {
      "code": "agentid_already_enrolled",
      "type": "https://screenrig.ai/problems/agentid-already-enrolled",
      "title": "AgentID is already enrolled",
      "status": 409,
      "hint": "An installation already holds this AgentID. Run screenrig login from that installation to add a project."
    }
  ]
}
