> ## Documentation Index
> Fetch the complete documentation index at: https://api.vitarelay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Integration checklist

> Everything a new integration needs, in the order you'll use it.

# Integration checklist

A short path from first call to production. Each item links to the detail.

<Steps>
  <Step title="Get a key and the right scopes">
    A VitaRelay admin issues your key. Ask for every scope your integration uses —
    see the [scopes table](/getting-started/api-keys#scopes). Use a `vr_test_` key first: it never
    charges and never touches real records ([Sandbox](/getting-started/sandbox)).
  </Step>

  <Step title="Create the patient once">
    `POST /patients` with your own `external_patient_id`. From then on use **your** id everywhere —
    you never have to store ours ([Packages, pricing and checkout](/getting-started/packages-and-pricing#patient-ids)).
  </Step>

  <Step title="Decide who pays">
    `billing_mode: patient_checkout` → the patient pays, at **your storefront prices**.
    `card_on_file` → your clinic pays, at catalog price. See
    [pricing](/getting-started/packages-and-pricing).
  </Step>

  <Step title="Place the order">
    `POST /orders` with products or a package (`item_kind: "bundle"`). Send an `external_order_id`.
    Show the patient `total_cents` / `checkout.amount_cents` — don't recompute it.
  </Step>

  <Step title="Take payment (patient pays)">
    Tokenize with Accept.js, then `POST /orders/{id}/pay`. Add `save_card: true`, or save a card
    first with `POST /patients/{id}/payment-methods`, if you'll create subscriptions.
  </Step>

  <Step title="Complete the intake if the order needs one">
    The order response includes an `intake` link. Complete it through your app with `POST /intakes`
    (`category` is `async` or `hormone`) or send the patient their link —
    [Intakes and prescriber review](/getting-started/intakes-and-prescriptions).
  </Step>

  <Step title="Subscribe to webhooks">
    Ask VitaRelay to subscribe your endpoint to the events you need and verify the signature
    ([Webhooks](/webhooks/overview)). At minimum: `order.paid`, `order.shipped`, `order.delivered`,
    `order.exception`, `intake.submitted`, `intake.reviewed`.
  </Step>

  <Step title="Know what's automatic">
    Patients are emailed in your brand — order confirmed, intake received, and an account link if they
    have no login ([Emails your patients receive](/getting-started/patient-emails)).
  </Step>
</Steps>

## Quick reference

| Need | Use |
| - | - |
| Retry safely | An `external_…_id` on the create call — see [Idempotency and retries](/getting-started/rest-api#idempotency-and-retries) |
| Patient reference | `patient_id` (UUID) **or** your `external_patient_id` |
| Intake `category` | `async` or `hormone` |
| Shipping speed | `shipping_method`: `ground` or `overnight` (patient-paid orders) |
| Consult fee | Always charged on 503A; shown as its own line or baked into your markup (your storefront setting) |
| 503B | Never in a patient store — Place Order only |
| Errors | [Error codes](/getting-started/errors) |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.