---
openapi: 3.0.1
info:
title: Fasten Connect
description: |-
Useful links:
- [Fasten Connect API repository](https://github.com/fastenhealth/fasten-connect-api)
- [Fasten Connect Developer Portal](https://github.com/fastenhealth/fasten-connect-app)
termsOfService: https://www.fastenhealth.com/
contact:
email: connect@fastenhealth.com
license:
name: Private
version: 1.0.11
externalDocs:
description: Find out more about Fasten Connect
url: https://www.fastenhealth.com/
servers:
- url: https://api.connect.fastenhealth.com/v1/
description: Use this server for both live and test mode.
# - url: https://api.connect-dev.fastenhealth.com/v1/
# description: UAT/internal testing ONLY. Do not use.
tags:
- name: auth
description: Portal Authentication & Signup
- name: user
description: Operations about user
- name: org
description: Operations about organization
- name: bridge
description: Customer (organization) facing APIs
- name: catalog
description: Catalog APIs
paths:
/bridge/catalog:
get:
tags:
- bridge
description: |-
Get branding & metadata information associated with healthcare institutions supported by Fasten Connect.
`brand_id` OR `portal_id` is required.
This is used to display branding information in the Stitch.js popup widget.
This API not required, unless you are building a custom widget.
**Do not call this endpoint live on every request.**
Fasten may occasionally merge or deprecate IDs when the source EHR data changes or deletes records. To avoid broken references and improve performance:
- Cache the results returned by this endpoint.
- To check for updates, use the `org_connection_id` to call the [status endpoint](/api-reference/organization_connection/get) and retrieve the current `brand_id` and `portal_id`.
- Then, use those values to query the catalog GET endpoint and update your cached results accordingly.
Following this pattern ensures you always have the latest data without risking failures from deprecated IDs.
TEFCA If `tefca_directory_id` and `brand_id` are available, you should retrieve both. `tefca_directory_id` will provide an accurate name for the Healthcare Provider, while the `brand_id` can be used for logos and other branding information. However, if you can only retrieve one, prioritize `tefca_directory_id`.
TEFCA Directory IDs are subject to change by the TEFCA governing body and may be deprecated without notice. TEFCA Directory IDs are only cached for 2 weeks, after which they are removed from the catalog.
parameters:
- name: api_mode
in: query
description: API Mode, used to filter institutions during lookup.
required: true
schema:
type: string
- name: public_id
in: query
description: Public ID for Organization credential. See Authentication for more information
required: true
schema:
type: string
- name: portal_id
in: query
description: Portal ID (required if Brand ID or TEFCA Directory ID is not set)
required: false
schema:
type: string
- name: brand_id
in: query
description: Brand ID (required if Portal ID or TEFCA Directory ID is not set)
required: false
schema:
type: string
- name: tefca_directory_id
in: query
description: TEFCA Directory ID (required if Portal ID or Brand ID is not set)
required: false
schema:
type: string
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
allOf:
- $ref: '#/components/schemas/ResponseWrapper'
- type: object
properties:
data:
type: object
anyOf:
- $ref: '#/components/schemas/CatalogPortal'
- $ref: '#/components/schemas/CatalogBrand'
/bridge/catalog/export:
get:
tags:
- bridge
description: |-
Download the full Fasten Connect catalog in bulk. This endpoint returns URLs for JSON files that contain all brands, portals, and endpoints that are currently available in our catalog.
Use this API when you need to hydrate or refresh an offline cache instead of repeatedly calling the catalog lookup endpoints.
The download URLs expire after 60 minutes. Begin downloading the files immediately after requesting them.
This API is rate limited and the data structure is subject to change. **Please contact support@fastenhealth.com before use.**
responses:
'200':
description: Download URLs for each catalog file
content:
application/json:
schema:
type: object
properties:
brands.json:
type: string
format: uri
description: Bulk metadata for every brand supported by Fasten Connect.
example: 'https://fasten-connect-cdn-prod-1234/catalog/2024-06-28/brands.json?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=60&...'
portals.json:
type: string
format: uri
description: Bulk metadata for every portal supported by Fasten Connect.
example: 'https://fasten-connect-cdn-prod-1234/catalog/2024-06-28/portals.json?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=60&...'
endpoints.json:
type: string
format: uri
description: Bulk metadata for every endpoint supported by Fasten Connect.
example: 'https://fasten-connect-cdn-prod-1234/catalog/2024-06-28/endpoints.json?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=60&...'
security:
- bridge_basic: []
/bridge/catalog/search:
post:
tags:
- bridge
description: |-
Search for healthcare institutions supported by Fasten Connect.
This is used to display branding information in the Stitch.js popup widget.
This API not required, unless you are building a custom widget.
This API is rate limited and is subject to change. **Please contact support@fastenhealth.com before use.**
parameters:
- name: api_mode
in: query
description: API Mode, used to filter institutions during search.
required: true
schema:
type: string
- name: public_id
in: query
description: Public ID for Organization credential. See Authentication for more information
required: true
schema:
type: string
requestBody:
description: Search for healthcare institution
content:
application/json:
schema:
type: object
properties:
searchAfter:
type: array
items:
type: string
description: Pagination information
example: [
"0.018018503",
"athena",
"athena"
]
query:
type: string
description: Search Query
example: 'athena'
required: true
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
data:
$ref: '#/components/schemas/LighthouseCatalogSearchResults'
/bridge/org:
get:
tags:
- bridge
description: |-
Get information about your organization. This is used to display branding information in the Stitch.js popup widget.
parameters:
- name: public_id
in: query
description: Public ID for Organization credential. See Authentication for more information
required: true
schema:
type: string
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
data:
$ref: '#/components/schemas/Organization'
/bridge/org_connection/{orgConnectionId}:
get:
tags:
- bridge
summary: Get Organization Connection information
description: |
Check the status of an existing organization connection.
This endpoint requires an API public id & private key for authentication. Do not expose these keys in the browser.
parameters:
- name: orgConnectionId
in: path
description: Patient Connection Id
required: true
schema:
type: string
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
data:
$ref: '#/components/schemas/OrganizationConnection'
security:
- bridge_basic: []
/bridge/vault_connection/revoke:
post:
tags:
- bridge
summary: Revoke TEFCA synthetic patient connections
description: |-
Run this command to reset a TEFCA synthetic test patient's connections.
TEFCA This helper endpoint is only available while using `test` API credentials and is designed for clearing your TEFCA IAS sandbox before running another end-to-end scenario.
Authenticate with HTTP Basic auth using your organization public id and private key that are configured for **Test API Mode**. Requests made with live credentials will be rejected.
The request body **must** include an `email` value for one of the test synthetic patients documented in the [TEFCA IAS Developer Guide](/guides/tefca-ias#example-test-patients). All current connections for that synthetic patient are revoked so you can start a fresh flow.
requestBody:
description: Identify the synthetic patient and the vault connections that should be revoked.
content:
application/json:
schema:
$ref: '#/components/schemas/VaultConnectionOrgRevokeRequest'
example:
email: dogbeaker@aol.com
required: true
responses:
'200':
description: Revoke operation completed.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
data:
$ref: '#/components/schemas/VaultConnectionOrgRevokeResponse'
security:
- bridge_basic: []
/bridge/connect:
get:
tags:
- bridge
description: |
This endpoint will generate a state value and redirect the user to their healthcare provider Patient Portal to authenticate with the healthcare provider's EHR.
On completion, Fasten Connect will redirect the user back to your redirect_uri with an `org_connection_id` and `endpoint_id` query parameter.
If an error occurred during the authentication process, Fasten Connect will redirect the user back with an `error` and `error_description` query parameter.
If you have configured more than one Redirect URL in the Fasten Connect Portal, you **MUST** include the `redirect_uri` query parameter in the request.
This is done automatically by the [Stitch SDK](stitch/v4/introduction) widget.
parameters:
- name: public_id
in: query
description: Public Key for Organization Credential
required: true
schema:
type: string
- name: endpoint_id
in: query
description: Catalog Endpoint Id
required: true
example: 'f4ea79fc-9a1b-43f0-be95-24247d666514'
schema:
type: string
- name: brand_id
in: query
description: Catalog Brand Id
required: true
example: '5e3839ed-6ae1-472b-b4b8-b5df098443c7'
schema:
type: string
- name: portal_id
in: query
description: Catalog Portal Id
required: true
example: 'd26f0b1c-82e7-4cb5-a4c4-55e73d48c016'
schema:
type: string
- name: redirect_uri
in: query
description: Redirect URI (where the user will be redirected after authentication). Must match a `redirect_uri` provided in the Fasten Connect Portal.
required: true
example: 'https://www.example.com'
schema:
type: string
format: uri
- name: external_id
in: query
description: An Opaque identifier, used to identify the patient in your system. This value will be returned in the Redirect URL response.
required: false
schema:
type: string
- name: external_state
in: query
description: An Opaque identifier, used to identify the connection request. This value should be unique. This value will be returned in the Redirect URL response.
required: false
schema:
type: string
responses:
"302":
description: Redirect
headers:
location:
description: Setup state based redirect
schema:
oneOf:
- type: string
description: If configuration is correct and valid for endpoint, catalog, brand and public id, Fasten Connect will
redirect to given redirect url
/bridge/reconnect:
get:
tags:
- bridge
description: |
This endpoint is used to reconnect an existing patient authorization with their healthcare provider's Patient Portal.
It generates a state value and redirects the user to the Patient Portal for re-authentication with the provider's EHR system.
This endpoint is only required if the existing connection id has expired or been revoked.
Upon successful completion, Fasten Connect will redirect the user back to the specified `redirect_uri` with the `org_connection_id` and `endpoint_id` query parameters.
If an error occurs during the re-authentication process, the user will be redirected back with `error` and `error_description` query parameters providing details about the failure.
If multiple Redirect URLs are configured in the Fasten Connect Portal, you **MUST** include the `redirect_uri` query parameter in the request. This is automatically handled by the [Stitch SDK](stitch/v4/introduction) widget.
TEFCA This endpoint CANNOT be used for TEFCA connections. TEFCA connections must be reconnected via the Stitch.js widget.
parameters:
- name: public_id
in: query
description: Public Key for Organization Credential
required: true
schema:
type: string
- name: redirect_uri
in: query
description: Redirect URI (where the user will be redirected after authentication). Must match a `redirect_uri` provided in the Fasten Connect Portal.
required: true
example: 'https://www.example.com'
schema:
type: string
format: uri
- name: reconnect_org_connection_id
in: query
description: Organization connection id, used for reconnecting existing patients
required: true
schema:
type: string
- name: external_id
in: query
description: An Opaque identifier, used to identify the patient in your system. This value will be returned in the Redirect URL response.
required: false
schema:
type: string
- name: external_state
in: query
description: An Opaque identifier, used to identify the connection request. This value should be unique. This value will be returned in the Redirect URL response.
required: false
schema:
type: string
responses:
"302":
description: Redirect
headers:
location:
description: Setup state based redirect
schema:
oneOf:
- type: string
description: If configuration is correct and valid for endpoint, catalog, brand and public id, Fasten Connect will
redirect to given redirect url
/bridge/fhir/ehi-export:
post:
tags:
- bridge
summary: Register EHI Export request
description: |
This endpoint is idempotent. If a request with the same `org_connection_id` has already been registered, it will return the existing request.
This endpoint will register an bulk medical record export request with the Fasten Connect API for the provided `org_connection_id` (Patient id)
This functionality is similar in design to the HL7 [EHI Export](https://build.fhir.org/ig/argonautproject/ehi-api/ehi-export.html) specification.
However it is designed to be a unified API for all EHRs, as many EHRs do not support the HL7 EHI Export specification.
This endpoint requires an API public id & private key for authentication. Do not expose these keys in the browser.
This task will run asynchronously and may take some time to complete.
You can check the status of the task using the [Get Request Status](/api-reference/ehi_export/get) endpoint.
On completion a webhook will be sent to your `webhook_url` with metadata about the task, and a `download_link` to download the results.
requestBody:
description: Update an existent pet in the store
content:
application/json:
schema:
type: object
properties:
org_connection_id:
type: string
format: uuid
description: Patient Connection Id
example: '16e39045-5382-42a0-b93d-b75268984c1f'
fixtures:
type: object
description: Optional testing fixtures for TEFCA API-mode exports.
properties:
tefca_ccda:
type: string
description: Force a specific synthetic CCDA response for TEFCA testing.
enum:
- myra-jones.xml
- lennie-connell.xml
- myra-jones-v2.xml
- myra-jones-v7.xml
- bernice-maxwell.xml
example: myra-jones.xml
required: true
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
data:
$ref: '#/components/schemas/EhiExportRequestStatus'
security:
- bridge_basic: []
/bridge/fhir/ehi-export/{taskId}:
get:
tags:
- bridge
summary: Get EHI Export Status/Results
description: |
Check the status of the EHI Export Task.
This is a polling endpoint intended for informational purposes only. It does not return the actual medical records or a `download_links` array.
Instead, the `download_links` will be sent asynchronously to a customer-defined [webhook](/webhooks/introduction).
We use [webhooks](/webhooks/introduction) to deliver the `download_links` because they are more reliable and scalable for background job completion.
Polling this endpoint repeatedly introduces unnecessary load and latency for your system and ours. Webhooks enable
instant delivery of results the moment they're ready.
**If your [webhook](/webhooks/introduction) is not configured, you will not be able to retrieve the exported EHI.**
This endpoint requires an API public id & private key for authentication. Do not expose these keys in the browser.
parameters:
- name: taskId
in: path
description: Task Id
required: true
schema:
type: string
responses:
'200':
description: successful operation
# headers:
# Location:
# schema:
# type: string
# format: uri
# description: Signed URL to download the file. Your HTTP client should be able to follow the redirect and download the file.
# example: 'https://api.connect.fastenhealth.com/v1/bridge/fhir/ehi-export/ffb14cd8bde66fa12351laf321/download/2024-04-03-098c09ef-887d-4aad-886c-d3ffd11750da.jsonl'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
data:
$ref: '#/components/schemas/EhiExportRequestStatus'
security:
- bridge_basic: []
/bridge/fhir/ehi-export/{taskId}/download/{fileId}:
get:
tags:
- bridge
summary: Download EHI-Export Task Results from S3
description: |
When provided with a `taskId` and `fileId`, this endpoint will return a signed URL to download the file in the `Location` header.
Your http client should be able to follow the redirect and download the file.
This signed URL will expire after a short period of time, so you should download the file immediately.
If you are unable to do so, you can request a new signed URL by calling this endpoint again.
This endpoint requires an API public id & private key for authentication. Do not expose these keys in the browser.
parameters:
- name: taskId
in: path
description: Task Id
required: true
schema:
type: string
- name: fileId
in: path
description: File Id to download
required: true
schema:
type: string
responses:
'200':
description: '200 Response'
headers:
Location:
schema:
type: string
format: uri
description: Signed URL to download the file
example: 'https://fasten-connect-production-files.s3.amazonaws.com/ehi-export/test/2024-04-03-098c09ef-887d-4aad-886c-d3ffd11750da.jsonl'
security:
- bridge_basic: [ ]
/support/request:
post:
tags:
- bridge
description: |-
File a support ticket with the Fasten team using our API.
This endpoint is in BETA and is not recommended for production use.
We reserve the right to remove this endpoint at any time.
This API is rate limited and is subject to change. **Please contact support@fastenhealth.com before use.**
parameters:
- name: public_id
in: query
description: Public ID for Organization credential. See Authentication for more information
required: true
schema:
type: string
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
requestBody:
description: Submit a support request
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: Email address for your team. We will use this to contact you about your request.
example: 'support@company.com'
name:
type: string
description: This should be the name of the individual who is filing the support request.
example: 'John Doe'
subject:
type: string
description: A short description of the issue.
example: 'Epic Sandbox test credentials do not work'
body:
type: string
description: A details description of the issue. Include any context that may be relevant.
required: true
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
components:
schemas:
ResponseWrapper:
type: object
properties:
success:
type: boolean
example: true
error:
type: string
example: ''
xml:
name: responseWrapper
Organization:
type: object
properties:
id:
type: string
format: uuid
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
name:
type: string
example: Example Inc.
logo_uri:
type: string
example: https://www.example.com/logo.png
privacy_policy_uri:
type: string
format: uri
example: https://www.example.com/privacy_policy
website_uri:
type: string
format: uri
example: https://www.example.com
plan:
type: string
example: free
status:
type: string
description: Organization Status
enum:
- active
- inactive
example: 'active'
xml:
name: organization
OrganizationConnection:
type: object
properties:
org_connection_id:
type: string
format: uuid
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
org_id:
type: string
format: uuid
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
catalog_brand_id:
type: string
format: uuid
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
catalog_portal_id:
type: string
format: uuid
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
catalog_endpoint_id:
type: string
format: uuid
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
tefca_directory_id:
type: string
example: 'urn:oid:2.16.840.1.111111.3.3126.2.3.33929.5'
description: (TEFCA) The TEFCA Network Directory ID associated with this connection, if applicable. Only available for TEFCA connections.
platform_type:
type: string
example: 'epic'
api_mode:
type: string
description: API Mode
enum:
- live
- test
status:
type: string
description: Connection Status
enum:
- authorized
- revoked
- refreshing
example: 'authorized'
scope:
type: string
description: FHIR Scopes granted by the patient. See https://hl7.org/fhir/smart-app-launch/scopes-and-launch-context.html
example: 'openid fhirUser offline_access patient/*.read'
consent_expires_at:
type: string
description: (Optional) This will be an RFC3339 timestamp which will specify when the patient’s consent to share data with your application will expire.Only some EHRs will provide this information. For EHRs that do not provide this information, this field will be omitted.
example: '2026-01-17T00:00:00Z'
xml:
name: organization_connection
VaultConnectionOrgRevokeRequest:
type: object
required:
- email
properties:
email:
type: string
format: email
description: Email address for one of the synthetic TEFCA IAS test patients listed in the [TEFCA IAS Developer Guide](/guides/tefca-ias#example-test-patients).
example: dogbeaker@aol.com
xml:
name: vault_connection_org_revoke_request
VaultConnectionOrgRevokeResponse:
type: object
properties:
request_id:
type: string
description: AWS request id associated with the revoke job.
example: f5d19ee8-6d53-4d17-b7f8-368d1fa41506
revoked:
type: array
description: The vault connection ids that were successfully revoked.
items:
type: string
example: ['vault_conn_12345']
xml:
name: vault_connection_org_revoke_response
LighthouseCatalogSearchResults:
type: object
properties:
hits:
type: object
properties:
total:
type: object
properties:
value:
type: integer
example: 1
hits:
type: array
items:
type: object
properties:
_type:
type: string
example: '_doc'
_id:
type: string
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
_score:
type: number
example: 1.0
sort:
type: array
items:
type: string
example: [
0.018018503,
"athena",
"athena"
]
_source:
type: object
allOf:
- $ref: '#/components/schemas/CatalogBrand'
- type: object
properties:
sort_name:
type: string
example: 'brand'
hidden:
type: boolean
example: false
platform_type:
type: string
example: 'epic'
xml:
name: lighthousecatalogsearch
CatalogBrand:
type: object
description: Branding information for a healthcare institution
properties:
id:
type: string
format: uuid
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
last_updated:
type: string
format: 'date-time'
example: '2024-04-03T10:00:00Z'
name:
type: string
example: 'Acme Health, Inc.'
brand_website:
type: string
format: uri
example: https://www.example.com/
aliases:
type: array
items:
type: string
example: ['Acme Health', 'Acme Health, Inc.']
description:
type: string
example: 'Acme Health, Inc. is a leading provider of healthcare services in the United States.'
portal_ids:
type: array
items:
type: string
format: uuid
example: [ '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6' ]
brand_ids:
type: array
items:
type: string
format: uuid
example: [ '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6' ]
xml:
name: catalogportal
CatalogPortal:
type: object
description: Patient Portal information for a healthcare institution
properties:
id:
type: string
format: uuid
example: '8d4136dd-31b6-4a65-88a0-7ea22a2b16d6'
last_updated:
type: string
format: 'date-time'
example: '2024-04-03T10:00:00Z'
name:
type: string
example: 'Acme Health, Inc.'
portal_website:
type: string
format: uri
example: https://www.example.com/privacy_policy
description:
type: string
example: 'Acme Health, Inc. is a leading provider of healthcare services in the United States.'
endpoint_ids:
type: array
items:
type: string
format: uuid
example: ['8d4136dd-31b6-4a65-88a0-7ea22a2b16d6']
xml:
name: catalogportal
EhiExportRequestStatus:
type: object
properties:
task_id:
type: string
format: string
description: Task Id
example: 'c9c7a91b66b34fdca749bb8e9cfbf617'
status:
type: string
enum:
- pending
- success
- failed
example: 'pending'
xml:
name: ehi_export_request_status
securitySchemes:
bridge_basic:
type: http
scheme: basic
description: |
[Basic Authentication](/api-reference/authentication), containing API Public Id and Private Key generated from the Fasten Connect Portal. **Do not expose these keys in the browser.**