{"version":"v1","schema":{"error":"Stable snake_case code. Match on this, never on prose.","http_status":"The HTTP status the gateway answers with.","retryable":"false means the identical call will never succeed until something changes.","retry_at":"On a RESPONSE: present whenever retryable is true (ISO-8601), absent whenever it is false. The Retry-After header carries the same moment in seconds.","default_retry_after_seconds":"In THIS directory only, never in a response: the delay used when the exact moment is not known. Non-null exactly when retryable is true.","self_service":"What the AGENT can do without a human. null means there is no such way.","human_action":"What a HUMAN has to do. null means nobody has to.","action_url":"Where the human has to go. Only together with human_action."},"errors":[{"error":"platform_frozen","http_status":503,"retryable":true,"default_retry_after_seconds":300,"meaning":"The platform is temporarily frozen. No calls are metered or charged while this lasts.","self_service":null,"human_action":null,"action_url":null},{"error":"product_not_found","http_status":404,"retryable":false,"default_retry_after_seconds":null,"meaning":"No product under this slug is available: unknown, inactive or blocked. The catalog (descriptor, OpenAPI document, probe) also answers this while the product is not public or its provider is not admitted; for a subscription that already exists, the gateway decides on its own.","self_service":"Search the catalog with the 'search_apis' MCP tool for an available product.","human_action":null,"action_url":null},{"error":"invalid_key","http_status":401,"retryable":false,"default_retry_after_seconds":null,"meaning":"The API key is unknown, revoked or malformed.","self_service":null,"human_action":"Create a new API key.","action_url":"https://metergate.dev/keys"},{"error":"key_expired","http_status":401,"retryable":false,"default_retry_after_seconds":null,"meaning":"The API key was valid but has passed its expiry date. 'expired_at' says when.","self_service":"If you hold a delegating key, issue a replacement with the 'create_key' MCP tool at https://metergate.dev/mcp.","human_action":"The key has expired. Create a new one.","action_url":"https://metergate.dev/keys"},{"error":"key_revoked","http_status":401,"retryable":false,"default_retry_after_seconds":null,"meaning":"The API key existed and was deliberately revoked. It is not a typo and it will not come back.","self_service":"If you hold a delegating key, issue a replacement with the 'create_key' MCP tool at https://metergate.dev/mcp.","human_action":"The key was revoked. Create a new one.","action_url":"https://metergate.dev/keys"},{"error":"account_blocked","http_status":401,"retryable":false,"default_retry_after_seconds":null,"meaning":"The key is valid, but the account it belongs to is blocked. A new key will not help.","self_service":null,"human_action":"The account is blocked. Contact support.","action_url":"https://metergate.dev/support"},{"error":"account_closed","http_status":401,"retryable":false,"default_retry_after_seconds":null,"meaning":"The key is valid, but the account it belongs to was closed by its owner. This is final: a new key will not help, and support cannot reopen it.","self_service":null,"human_action":"The account was closed. Open a new account to continue.","action_url":"https://metergate.dev/register"},{"error":"payment_method_required","http_status":402,"retryable":false,"default_retry_after_seconds":null,"meaning":"The account has no active payment method, so usage cannot be settled.","self_service":null,"human_action":"Add a payment method.","action_url":"https://metergate.dev/balance"},{"error":"subscription_suspended","http_status":402,"retryable":false,"default_retry_after_seconds":null,"meaning":"The subscription exists but is suspended, usually after a failed card charge.","self_service":null,"human_action":"Resolve the suspension.","action_url":"https://metergate.dev/balance"},{"error":"subscription_required","http_status":403,"retryable":false,"default_retry_after_seconds":null,"meaning":"There is no active subscription for this product.","self_service":"Call the 'subscribe' MCP tool at https://metergate.dev/mcp with this slug.","human_action":null,"action_url":null},{"error":"out_of_scope","http_status":403,"retryable":false,"default_retry_after_seconds":null,"meaning":"This API key is restricted to a set of products and this one is not in it. The subscription may well exist — the key is simply not allowed to use it.","self_service":null,"human_action":"Use a key that covers this product, or have the account owner issue one.","action_url":"https://metergate.dev/keys"},{"error":"price_exceeds_mandate","http_status":403,"retryable":false,"default_retry_after_seconds":null,"meaning":"The account owner set a maximum price per call for this API key, and the provider's current price is above it. The subscription is intact; this call was not made and not charged.","self_service":null,"human_action":"Ask the account owner to raise the key's maximum price per call, or use a cheaper product.","action_url":"https://metergate.dev/keys"},{"error":"method_not_allowed","http_status":405,"retryable":false,"default_retry_after_seconds":null,"meaning":"This product does not accept the HTTP method used. The provider declares which methods the API accepts; the list is in 'allowed_methods' and in the Allow header.","self_service":null,"human_action":null,"action_url":null},{"error":"objection_window_pending","http_status":425,"retryable":true,"default_retry_after_seconds":60,"meaning":"The subscription is active but its objection window has not elapsed yet. Payload traffic starts at 'activates_at'.","self_service":null,"human_action":null,"action_url":null},{"error":"rate_limit_exceeded","http_status":429,"retryable":true,"default_retry_after_seconds":60,"meaning":"Too many calls in the current 60 second window.","self_service":null,"human_action":null,"action_url":null},{"error":"upstream_blocked","http_status":502,"retryable":false,"default_retry_after_seconds":null,"meaning":"The provider's upstream address is not allowed through the gateway (SSRF guard).","self_service":"The provider's endpoint is refused by the gateway. Report it with the 'report_issue' MCP tool at https://metergate.dev/mcp.","human_action":null,"action_url":null},{"error":"invalid_request","http_status":400,"retryable":false,"default_retry_after_seconds":null,"meaning":"The request does not match the product's input schema. See 'details'.","self_service":"Fix the parameters against the input schema from 'get_api'.","human_action":null,"action_url":null},{"error":"credit_limit_reached","http_status":402,"retryable":true,"default_retry_after_seconds":3600,"meaning":"Settled plus reserved usage would exceed the subscription's credit limit.","self_service":null,"human_action":"Wait until retry_at, when the next billing period starts.","action_url":"https://metergate.dev/keys"},{"error":"budget_exceeded","http_status":402,"retryable":true,"default_retry_after_seconds":3600,"meaning":"This API key's monthly budget would be exceeded by the call.","self_service":null,"human_action":"Ask the account owner to raise the key budget.","action_url":"https://metergate.dev/keys"},{"error":"request_too_large","http_status":413,"retryable":false,"default_retry_after_seconds":null,"meaning":"The request body exceeds the gateway's size limit ('limit_bytes'). The call was not charged.","self_service":"Send a smaller request body.","human_action":null,"action_url":null},{"error":"response_too_large","http_status":502,"retryable":false,"default_retry_after_seconds":null,"meaning":"The provider's response exceeded the gateway's size limit. The call was not charged.","self_service":null,"human_action":null,"action_url":null},{"error":"upstream_error","http_status":502,"retryable":true,"default_retry_after_seconds":30,"meaning":"The provider failed or was unreachable. The call was not charged. 'upstream_status' is present when the provider answered.","self_service":null,"human_action":null,"action_url":null},{"error":"blocked_content_type","http_status":502,"retryable":false,"default_retry_after_seconds":null,"meaning":"The provider returned a content type the gateway refuses to forward. Not charged.","self_service":null,"human_action":null,"action_url":null},{"error":"gateway_error","http_status":500,"retryable":true,"default_retry_after_seconds":30,"meaning":"Unexpected gateway failure. Nothing was charged.","self_service":null,"human_action":null,"action_url":null}],"delegation_refusals_schema":{"status":"Stable snake_case code, returned by the 'create_key' MCP tool. Match on this, never on prose.","fix":"What the AGENT can change about its own request. null means no request will work.","human_action":"What a HUMAN has to do. null means nobody has to.","action_url":"Where the human has to go. Only together with human_action.","detail":"Present on the response, not here: the concrete numbers the 'fix' sentence refers to."},"delegation_refusals":[{"status":"delegation_disabled","meaning":"The parent key is not allowed to issue keys.","fix":null,"human_action":"The account owner has to enable delegation for this key.","action_url":"https://metergate.dev/keys"},{"status":"parent_expired","meaning":"The parent key has passed its own expiry date and cannot issue anything.","fix":null,"human_action":"The account owner has to issue a new key or extend this one.","action_url":"https://metergate.dev/keys"},{"status":"parent_revoked","meaning":"The parent key has been revoked. It has a budget, but it is dead — raising a limit will not help.","fix":null,"human_action":"The account owner has to issue a new key.","action_url":"https://metergate.dev/keys"},{"status":"parent_has_no_budget","meaning":"The parent key has no spending limit, and a key without a limit cannot hand any of it down.","fix":null,"human_action":"The account owner has to set a spending limit on the parent key first.","action_url":"https://metergate.dev/keys"},{"status":"budget_exceeds_parent","meaning":"The requested budget is larger than the parent key's own limit, or it is not a positive whole number of cents.","fix":"Ask for at most 'parent_limit_cents' — the value is in this response.","human_action":null,"action_url":null},{"status":"budget_exceeds_remaining_this_month","meaning":"The requested budget fits the parent's limit but not what is left of it this calendar month.","fix":"Ask for at most 'remaining_cents' from this response, or wait until the first of next month.","human_action":null,"action_url":null},{"status":"scope_empty","meaning":"A derived key must name the products it may call. An empty scope is not a wildcard.","fix":"Pass 'scope_slugs' with at least one slug. To hand down everything the parent may call, list it.","human_action":null,"action_url":null},{"status":"scope_exceeds_parent","meaning":"The requested scope contains products the parent key itself may not call.","fix":"Drop the slugs listed in 'not_allowed' — a derived key can never reach further than its parent.","human_action":null,"action_url":null},{"status":"expiry_missing","meaning":"A derived key must expire. There are no open-ended derived keys.","fix":"Pass 'expires_at' as an ISO-8601 timestamp in the future.","human_action":null,"action_url":null},{"status":"expiry_beyond_parent","meaning":"The requested expiry is later than the parent key's own.","fix":"Ask for a date at or before 'parent_expires_at' from this response.","human_action":null,"action_url":null},{"status":"expiry_too_far","meaning":"The requested expiry is further out than the longest lifetime a derived key may have.","fix":"Ask for a date at most 'max_ttl_days' from now — the value is in this response.","human_action":null,"action_url":null},{"status":"depth_exceeded","meaning":"The delegation chain has reached its maximum depth.","fix":"Have a key higher up the chain issue this one instead.","human_action":null,"action_url":null},{"status":"too_many_children","meaning":"The parent key already has the maximum number of active derived keys.","fix":"Revoke derived keys you no longer need with 'revoke_key', then try again.","human_action":null,"action_url":null}]}