The sign-in URL
Your storefront signs a patient in by sending their browser toGET /v1/auth/login, scoped to
your brand:
The endpoint answers with a redirect to the hosted Universal Login page — you can see it without
any credentials:
302 whose Location is the hosted sign-in page. Send the patient’s browser
through it and the platform does the rest: an emailed code, Google, or Apple — never a password —
then GET /v1/auth/callback completes the sign-in and starts the patient’s session. The full
sequence is in the identity handoff and
authentication guides.
The member portal origin
The member portal is the platform-hosted origin where your logged-in patients land: their plan, their orders, and the hosted identity step at/identity all live there. Your welcome kit names your brand’s
member origin — use it wherever your storefront links a patient “to their account”, and as the
base for the identity handoff link.
Like sign-in, the member portal starts on a shared platform domain and can move to your own.
Custom domains, self-serve
A custom domain is registered per kind —login for the sign-in page, member for the member
portal — with your own API key. A brand with no custom domain of a kind simply uses the shared
default; nothing in your flow is ever gated on registering one.
The ladder is the same for both kinds: choose a hostname → add the CNAME → verify → certificate
→ active.
1. Choose the hostname
2. Add the CNAME record
Create the record exactly as returned —name pointed at value — in your DNS provider. It is a
plain hostname pair, never a secret.
3. Verify and advance
409 —
call it again after a while; the call is idempotent at or past each state it drives to.
The two kinds finish differently:
- A login domain proceeds through certificate issuance to
activeon its own — verify until the row readsactive, and your patients sign in on your hostname. - A member domain verifies the same way but stops at the certificate-request state; the final
serving switch-on (
cert_issued→active) is performed by the platform’s operators once your certificate is issued. You will see the row advance toactivewithout further calls from you.
GET /v1/account/brands/{brand_id}/domains/{kind},
or list both — each row
carries its current state, so polling the read is how you watch the ladder move:
Removing a custom domain
DELETE /v1/account/brands/{brand_id}/domains/{kind}
removes the row and reverts that kind to the shared-domain default.
All the domain endpoints are key-scoped and tenant-isolated the same way as the rest of your
account surface: the path brand_id must match your X-Brand-Id, and a foreign, unknown, or
mismatched brand answers 404, never 403 — no cross-tenant existence leak.