AVAILABLE

API Operations

HTTP Retry-After & Backoff Guard

Parse RFC 9110 Retry-After values, calculate bounded jitter windows, combine server and client timing, build schedules, inspect responses, and apply explicit retry policy.

CONTRACT

Predictable for agents. Legible for reviewers.

REST
POST /v1/http-retries/policy-check
MCP tool
check_http_retry_policy
Inputs
Caller-supplied method, status, explicit retriable-status policy, optional Retry-After, offset-aware receipt time, idempotency and body-replay evidence, retry index, maximum attempts, elapsed-time limits, and bounded exponential-backoff settings.
Returns
CLEAR, REVIEW_REQUIRED, or BLOCKED with parsed server timing, method semantics, client and combined delay windows, attempt and elapsed-budget evidence, stable findings, and a non-executing next action.
Latency
Synchronous
Usage unit
Retry-planning operation

The suite also exposes /v1/http-retries/parse-retry-after, /backoff-window, /combine-delay, /schedule, and /inspect-response plus /mcp/http-retry. It sends no request, executes no sleep, contacts no endpoint, operates no queue or circuit breaker, verifies no provider-specific retryability, and stores no payload. Its RapidAPI release is queued behind the provider's twenty-public-API cap.

AGENT-READABLE EXCEPTIONS

HTTP_RETRY_AFTER_INVALIDHTTP_RETRY_AFTER_TOO_LARGEHTTP_RETRY_AFTER_ALREADY_ELAPSEDHTTP_RETRY_JITTER_DISABLEDHTTP_RETRY_BACKOFF_CAPPEDHTTP_RETRY_SERVER_DELAY_CONTROLSHTTP_RETRY_STATUS_NOT_ALLOWEDHTTP_RETRY_REQUEST_REPLAY_UNSAFEHTTP_RETRY_ATTEMPT_LIMIT_EXCEEDEDHTTP_RETRY_ELAPSED_BUDGET_EXHAUSTEDHTTP_RETRY_DELAY_EXCEEDS_ELAPSED_BUDGETHTTP_RETRY_SINGLE_DELAY_LIMIT_EXCEEDEDHTTP_RETRY_AFTER_MISSING
HTTP request
POST /v1/http-retries/policy-check
Authorization: Bearer apc_...
Content-Type: application/json

{
  "method": "POST",
  "status_code": 429,
  "caller_retriable_statuses": [
    408,
    429,
    500,
    502,
    503,
    504
  ],
  "retry_after": "120",
  "received_at": "2026-08-11T12:00:00Z",
  "idempotency_evidence_present": true,
  "body_replayable": true,
  "retry_index": 2,
  "maximum_total_attempts": 5,
  "elapsed_seconds": "10",
  "maximum_elapsed_seconds": "300",
  "backoff": {
    "retry_index": 2,
    "base_delay_ms": "500",
    "multiplier": "2",
    "maximum_delay_ms": "20000",
    "jitter": "FULL"
  },
  "maximum_single_delay_seconds": "180",
  "require_retry_after_for_statuses": [
    429,
    503
  ]
}
cURL (bash)
curl --request POST \
  --url 'https://api-production-9502.up.railway.app/v1/http-retries/policy-check' \
  --header 'Authorization: Bearer ${AP_CONTROL_API_KEY}' \
  --header 'Content-Type: application/json' \
  --data '{
  "method": "POST",
  "status_code": 429,
  "caller_retriable_statuses": [
    408,
    429,
    500,
    502,
    503,
    504
  ],
  "retry_after": "120",
  "received_at": "2026-08-11T12:00:00Z",
  "idempotency_evidence_present": true,
  "body_replayable": true,
  "retry_index": 2,
  "maximum_total_attempts": 5,
  "elapsed_seconds": "10",
  "maximum_elapsed_seconds": "300",
  "backoff": {
    "retry_index": 2,
    "base_delay_ms": "500",
    "multiplier": "2",
    "maximum_delay_ms": "20000",
    "jitter": "FULL"
  },
  "maximum_single_delay_seconds": "180",
  "require_retry_after_for_statuses": [
    429,
    503
  ]
}'
Representative response
{
  "status": "COMPLETED",
  "decision": "REVIEW_REQUIRED",
  "retry_allowed": true,
  "method_semantics": "CONDITIONAL",
  "status_allowed_by_caller": true,
  "attempt_number_if_retried": 3,
  "combined_earliest_delay_seconds": "120",
  "combined_latest_delay_seconds": "120",
  "remaining_elapsed_budget_seconds": "290",
  "local_random_selection_required": false,
  "findings": [
    {
      "code": "HTTP_RETRY_SERVER_DELAY_CONTROLS",
      "severity": "LOW",
      "message": "Retry-After is later than the client backoff window.",
      "evidence": {
        "server_delay_seconds": "120"
      },
      "next_action": "Do not retry before the server-directed time; apply total elapsed-time policy separately."
    }
  ],
  "ruleset_version": "HTTP_RETRY_GUARD_2026",
  "scope": "CALLER_SUPPLIED_HTTP_FACTS_ONLY",
  "request_sent": false,
  "delay_executed": false,
  "endpoint_contacted": false,
  "payload_stored": false,
  "next_action": "Retry only after locally selecting a delay in the returned window and rechecking service-specific idempotency, response, circuit-breaker, concurrency, and authorization state."
}
RFC 9110 server timingDelay-seconds and HTTP-date forms are parsed against an explicit offset-aware receipt time, including already-elapsed evidence.
Jitter remains localThe API returns deterministic full, equal, or exact windows; it never generates a hidden random value or executes a wait.
No request or retry actionThe service contacts no endpoint, resends no body, operates no queue or circuit breaker, and cannot prove provider-specific retryability.

Try HTTP Retry-After & Backoff Guard with your own workflow.

Start with the workspace, inspect the typed result, then integrate with REST or the focused MCP server.