LifeCare.ID® Developer Docs Public

Security & compliance

Integrating with LifeCare.ID means inheriting — and upholding — a small set of hard guarantees. This page states what the platform guarantees you, and what you must guarantee in return.


The zero-PHI invariant (the one rule above all)

For any data value d held by a resource holder R and delivered to a requester Q, the transfer R → Q is direct. No LifeCare.ID component is an intermediary, cache, proxy, or co-processor of d. LifeCare.ID participates only in {DID, public key, token, scope, consent receipt, revocation status}.

This is architectural, not a policy toggle. What it means for you:

A data source must additionally be able to demonstrate direct transfer (this is part of future conformance). An app accepts the obligation as part of the Network Developer Agreement (🛣️).


Identity & key custody


Token handling

Token Prefix Protect by
Session / user token lcs_ server-side storage, TLS, never in URLs/logs; honor logout
Data-access token (RPT) lc_ TLS, never logged; cache only to expires_at

The lcs_ session token doubles as the user token: when a resource server introspects it, it carries subject_did — proof the caller is that user, required for user-self actions (e.g. in-app consent). A lc_ access token never carries a subject; it names the data it unlocks via resource_owner. See Authorization & tokens.


Rate limits

A deployment can limit how fast the authentication routes are called (LIFECAREID_RATE_LIMITS: off, log_only or enforce; off unless the operator turns it on). When a limit is reached the route answers 429 with a Retry-After header in seconds and a JSON detail. Wait that long and send the request again; do not retry in a loop. The contract names the 429 on every route it can come from.

Routes Counted per Default
Passkey ceremonies: POST /v1/identity/register/begin and /finish, /v1/identity/auth/begin and /finish, /v1/identity/register, /v1/identity/pairing/exchange, /v1/recovery/finish, /v1/recovery/email/verify client address 600 per 5 minutes
Tokens: POST /token, POST /revoke, POST /v1/token client address 600 per 5 minutes
Token checks: POST /v1/token/introspect, POST /v1/identity/session/verify client address 600 per 5 minutes
POST /v1/recovery/begin client address, and the mailbox named 20 per 15 minutes, and 3 per 15 minutes
POST /v1/recovery/email client address, the session, and the mailbox named 200 per 5 minutes, 5 per hour, and 3 per hour

What this means for an integration:



Transport & storage


Your integration checklist

Apps - [ ] Token exchange runs server-side; client_secret never reaches a client. - [ ] PKCE S256 with a fresh per-attempt code_verifier; state validated. - [ ] HTTPS redirect URIs, exact-match registered. - [ ] Session + access tokens stored server-side, never logged or URL-borne. - [ ] No health value in any field sent to LifeCare.ID. - [ ] Graceful handling of revoked / expired grants and tokens.

Data sources - [ ] Introspect every request with your own client credentials (RFC 7662 §2.1; anonymous introspection is 401); enforce active + scope, and bind the request to the introspected resource_owner. (For a user-self action, require a user token whose subject_did matches the acting user instead.) - [ ] Serve data directly to the requester — never via LifeCare.ID. - [ ] Record each access (/v1/access/record). - [ ] Honor revocation within targets; don't over-cache active results. - [ ] Hold upstream provider credentials yourself, under an active grant; never send them (or any value) to LifeCare.ID. - [ ] Source has its own DID and signs its requests.


Node transparency — verify what you integrate with

A node publishes a public, CORS-open attestation at GET {node}/v1/attestation: the code commit, AI models (with licenses), and parameter version it is running, over a measurement it signs with its own key (ECDSA P-256). It carries no PHI.

LifeCare.ID hosts a public verifier, https://lifecare.id/verify, that checks a node's attestation in the browser: it recomputes the measurement from the published fields, verifies the signature, and looks the signing key up in the keys LifeCare.ID lists for that node (GET /v1/node-keys, declared by the node's operator). It works for any node: pass the address (?node=<url>) for a one-click "verify the node you're talking to" link you can surface to your users.

Verifying the node you integrate with is good hygiene; for high-assurance flows, treat the hardware-rooted attestation (roadmap) as the bar.


Reporting & contacts

Security issues with the platform should be reported to the network operator through the channel they provide at onboarding. 🛣️ A formal vulnerability disclosure policy and a status/changelog page are planned with the developer portal.


References