AccelRx.ai

Developer Platform

AccelRx API Reference

One REST call submits a prior authorization; AccelRx runs the entire lifecycle — policy match, form-fill, submission, and appeal — and streams every status change back to you over signed webhooks. You integrate once; we do the work a coordinator would.

Introduction

The API is organized around cases. A case is one prior authorization for one patient + drug + payer. You create a case with the clinical and coverage details you already have; AccelRx handles the rest and notifies you as the case moves from pending_notes through submitted to approved or denied.

  • Base URLhttps://platform.accelrx.ai/v1
  • Format — JSON request and response bodies; UTF-8.
  • Tenancy — every key is scoped to one practice. You can only ever read or write that practice's cases.

Authentication

Authenticate every request with your secret API key in the Authorization header. Keys are issued by your AccelRx admin and shown exactly once — store them in a secrets manager, never in client code or version control.

curl https://platform.accelrx.ai/v1/ping \
  -H "Authorization: Bearer axk_live_your_key_here"

You can also pass the key as an X-API-Key header. All traffic is HTTPS-only; requests over HTTP are refused.

Create a case

POST /v1/cases

Submit the details you have. Only patient.name and medication.name are required; everything else sharpens the policy match and form-fill. Pass an idempotency_key to make retries safe — the same key always returns the same case.

curl https://platform.accelrx.ai/v1/cases \
  -H "Authorization: Bearer axk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "patient":   { "name": "Jane Public", "dob": "1980-05-05", "member_id": "M123456" },
    "medication":{ "name": "Wegovy 0.25mg", "quantity": "1", "days_supply": "28" },
    "diagnosis_code": "E66.01",
    "insurance": { "payer": "Aetna", "rx_bin": "610014", "rx_pcn": "ADV", "rx_group": "RX1515" },
    "prescriber":{ "name": "John Smith, MD", "npi": "1234567893" },
    "idempotency_key": "order_9f83c1"
  }'

Returns 201 with the created case (or 200 with the existing one on an idempotent match):

{
  "object": "case",
  "id": 241,
  "case_number": "PA-4575",
  "status": "pending_notes",
  "patient":   { "name": "Jane Public", "dob": "1980-05-05", "member_id": "M123456" },
  "medication":{ "name": "Wegovy 0.25mg", "quantity": "1", "days_supply": "28", "ndc": null },
  "diagnosis_code": "E66.01",
  "insurance": { "payer": "Aetna", "rx_bin": "610014", "rx_pcn": "ADV", "rx_group": "RX1515", "plan_type": null },
  "prescriber":{ "name": "John Smith, MD", "npi": "1234567893" },
  "coverage_score": null,
  "created_at": "2026-07-13T23:10:40",
  "updated_at": "2026-07-13T23:10:40"
}

Retrieve & list

GET /v1/cases/{id}
GET /v1/cases

Fetch a single case by id, or list your practice's cases. The list endpoint supports ?status=, ?limit= (max 100), and ?offset= for pagination.

curl "https://platform.accelrx.ai/v1/cases?status=approved&limit=25" \
  -H "Authorization: Bearer axk_live_..."
{ "object": "list", "data": [ /* cases */ ], "total": 42, "limit": 25, "offset": 0 }

Case events

GET /v1/cases/{id}/events

The full status + activity history of a case, oldest first — useful for reconciliation and audit.

Webhooks — register an endpoint

POST /v1/webhooks

Instead of polling, register an HTTPS URL and AccelRx will POST a signed event to it whenever a case changes. The endpoint must be publicly reachable over https. The signing secret is returned once — keep it to verify signatures.

curl https://platform.accelrx.ai/v1/webhooks \
  -H "Authorization: Bearer axk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://api.yourapp.com/hooks/accelrx",
        "events": ["case.status_changed", "case.approved", "case.denied"] }'
{ "object": "webhook_endpoint", "id": 3, "url": "https://api.yourapp.com/hooks/accelrx",
  "events": ["case.status_changed","case.approved","case.denied"], "active": true,
  "secret": "whsec_9c1f…"  /* shown once */ }

List endpoints with GET /v1/webhooks and deactivate one with DELETE /v1/webhooks/{id}.

Event types

  • case.created — a case was created via the API.
  • case.status_changed — the case status transitioned. The body carries data.previous_status.
  • case.approved — convenience alias fired alongside the status change on approval.
  • case.denied — fired on denial.

Every delivery body is { "id": "evt_…", "type": "…", "created": 1752…, "data": { /* the case */ } }. The data block matches a GET /v1/cases/{id} response, so you can treat both paths identically.

Verifying signatures

Each request carries an X-AccelRx-Signature header of the form t=<unix>,v1=<hex>, where v1 is HMAC-SHA256(secret, "<t>.<raw-body>"). Recompute it over the raw request body and compare in constant time; reject timestamps older than a few minutes to prevent replay.

import hmac, hashlib, time

def verify(secret, raw_body, header):
    parts = dict(kv.split("=", 1) for kv in header.split(","))
    ts, sig = parts["t"], parts["v1"]
    if abs(time.time() - int(ts)) > 300:
        return False                       # stale — possible replay
    expected = hmac.new(secret.encode(),
                        f"{ts}.".encode() + raw_body,
                        hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, sig)

Respond 2xx quickly to acknowledge. AccelRx retries failed deliveries with backoff and auto-disables an endpoint after repeated failures.

Errors

Errors return a conventional HTTP status and a JSON body { "error": { "code": "…", "message": "…" } }.

  • 401 missing_credentials / invalid_key / revoked_key — bad or missing API key.
  • 403 insufficient_scope / key_not_provisioned — the key lacks the scope or isn't tied to a practice.
  • 400 missing_field / invalid_url / invalid_request — malformed request.
  • 404 not_found — the resource doesn't exist, or isn't yours.

Need a key or a higher rate limit? Talk to us. The API is for platform, pharma, and health-system partners.