Connect
Hosted Connect: provider search, source authorization, and consent in one link.
One hosted link takes a patient from provider search to a signed consent receipt.
Your backend creates one Connect session and sends the patient to its hosted URL. FinchNode handles provider search, sign-in on the health system’s own SMART on FHIR page, the import, and a separate sharing decision, then exposes an app-scoped pseudonymous subject once the session is completed.
What it is
Built for: Teams that need patient-authorized records without building per-vendor OAuth.
Base URL: https://api.finchnode.com/api/v1
Authentication: Send an app-scoped key as a Bearer token from your backend: Authorization: Bearer ck_test_... for sandbox keys, which read only sandbox connections, or Authorization: Bearer ck_live_... for live keys, which read only production connections and which eligible applications create in the self-service console. Keys are hashed at rest, revocable, and must never be embedded in browser or mobile code.
Create a free account to get sandbox keys: https://finchnode.com/signup
At a glance
- Status
- Available
- Auth
- Sandbox or live API key
- Contract
- OpenAPI 3.1
- Authenticated MCP endpoint (API key)
https://api.finchnode.com/api/mcp
Documents for this product
Try it in 30 seconds
Set FINCHNODE_API_KEY once in the shell that runs these commands or starts your agent client (replace ck_test_... with your sandbox key; it is the only key value to substitute)
export FINCHNODE_API_KEY=ck_test_...
Create a sandbox Connect session
curl -X POST https://api.finchnode.com/api/v1/connect/sessions -H "Authorization: Bearer $FINCHNODE_API_KEY" -H "Idempotency-Key: <a fresh UUID>" -H "Content-Type: application/json" -d '{"returnUrl":"http://localhost:3000/return"}'
Sandbox keys start with ck_test_ and are created with your free account. A completed session exposes the app-scoped subject, and GET /users lists the app’s subjects in cursor pages; follow nextCursor while hasMore is true.
Expected response: 201 with a connect_session: an id (cs_ followed by 20 hex characters), status, categories, syncMode, durationDays, a sync object, subject null until completion, and a single-use url that expires after 24 hours. Send the patient to url.
For coding agents
Three ways in for a coding agent: connect the MCP endpoint below, load the OpenAPI document (https://finchnode.com/openapi.yaml), or fetch this page as markdown (https://finchnode.com/products/hosted-connect.md). https://finchnode.com/llms.txt lists every product’s markdown twin.
Authenticated MCP endpoint (API key)
- MCP endpoint
https://api.finchnode.com/api/mcp- Transport
- Streamable HTTP (JSON-RPC over POST)
- Auth
- Authorization: Bearer ck_test_... (sandbox keys) or Authorization: Bearer ck_live_... (live keys)
- Clients
- Server-side and desktop MCP clients only; the endpoint is not CORS-enabled
- MCP Registry name
- com.finchnode/health-records
Tools at https://api.finchnode.com/api/mcp
- create_connect_session
- get_connect_session
- cancel_connect_session
Claude Code
claude mcp add --scope project --transport http finchnode https://api.finchnode.com/api/mcp --header 'Authorization: Bearer ${FINCHNODE_API_KEY}'
Claude Code writes this server to the project's .mcp.json, which is meant to be checked into version control and shared with the project, and expands ${FINCHNODE_API_KEY} when it connects, so the file never holds the key: set FINCHNODE_API_KEY in the shell that runs Claude Code.
Codex CLI
codex mcp add finchnode --url https://api.finchnode.com/api/mcp --bearer-token-env-var FINCHNODE_API_KEY
Cursor (.cursor/mcp.json)
{
"mcpServers": {
"finchnode": {
"url": "https://api.finchnode.com/api/mcp",
"headers": {
"Authorization": "Bearer ${env:FINCHNODE_API_KEY}"
}
}
}
}
Machine-readable resources
How it works
Create a session from your backend
Request the narrowest categories the displayed purpose needs; they must be within the app allowlist. Set syncMode to one-time or continuous, durationDays from 1 to 730 (default 365), an opaque externalId with no names, email addresses, or health data, and a returnUrl. Reusing an Idempotency-Key with the identical body recovers the original session and sets Idempotent-Replayed: true; a different body returns 409 idempotency_conflict.
curl -X POST https://api.finchnode.com/api/v1/connect/sessions -H "Authorization: Bearer $FINCHNODE_API_KEY" -H "Idempotency-Key: connect-account-123-v1" -H "Content-Type: application/json" -d '{"externalId":"account_123","categories":["demographics","medications","labs"],"syncMode":"continuous","durationDays":365,"returnUrl":"https://app.example.com/settings/health"}'
Send the patient to the hosted URL
The url in the response is single-use and expires after 24 hours. The patient finds their provider, signs in on the provider or EHR authorization page, approves access, and separately consents to share the requested data with your application. Hospital usernames and passwords do not pass through FinchNode.
GET {url} # the single-use session url from the 201 response, opened in the patient’s browser
Get a sandbox subject
Use the session from step 1 (its id is SESSION_ID) instead of creating another; created with a sandbox key, it is a sandbox session. A sandbox session needs no real patient: either open its hosted url yourself and choose one of the FinchNode Scenario Sandbox organizations listed above the search, which connects a synthetic source without a hospital sign-in (the account and consent steps are unchanged), or POST /connect/sessions/{sessionId}/simulate with a scenario and poll the session until simulation.state is completed. Either way the completed session exposes the subject (its id is SUBJECT), and GET /users lists the app’s subjects.
curl -X POST https://api.finchnode.com/api/v1/connect/sessions/$SESSION_ID/simulate -H "Authorization: Bearer $FINCHNODE_API_KEY" -H "Content-Type: application/json" -d '{"scenario":"baseline-adult"}'
Observe truthful readiness
Poll the session or wait for the consent.granted webhook. The sync object reports queued, syncing, then complete, partial, failed, or reauthorization_required, with available and missing categories. Only status: completed exposes subject, and only after the patient’s sharing consent.
curl https://api.finchnode.com/api/v1/connect/sessions/$SESSION_ID -H "Authorization: Bearer $FINCHNODE_API_KEY"
Cancel a session the patient will not finish
An incomplete session can be closed. Repeating the request is safe.
curl -X POST https://api.finchnode.com/api/v1/connect/sessions/$SESSION_ID/cancel -H "Authorization: Bearer $FINCHNODE_API_KEY"
Reference
Endpoints| Method | Path | OpenAPI operationId |
|---|
| POST | https://api.finchnode.com/api/v1/connect/sessions | createConnectSession |
| GET | https://api.finchnode.com/api/v1/connect/sessions/{sessionId} | getConnectSession |
| POST | https://api.finchnode.com/api/v1/connect/sessions/{sessionId}/cancel | cancelConnectSession |
What it does not do
- It never collects hospital passwords: patients sign in on the hospital, payer, or EHR authorization page, and their credentials do not pass through FinchNode or your application.
- It does not treat system-selected or an existing OAuth connection as share readiness: subject appears only when status is completed, after the patient’s second consent.
- It never records a share receipt while sync is unfinished or when none of the requested categories are shareable.
- It is patient-directed and read-only. It is not a replacement for provider-facing HL7 feeds, EHR write-back, scheduling, or every enterprise interface workflow.
- Record availability depends on the organization a patient selects, the scopes it grants, and the patient authorization behind each connection.
Frequently asked questions
How do patients connect their hospital records?
Your application creates a Connect session and sends the patient to a hosted flow. The patient finds their provider, signs in on the provider or EHR authorization page, approves access, and separately consents to share the requested data with your application.
Does FinchNode receive a patient’s hospital password?
No. Patients enter their credentials on the hospital, payer, or EHR authorization page. Hospital usernames and passwords do not pass through FinchNode.
Do I need to build a separate OAuth flow for every EHR?
No. Your product creates one FinchNode Connect session. FinchNode’s hosted flow handles provider search, source authorization, connection state, and the patient consent experience for supported systems.
Is it safe to retry session creation?
Yes, with the same Idempotency-Key and the identical body: FinchNode returns the original session and sets Idempotent-Replayed: true. Reusing the key with a different body returns 409 idempotency_conflict.
Which EHRs and hospital systems can FinchNode connect to?
FinchNode has 17 EHR and payer integrations. Record availability depends on the organization a patient selects, the scopes it grants, and the patient authorization behind each connection.