Base URL: https://registry.symphonix.health/v1 — OpenAPI 3.0.3 — Auth: JWT / mTLS / DPoP
Well-Known
GHARRA server configuration metadata, following RFC 8414 / RFC 9728 patterns.
Returns signed configuration metadata for this GHARRA instance, including API endpoints, supported auth methods, and JWS-signed metadata.
No authentication required
{
"issuer": "https://registry.symphonix.health",
"registry_id": "gharra://GB/registries/nhs-spine",
"tier": "sovereign",
"jurisdiction": "GB",
"api_base_url": "https://registry.symphonix.health/v1",
"jwks_uri": "https://registry.symphonix.health/.well-known/jwks.json",
"registration_endpoint": "/v1/agents",
"discovery_endpoint": "/v1/discover",
"routing_endpoint": "/v1/route",
"events_endpoint": "/v1/events/stream",
"trust_anchors_endpoint": "/v1/trust/anchors",
"supported_auth_methods": ["jwt", "mtls", "dpop"],
"signed_metadata": "eyJhbGciOi..."
}
Agents
Agent registration, update, and lifecycle management. All mutations require X-Idempotency-Key header.
List agent records with pagination and filtering.
| Parameter | Type | Description |
|---|---|---|
| jurisdiction | string | ISO 3166-1 alpha-2 country code filter |
| status | enum | active | suspended | revoked | retired |
| cursor | string | Pagination cursor from previous response |
| limit | integer | Page size (1-100, default 20) |
{
"agents": [{ /* AgentRecord */ }],
"next_cursor": "eyJ...",
"total_count": 142
}
Register an agent (idempotent). Returns 201 on first call, 200 on replay with same idempotency key.
Headers: X-Idempotency-Key (required, UUID)
| Body field | Type | Required | Description |
|---|---|---|---|
| display_name | string | Yes | Human-readable agent name |
| jurisdiction | string | Yes | ISO 3166-1 alpha-2 country code |
| endpoints | array | Yes | List of Endpoint objects (url, protocol, priority, weight) |
| capabilities | object | Yes | Protocols, FHIR R4 support, consent, stream resume |
| trust | object | Yes | Certificates, signatures, attestations |
| owner | object | org_id, org_name, operator | |
| description | string | Agent description | |
| policy_tags | object | ABAC policy tags |
curl -X POST https://registry.symphonix.health/v1/agents \ -H "Authorization: Bearer <token>" \ -H "X-Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \ -H "Content-Type: application/json" \ -d '{ "display_name": "Radiology Summariser", "jurisdiction": "GB", "endpoints": [{ "url": "https://rad.nhs.example/a2a", "protocol": "nexus-a2a-jsonrpc", "priority": 1 }], "capabilities": { "protocols": ["nexus-a2a-jsonrpc"], "fhir_r4": true, "consent_support": true }, "trust": { "certificates": ["..."] } }'
Responses: 201 Agent registered — 200 Idempotent replay — 409 Version conflict
Get a single agent record by ID. Response includes ETag header for optimistic concurrency.
Responses: 200 AgentRecord + ETag header — 404 Not found
Update agent record with optimistic concurrency. Requires If-Match header containing the ETag from the previous GET.
Headers: X-Idempotency-Key + If-Match (both required)
| Body field | Type | Description |
|---|---|---|
| display_name | string | Updated name |
| endpoints | array | Updated endpoints |
| capabilities | object | Updated capabilities |
| trust | object | Updated trust material |
Responses: 200 Updated — 409 Version conflict — 412 ETag mismatch
Revoke an agent record. Revocation is permanent and cannot be undone.
Headers: X-Idempotency-Key (required)
{ "reason": "Agent decommissioned per compliance audit" }
Responses: 200 Revoked — 404 Not found
Discovery
Discover agents by capability, jurisdiction, and trust posture. Returns ranked results with verifiable trust material references. No PHI is involved.
Query the discovery index for agents matching your requirements. Results include trust material references and are optionally JWS-signed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| capability | string | Yes | Required capability (e.g. fhir_r4, consent.verify) |
| jurisdiction | string | ISO 3166-1 alpha-2 country code | |
| require_features | array | Feature flags (e.g. stream_resume, idempotency_strict) | |
| protocol | string | Required protocol (e.g. nexus-a2a-jsonrpc) | |
| token_binding | enum | none | mtls_cnf_x5t_s256 | dpop | |
| residency | string | Required data residency region | |
| purpose_of_use | string | treatment | payment | operations | research | |
| limit | integer | Max results (1-100, default 20) |
import httpx resp = httpx.get( "https://registry.symphonix.health/v1/discover", params={ "capability": "fhir-r4-patient-search", "jurisdiction": "GB", "purpose_of_use": "treatment", }, headers={"Authorization": f"Bearer {token}"}, ) agents = resp.json()["results"]
{
"query": { "capability": "fhir-r4-patient-search", "jurisdiction": "GB" },
"results": [{ /* AgentRecord */ }],
"result_count": 7,
"signed_response": "eyJhbGciOi..."
}
Routing
Routing advisory for endpoint selection. Returns ranked endpoints with failover hints, health signals, and trust material — without acting as a runtime proxy.
Get routing advice for an agent or capability query. Includes trust bundle, constraints, and evidence chain.
{
"target": "gharra://GB/agents/01HXR...",
"required_features": ["stream_resume"],
"residency": {
"allowed_zones": ["eu-west-1", "eu-west-2"],
"deny_cross_zone": true
},
"workload": {
"token_binding": "mtls_cnf_x5t_s256",
"priority": "high"
},
"purpose": { "purpose_of_use": "treatment" }
}
{
"resolved_target": "gharra://GB/agents/01HXR...",
"selected": {
"endpoint": "https://rad.nhs.example/a2a",
"protocol": "nexus-a2a-jsonrpc",
"region": "eu-west-2"
},
"alternatives": [{ "endpoint": "...", "priority": 2 }],
"trust_bundle": { /* TrustBundle */ },
"constraints": {
"phi_allowed": true,
"max_concurrency_hint": 50,
"rate_limit_rps_hint": 100
},
"evidence": {
"registry_id": "gharra://GB/registries/nhs-spine",
"record_version": "3",
"delegation_chain": ["gharra://root", "gharra://GB"]
}
}
Registries
Federation directory — registry of registries. GHARRA uses a three-tier federated model: root → sovereign (per country) → organisational.
List federated registries. Filter by jurisdiction and tier.
| Parameter | Type | Description |
|---|---|---|
| jurisdiction | string | ISO 3166-1 alpha-2 |
| tier | enum | root | sovereign | organisational |
Register a new sovereign or organisational registry.
| Body field | Type | Required | Description |
|---|---|---|---|
| display_name | string | Yes | Registry name |
| jurisdiction | string | Yes | ISO 3166-1 alpha-2 |
| tier | enum | Yes | sovereign | organisational |
| trust_anchors | array | Yes | Trust anchor objects |
| api_base_url | string (URI) | Registry API base URL |
Get a single registry record by ID.
Trust
Trust directory — keys, certificates, and attestations. The trust chain validates agent identity from root through sovereign registries to individual agents.
List all trust anchors in the registry.
{
"anchors": [{
"key_id": "gharra-root-2025",
"alg": "ES256",
"jwks_uri": "https://registry.symphonix.health/.well-known/jwks.json",
"thumbprint_sha256": "abc123...",
"role": "root",
"not_before": "2025-01-01T00:00:00Z",
"not_after": "2027-01-01T00:00:00Z"
}]
}
Get the full trust material bundle for an agent or registry. Includes certificates, JWKS, attestations, and delegation chain.
Events
Server-Sent Events (SSE) stream of registry changes with monotonic sequencing and resume cursor support.
Subscribe to real-time registry change events. Use the cursor parameter to resume from a previous position after disconnection.
Content-Type: text/event-stream
| Parameter | Type | Description |
|---|---|---|
| cursor | string | Resume cursor from a previous stream session |
| event_types | array | Filter by event type(s) |
curl -N -H "Authorization: Bearer <token>" \ "https://registry.symphonix.health/v1/events/stream?cursor=seq_42"
Billing
API key management and usage metering. Keys are scoped to an organisation and tier.
Create a new API key. The raw key is returned only once in the response — store it securely.
| Body field | Type | Required | Description |
|---|---|---|---|
| org_id | string | Yes | Organisation identifier |
| display_name | string | Yes | Human-readable key name |
| tier | string | Pricing tier (default: developer) | |
| scopes | array | Permission scopes (default: ["gharra:read"]) | |
| expires_at | datetime | ISO-8601 expiration timestamp |
{
"key_id": "gharra_key_01HXR...",
"raw_key": "gharra_sk_live_abc123...",
"org_id": "my-org",
"display_name": "Production Key",
"tier": "team",
"scopes": ["gharra:read", "gharra:write"],
"created_at": "2026-03-29T10:00:00Z"
}
List API keys for an organisation.
| Parameter | Type | Description |
|---|---|---|
| org_id | string | Filter by organisation ID |
Get API key details including active status, scopes, and last used timestamp.
Revoke an API key. Takes effect immediately.
Response: 204 Key revoked
Get usage summary for a caller. Filter by time range.
| Parameter | Type | Description |
|---|---|---|
| since | datetime | ISO-8601 start time |
| until | datetime | ISO-8601 end time |
Get live rate limit stats: daily count, daily limit, tokens remaining.
Get available pricing tiers and their rate limits.
Computer Use
Agentic browser automation via Claude (claude-opus-4-6). Admin-only endpoints for CI visual regression, compliance audits, and automated UI workflows.
Run a Claude computer-use task in a headless Chromium browser. Sessions are tracked in the transparency ledger.
| Body field | Type | Required | Description |
|---|---|---|---|
| task | string | Yes | Natural-language task description |
| url | string (URI) | URL to navigate to before starting | |
| persona | enum | observer | auditor | operator | clinician | security-analyst | |
| max_turns | integer | 1-50, default 20 | |
| headless | boolean | Default true |
Cancel a running computer-use session.
Capture a screenshot of a GHARRA frontend page. Useful for CI visual regression checks.
| Parameter | Type | Description |
|---|---|---|
| page | string | Page name: dashboard, agents, trust, federation, routing, audit, alerts, diagnostics, settings |
| base_url | string (URI) | Frontend URL (default: http://localhost:3000) |
Transport: JSON-RPC 2.0 over HTTPS — Auth: JWT HS256 (nexus:invoke scope) — Real-time: SSE + WebSocket
Tasks
Core task submission and retrieval. All agents expose a single POST / endpoint. The on-demand gateway at POST /rpc/{agent_alias} lazily starts target agents before proxying.
tasks/send
Submit a new unit of work to an agent. The primary method for all inter-agent communication.
Headers: Authorization: Bearer <JWT> — X-Agent-ID: <did:web:...>
{
"jsonrpc": "2.0",
"method": "tasks/send",
"params": {
"sender": "did:web:hospital.org:agents:triage",
"recipient": "did:web:lab.org:agents:pathology",
"message": {
"kind": "message",
"role": "user",
"parts": [{
"kind": "text",
"text": "Analyze this blood sample for Malaria."
}]
}
},
"id": "req-12345"
}
{
"jsonrpc": "2.0",
"result": {
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "submitted"
},
"id": "req-12345"
}
tasks/get
Poll task status and retrieve results.
{
"jsonrpc": "2.0",
"method": "tasks/get",
"params": { "task_id": "550e8400-..." },
"id": "req-12346"
}
Gateway proxy that lazily starts target agents and their dependencies before forwarding the JSON-RPC payload. Recommended for local development.
curl -X POST http://localhost:8100/rpc/triage_agent \ -H "Authorization: Bearer <jwt>" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"tasks/send","params":{"message":{"kind":"message","role":"user","parts":[{"kind":"text","text":"Patient presents with chest pain"}]}},"id":1}'
Clinician Avatar
Structured clinical consultation driven by medical interview frameworks (Calgary-Cambridge, SOCRATES, ABCDE). Maintains session state across multi-turn dialogue.
avatar/start_session
Begin a structured consultation. Framework is auto-selected: ABCDE for critical/emergency urgency, SOCRATES for pain-related complaints, Calgary-Cambridge for all others.
{
"jsonrpc": "2.0",
"method": "avatar/start_session",
"params": {
"patient_case": {
"chief_complaint": "Chest tightness with exertion",
"age": 54,
"gender": "male",
"urgency": "high"
},
"persona": {
"name": "Dr. Alex",
"role": "cardiologist"
}
},
"id": 1
}
Response includes session_id, selected framework, and an opening greeting.
avatar/patient_message
Send a patient utterance; receive a clinician response with consultation phase and framework progress.
{
"jsonrpc": "2.0",
"method": "avatar/patient_message",
"params": {
"session_id": "avatar-xxxxx",
"message": "I get chest tightness when climbing stairs."
},
"id": 2
}
Response includes clinician_response, consultation_phase, and framework_progress.
Text-to-speech with viseme timeline. Returns base64-encoded WAV audio and word-level lip-sync data.
Requires JWT authentication
{ "text": "How long have you had this tightness?", "voice": "alloy" }
Response: audio_b64 (WAV), visemes (timeline array), voice, mime_type
Utility Endpoints
Standard health and discovery endpoints that every Nexus agent exposes.
Agent health check. Must return a name field (persona display name) for Command Centre integration.
Agent capability card. Describes supported methods, transport bindings, and authentication requirements.
Model Context Protocol (MCP) Tools
The GHARRA Registry exposes its core capabilities as Model Context Protocol tools. Any MCP-compatible AI agent or LLM can invoke these tools directly — no custom integration code required. Transport: JSON-RPC 2.0 over stdio or SSE.
Discover healthcare AI agents by capability, jurisdiction, and trust posture. Returns ranked results with verifiable trust material. This is the primary entry point for AI agents that need to find other agents in the federation.
| Parameter | Type | Required | Description |
|---|---|---|---|
| capability | string | Yes | Required capability (e.g. fhir-r4-patient-search, consent.verify, radiology.summarise) |
| jurisdiction | string | ISO 3166-1 alpha-2 country code (e.g. GB, US, KE) | |
| protocol | string | Required protocol: nexus-a2a-jsonrpc | fhir-rest | hl7v2-mllp | |
| purpose_of_use | string | treatment | payment | operations | research | |
| limit | integer | Max results (1–100, default 20) |
{
"method": "tools/call",
"params": {
"name": "discover_agents",
"arguments": {
"capability": "fhir-r4-patient-search",
"jurisdiction": "GB",
"purpose_of_use": "treatment"
}
}
}
{
"content": [{
"type": "text",
"text": "Found 3 agents matching fhir-r4-patient-search in GB:\n1. NHS Spine PDS Agent (gharra://GB/agents/01HXR...)\n2. ..."
}]
}
Maps to: GET /v1/discover
Get a routing advisory for a target agent. Returns the optimal endpoint with failover alternatives, health signals, and a verifiable trust bundle. Use this before sending a task via Nexus A2A.
| Parameter | Type | Required | Description |
|---|---|---|---|
| target_agent_id | string | Yes | GHARRA URI of the agent (e.g. gharra://GB/agents/01HXR...) |
| caller_jurisdiction | string | Caller’s jurisdiction for cross-border policy evaluation | |
| purpose_of_use | string | treatment | payment | operations | research |
{
"method": "tools/call",
"params": {
"name": "route",
"arguments": {
"target_agent_id": "gharra://GB/agents/01HXR...",
"purpose_of_use": "treatment"
}
}
}
Maps to: POST /v1/route
Publish a new agent to the Global Agent Registry. The agent becomes discoverable by other agents and systems in the federation after trust validation completes.
| Parameter | Type | Required | Description |
|---|---|---|---|
| display_name | string | Yes | Human-readable agent name |
| jurisdiction | string | Yes | ISO 3166-1 alpha-2 country code |
| endpoint_url | string | Yes | Agent’s A2A endpoint URL |
| capabilities | array<string> | Yes | List of capability identifiers |
| protocol | string | Default: nexus-a2a-jsonrpc | |
| description | string | Agent description |
{
"method": "tools/call",
"params": {
"name": "register",
"arguments": {
"display_name": "Radiology Summariser",
"jurisdiction": "GB",
"endpoint_url": "https://rad.nhs.example/a2a",
"capabilities": ["radiology.summarise", "fhir-r4-diagnosticreport"]
}
}
}
Maps to: POST /v1/agents
MCP Server Configuration
Add the GHARRA MCP server to your claude_desktop_config.json or any MCP-compatible client:
{
"mcpServers": {
"gharra": {
"command": "npx",
"args": ["@symphonix-health/gharra-mcp-server"],
"env": {
"GHARRA_API_KEY": "your-api-key",
"GHARRA_REGISTRY_URL": "https://registry.symphonix.health"
}
}
}
}
Agent SDK
The GHARRA Python SDK wraps the REST API and MCP tools into a high-level client for agent developers. Install with pip install gharra.
High-level client for the GHARRA Registry. Handles authentication, pagination, and retry logic.
from gharra import RegistryClient # Initialise with API key or JWT client = RegistryClient( base_url="https://registry.symphonix.health", api_key="sk-..." # or token="eyJ..." ) # Discover agents agents = client.discover( capability="fhir-r4-patient-search", jurisdiction="GB" ) # Route to the best endpoint route = client.route(agents[0].agent_id) print(route.selected.url) # https://spine.nhs.uk/a2a # Send a task via Nexus A2A result = client.send_task( endpoint=route.selected.url, method="tasks/send", params={"query": "Find patient by MRN 00412"} )
Low-level JSON-RPC client for the Nexus A2A protocol. Handles transport negotiation (SSE/WebSocket), message streaming, and automatic reconnection.
from gharra.nexus import NexusClient nexus = NexusClient( endpoint="https://rad.nhs.example/a2a", token="eyJ..." ) # Streaming response via SSE async for event in nexus.stream_task( method="tasks/sendSubscribe", params={"query": "Summarise latest chest X-ray for MRN 00412"} ): print(event.status, event.message)
Full SDK documentation: SDK Quickstart Guide →
AI Agent Integration Patterns
Common patterns for integrating AI agents with the Symphonix Health platform. Each pattern composes the REST API, MCP tools, and Nexus A2A protocol into a production workflow.
Pattern 1: Discover → Route → Invoke
The standard three-step flow. An AI agent discovers available services, gets routing advice, and invokes the target agent via Nexus A2A.
1. discover_agents(capability="fhir-r4-patient-search") → MCP or REST 2. route(target_agent_id="gharra://GB/agents/...") → MCP or REST 3. tasks/send(query="Find patient by MRN 00412") → Nexus A2A JSON-RPC
Pattern 2: Multi-Agent Orchestration
BulletTrain orchestrates multiple agents in sequence — e.g. patient lookup → radiology summarisation → care plan generation. Each step uses discover/route/invoke with consent propagation.
# BulletTrain handles consent propagation across agent boundaries pipeline = client.create_pipeline([ {"capability": "fhir-r4-patient-search", "params": {"mrn": "00412"}}, {"capability": "radiology.summarise", "params": {"type": "chest-xray"}}, {"capability": "care-plan.generate", "params": {}} ]) result = await pipeline.execute(consent_token="eyJ...")
Pattern 3: Cross-Border Federation
Agents in different jurisdictions communicate through federated registries. The GHARRA federation protocol handles trust chain verification, data residency checks, and consent compatibility between sovereign registries.
# Agent in GB discovers agent in KE via federated registries agents = client.discover( capability="tb-screening", jurisdiction="RW", # target jurisdiction residency="RW", # data must stay in Rwanda token_binding="mtls_cnf_x5t_s256" # require mTLS binding ) # Trust chain: GB root → KE sovereign → KE org → agent
Interface Comparison
| Interface | Protocol | Best For | Auth |
|---|---|---|---|
| REST API | HTTP/JSON (OpenAPI 3.0) | Traditional integrations, admin dashboards, CI/CD | JWT / mTLS / DPoP |
| MCP Tools | JSON-RPC 2.0 (stdio/SSE) | AI agents, LLM tool use, Claude/GPT integrations | API key via env |
| Nexus A2A | JSON-RPC 2.0 (SSE/WebSocket) | Agent-to-agent communication, streaming results | JWT + consent tokens |
| Python SDK | Wraps REST + Nexus | Python applications, Jupyter notebooks, scripts | API key or JWT |
Error Codes
Combined error reference for both GHARRA REST and Nexus JSON-RPC APIs.
GHARRA HTTP Status Codes
| Status | Meaning | Details |
|---|---|---|
| 200 | OK / Idempotent replay | Request succeeded or mutation replayed via idempotency key |
| 201 | Created | Resource created (first call with idempotency key) |
| 204 | No Content | Successful deletion (e.g. API key revoked) |
| 404 | Not Found | Agent, registry, or resource not found |
| 409 | Conflict | Version conflict or idempotency key collision |
| 412 | Precondition Failed | ETag mismatch on optimistic concurrency update |
| 422 | Validation Error | Request body validation failed |
| 503 | Service Unavailable | Dependencies not installed (e.g. computer use) |
GHARRA error responses follow a standard structure:
{
"error": {
"code": "AGENT_NOT_FOUND",
"message": "Agent gharra://GB/agents/01HXR... not found",
"details": {},
"retryable": false,
"retry_after_ms": null
}
}
Nexus JSON-RPC Error Codes
| Code | Message | Meaning |
|---|---|---|
| -32700 | Parse error | Invalid JSON received |
| -32601 | Method not found | Agent does not support this method |
| -32001 | Authentication Failed | JWT missing, expired, or invalid signature |
| -32003 | Consent Denied | Requester does not have permission for this patient data |
Rate Limits
GHARRA enforces token-bucket rate limiting per API key. Five pricing tiers are available.
| Tier | Req/min | Req/day | Max Agents | Discovery/min | Routing/min | Federation | Events SSE | SLA |
|---|---|---|---|---|---|---|---|---|
| developer | 60 | 1,000 | 5 | 30 | 30 | No | No | — |
| team | 300 | 10,000 | 25 | 100 | 100 | No | Yes | 99.5% |
| business | 1,000 | 100,000 | 100 | 500 | 500 | Yes | Yes | 99.9% |
| scale | 5,000 | 1,000,000 | 500 | 2,000 | 2,000 | Yes | Yes | 99.95% |
| enterprise | Custom | Custom | Unlimited | Custom | Custom | Yes | Yes | 99.99% |
Check your live usage via GET /v1/admin/billing/usage/{caller_key}/live. Upgrade tiers via Pricing.
Data Models
Key schemas used across the GHARRA and Nexus APIs.
AgentRecord
Primary entity in the registry. Identified by gharra://<jurisdiction>/agents/<ulid>
| Field | Type | Description |
|---|---|---|
| agent_id | string | GHARRA URI identifier |
| display_name | string | Human-readable name |
| jurisdiction | string | ISO 3166-1 alpha-2 |
| status | enum | active | suspended | revoked | retired |
| endpoints | array<Endpoint> | url, protocol, priority, weight, health_url, region |
| capabilities | Capabilities | protocols, fhir_r4, consent_support, stream_resume |
| trust | TrustMaterial | certificates, signatures, attestations |
| owner | object | org_id, org_name, operator |
| version | integer | Optimistic concurrency version (used as ETag) |
RoutingResponse
Routing advisory with ranked endpoints and trust evidence.
| Field | Type | Description |
|---|---|---|
| resolved_target | string | Resolved agent URI |
| selected | object | Primary endpoint (url, protocol, region) |
| alternatives | array | Failover endpoints with priority ranking |
| trust_bundle | TrustBundle | Verifiable trust material |
| constraints | object | phi_allowed, max_concurrency_hint, rate_limit_rps_hint |
| evidence | object | registry_id, record_version, delegation_chain |
TrustAnchor
Cryptographic trust anchor in the registry chain.
| Field | Type | Description |
|---|---|---|
| key_id | string | Key identifier |
| alg | string | Algorithm (RS256, ES256, EdDSA) |
| jwks_uri | string (URI) | JWKS endpoint |
| role | enum | root | sovereign_registry | organisation | agent |
| not_before / not_after | datetime | Validity window |
Message (Nexus A2A)
Message object exchanged between agents via JSON-RPC.
| Field | Type | Description |
|---|---|---|
| kind | string | Must be "message" |
| role | string | "user" (requestor) or "agent" (responder) |
| parts | array<TextPart> | Content parts. TextPart: { kind: "text", text: "..." } |
ErrorResponse (GHARRA)
Standard error envelope for all GHARRA API errors.
| Field | Type | Description |
|---|---|---|
| error.code | string | Machine-readable error code |
| error.message | string | Human-readable description |
| error.details | object | Additional context |
| error.retryable | boolean | Whether the request can be retried |
| error.retry_after_ms | integer | Suggested retry delay in milliseconds |
Full JSON Schema definitions: GHARRA API Reference →