Download OpenAPI specification:
External API for Teambridge platform.
Date-Time Format: All date-time fields in this API use ISO 8601 format with timezone information (YYYY-MM-DDTHH:MM:SSZ).
Examples: 2025-06-05T09:00:00Z (UTC), 2025-06-05T09:00:00-07:00 (with timezone offset).
Authentication: This API uses OAuth 2.0 Client Credentials flow for authentication.
Filtering: The unified Collections API supports advanced filtering via query parameters. See the Collections (Unified API) section for full details.
Powerful generic endpoints for reading and writing any collection type.
Works with all collections using field UUIDs. Query /fields first to
discover the schema, then use these endpoints for flexible data access across
all collection types (shifts, users, placements, locations, custom collections, etc.).
The unified Collections API (/v1/collections/{collectionId}/records) supports powerful filtering via query parameters.
You can filter records by adding query parameters in the format {fieldUUID}_{operator}={value}.
Supported Operators:
_is: Exact match (all field types) - default if no suffix provided_contains: Partial text match (TEXT fields only)_gt: Greater than (NUMBER, DATETIME fields)_gte: Greater than or equal (NUMBER, DATETIME fields)_lt: Less than (NUMBER, DATETIME fields)_lte: Less than or equal (NUMBER, DATETIME fields)Filtering Features:
_is behaviorage_gte=21&age_lte=65 for range queries)2025-01-01) and full ISO 8601 format (2025-01-01T14:30:00Z)Reserved Parameters: The following parameter names are reserved and cannot be used as filter bases: page, size, limit, offset.
Filtering Examples:
?550e8400-..._is=john@example.com?550e8400-...=john@example.com (equivalent to _is)?550e8400-..._contains=john?abc123-..._is=2025-12-01?abc123-..._gte=2025-01-01&abc123-..._lte=2025-12-31?age-uuid-..._gte=21&age-uuid-..._lte=65?550e8400-..._is=john@example.com&7c9e6679-..._is=active?name-uuid-..._contains=john&age-uuid-..._gte=21Returns metadata about all collections for the account associated with the provided access token.
{- "metadata": {
- "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",
- "count": 1
}, - "collections": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Shifts"
}
]
}Returns all field definitions for a collection, including field identifiers, names, types, write format hints, select options (for native selects), and linked collection IDs (for link-to-object fields). Use this endpoint to discover the schema before reading or writing records.
| collectionId required | string <uuid> Unique ID of the collection |
{- "data": [
- {
- "id": "c5a8e667-fe00-4c18-a559-84bfdbf7e8d1",
- "name": "First Name",
- "readOnly": false,
- "type": "TEXT",
- "writeFormatHint": "plain_text"
}, - {
- "id": "df14fac6-ce85-480b-a5a8-0e5b90471205",
- "name": "Last Name",
- "readOnly": false,
- "type": "TEXT",
- "writeFormatHint": "plain_text"
}, - {
- "id": "199c7b23-5ba6-4cf4-a778-6da9394b7884",
- "name": "Email",
- "readOnly": false,
- "type": "EMAIL",
- "writeFormatHint": "email"
}, - {
- "id": "f7958d78-9e4c-4d23-a16e-ac732636b281",
- "name": "Phone",
- "readOnly": false,
- "type": "PHONE",
- "writeFormatHint": "e164_phone"
}, - {
- "id": "7064ba02-0ba2-48ca-9d0d-3698630b0050",
- "name": "Date of Birth",
- "readOnly": false,
- "type": "DATETIME",
- "writeFormatHint": "iso8601_datetime"
}, - {
- "id": "39336d37-1d19-4b84-9bf9-6d8e88938558",
- "name": "Certifications",
- "readOnly": false,
- "type": "LINK_TO_ROLE",
- "writeFormatHint": "comma_separated_uuids",
- "linkedCollectionId": "7822e1fa-dfde-4090-bf1e-bb41a31c763f"
}, - {
- "id": "e33d4a71-5140-4a30-afc7-567471a89c39",
- "name": "Assigned Facilities",
- "readOnly": false,
- "type": "LINK_TO_LOCATION",
- "writeFormatHint": "comma_separated_uuids",
- "linkedCollectionId": "b8e9e5a9-074d-4df2-a95a-4c8dbd5d8781"
}, - {
- "id": "1d566c20-accd-450f-afad-8c572f176bd0",
- "name": "Employment Status",
- "readOnly": false,
- "type": "SINGLE_SELECT",
- "writeFormatHint": "single_uuid",
- "selectOptions": [
- {
- "id": "bb31a869-2e73-4468-ab94-73ea256e08a2",
- "name": "Full-Time"
}, - {
- "id": "68ddbd25-b819-4362-add1-9c87c079515c",
- "name": "Part-Time"
}, - {
- "id": "4bfabc6f-f512-4c48-849b-8c94b83c215e",
- "name": "Per Diem"
}
]
}, - {
- "id": "5ef9a0a5-f7e5-42a7-af8c-927a9057c839",
- "name": "Specialties",
- "readOnly": false,
- "type": "MULTI_SELECT",
- "writeFormatHint": "comma_separated_uuids",
- "selectOptions": [
- {
- "id": "641367e5-0c24-4eb4-8b32-eda6a87540f3",
- "name": "ICU"
}, - {
- "id": "89667f7f-cc87-4246-9f10-e0cfe13fdd8c",
- "name": "ER"
}, - {
- "id": "4374192c-ece1-4475-9372-23dbe0f98527",
- "name": "Surgery"
}
]
}, - {
- "id": "0fe6e99f-8e3a-4f21-b315-3b149bcdf2f7",
- "name": "Created At",
- "readOnly": true,
- "type": "COMPUTED"
}, - {
- "id": "a943302a-5b1e-4ba9-b4c0-728c8e7fe2bd",
- "name": "Home Address",
- "readOnly": false,
- "type": "ADDRESS",
- "writeFormatHint": "plain_text"
}
], - "error": null
}Returns a paginated list of records for a collection. Each record is represented as a map of field UUIDs to values. Use the /fields endpoint first to get field metadata (names, types, write format hints) to interpret the data.
Filtering Support:
This endpoint supports filtering via query parameters in the format {fieldUUID}_{operator}={value}.
Supported Operators by Field Type:
_is (exact), _contains (partial match)_is, _gt, _gte, _lt, _lte_is, _gt, _gte, _lt, _lte_is_is_is behaviorFilter Examples:
?{email-field-uuid}_is=john@example.com?{name-field-uuid}_contains=john?{date-field-uuid}_gte=2025-01-01&{date-field-uuid}_lte=2025-12-31?{age-field-uuid}_gte=21&{age-field-uuid}_lte=65?{field1-uuid}_is=value1&{field2-uuid}_contains=value2| collectionId required | string <uuid> Unique ID of the collection |
| page required | integer >= 0 Default: 0 Zero-based page index |
| size required | integer [ 1 .. 50 ] Default: 20 Number of records per page (maximum 50) |
| enriched | boolean Default: false Whether to include additional partner data in the response |
{- "data": [
- {
- "c5a8e667-fe00-4c18-a559-84bfdbf7e8d1": "Sarah",
- "df14fac6-ce85-480b-a5a8-0e5b90471205": "Johnson",
- "199c7b23-5ba6-4cf4-a778-6da9394b7884": "sarah.johnson@hospital.com"
}, - {
- "c5a8e667-fe00-4c18-a559-84bfdbf7e8d1": "John",
- "df14fac6-ce85-480b-a5a8-0e5b90471205": "Doe",
- "199c7b23-5ba6-4cf4-a778-6da9394b7884": "john.doe@hospital.com"
}
], - "error": null
}Creates a new record in the collection. The request body should contain a map of field UUIDs to string values. Use the /fields endpoint to discover field IDs and their expected write formats (writeFormatHint).
| collectionId required | string <uuid> Unique ID of the collection |
required | object Map of field UUIDs to string values. Keys are the field identifiers (UUIDs), values are the field values formatted according to the field's writeFormatHint. |
{- "data": {
- "c5a8e667-fe00-4c18-a559-84bfdbf7e8d1": "Sarah",
- "df14fac6-ce85-480b-a5a8-0e5b90471205": "Johnson",
- "199c7b23-5ba6-4cf4-a778-6da9394b7884": "sarah.johnson@hospital.com",
- "f7958d78-9e4c-4d23-a16e-ac732636b281": "+14155551234",
- "7064ba02-0ba2-48ca-9d0d-3698630b0050": "1985-03-15T00:00:00Z",
- "39336d37-1d19-4b84-9bf9-6d8e88938558": "bb31a869-2e73-4468-ab94-73ea256e08a2,68ddbd25-b819-4362-add1-9c87c079515c",
- "1d566c20-accd-450f-afad-8c572f176bd0": "4bfabc6f-f512-4c48-849b-8c94b83c215e"
}
}{- "data": "Resource created with ID: 123e4567-e89b-12d3-a456-426614174000",
- "error": null
}Returns a single record identified by its UUID. The record is represented as a map of field UUIDs to values. Use the /fields endpoint to get field metadata.
| collectionId required | string <uuid> Unique ID of the collection |
| recordId required | string <uuid> Unique ID of the record |
| enriched | boolean Default: false Whether to include additional partner data in the response |
{- "data": {
- "c5a8e667-fe00-4c18-a559-84bfdbf7e8d1": "Sarah",
- "df14fac6-ce85-480b-a5a8-0e5b90471205": "Johnson",
- "199c7b23-5ba6-4cf4-a778-6da9394b7884": "sarah.johnson@hospital.com",
- "f7958d78-9e4c-4d23-a16e-ac732636b281": "+14155551234"
}, - "error": null
}Updates an existing record. The request body should contain a map of field UUIDs to string values for the fields you want to update. Only include fields that need to be changed. Use the /fields endpoint to discover field IDs and write formats.
| collectionId required | string <uuid> Unique ID of the collection |
| recordId required | string <uuid> Unique ID of the record to update |
required | object Map of field UUIDs to string values. Keys are the field identifiers (UUIDs), values are the field values formatted according to the field's writeFormatHint. |
{- "data": {
- "c5a8e667-fe00-4c18-a559-84bfdbf7e8d1": "Sarah",
- "df14fac6-ce85-480b-a5a8-0e5b90471205": "Johnson",
- "199c7b23-5ba6-4cf4-a778-6da9394b7884": "sarah.johnson@hospital.com",
- "f7958d78-9e4c-4d23-a16e-ac732636b281": "+14155551234",
- "7064ba02-0ba2-48ca-9d0d-3698630b0050": "1985-03-15T00:00:00Z",
- "39336d37-1d19-4b84-9bf9-6d8e88938558": "bb31a869-2e73-4468-ab94-73ea256e08a2,68ddbd25-b819-4362-add1-9c87c079515c",
- "1d566c20-accd-450f-afad-8c572f176bd0": "4bfabc6f-f512-4c48-849b-8c94b83c215e"
}
}{- "data": {
- "c5a8e667-fe00-4c18-a559-84bfdbf7e8d1": "Sarah",
- "df14fac6-ce85-480b-a5a8-0e5b90471205": "Johnson",
- "199c7b23-5ba6-4cf4-a778-6da9394b7884": "sarah.johnson@hospital.com",
- "f7958d78-9e4c-4d23-a16e-ac732636b281": "+14155551234",
- "8d74ff97-4cb5-49c8-af77-a3d98af4b1c2": false,
- "ade2b23c-6a3b-49fe-bc13-d37b0c39941c": 1234,
- "0fe6e99f-8e3a-4f21-b315-3b149bcdf2f7": "2024-01-15T10:30:00Z"
}, - "error": null
}Uploads a document file with optional metadata for the authenticated account.
Important: This endpoint requires multipart/form-data content type for file upload.
Limits:
The request consists of two parts:
file: The document file to upload (required)request: JSON metadata for the document (optional)| file required | string <binary> The document file to upload (max 100MB) |
object (CreateDocumentRequest) |
{- "data": {
- "recordId": "200c7b23-5ba6-4cf4-a332-6da9394b7112",
- "fileName": "certification.pdf",
- "contentType": "application/pdf"
}, - "error": null
}Endpoints for managing external system mappings. Mappings link Teambridge records to entities in external systems (like Bullhorn, ADP, etc.) by storing the external provider code, external ID, and object type.
Returns all external system mappings for a specific Teambridge record. Mappings link records to external system entities.
| recordId required | string <uuid> UUID of the Teambridge record to get mappings for |
{- "data": [
- {
- "mappingId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "recordId": "550e8400-e29b-41d4-a716-446655440000",
- "providerCode": "BULLHORN",
- "externalId": "EXT-12345",
- "externalObjectType": "Candidate",
- "createdAt": "2025-01-15T10:30:00Z"
}
], - "error": null
}Creates a new mapping linking a Teambridge record to an external system entity. Each mapping associates a record with an external provider, external ID, and object type.
| recordId required | string <uuid> ID of the record in Teambridge |
| providerCode required | string Code identifying the external provider |
| externalId required | string ID of the entity in the external system |
| externalObjectType required | string Type of the object in the external system |
{- "recordId": "550e8400-e29b-41d4-a716-446655440000",
- "providerCode": "BULLHORN",
- "externalId": "EXT-12345",
- "externalObjectType": "Candidate"
}{- "data": {
- "mappingId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "recordId": "550e8400-e29b-41d4-a716-446655440000",
- "providerCode": "BULLHORN",
- "externalId": "EXT-12345",
- "externalObjectType": "Candidate",
- "createdAt": "2025-01-15T10:30:00Z"
}, - "error": null
}Updates the external ID for an existing mapping. This is useful when the external system ID changes but the mapping relationship should be preserved.
| mappingId required | string <uuid> UUID of the mapping to update |
| externalId required | string New external ID for the mapping |
{- "externalId": "EXT-67890"
}{- "data": {
- "mappingId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "recordId": "550e8400-e29b-41d4-a716-446655440000",
- "providerCode": "BULLHORN",
- "externalId": "EXT-12345",
- "externalObjectType": "Candidate",
- "createdAt": "2025-01-15T10:30:00Z"
}, - "error": null
}Subscribe to events in Teambridge to receive real-time notifications when your data changes.
Account owners: configure your webhook subscriptions inside Settings > Account | Outbound webhooks
Choose a publicly-accessible HTTPS endpoint where we should send events. Select the events to which you would like to subscribe.
When you save the webhook subscription, a modal will show you your HMAC secret. Store this somewhere safe. The secret key lets you validate that events published to your endpoint come from us. If you lose your secret, you can rotate it and receive a new one.
All webhook requests include HMAC-SHA256 signatures for verification. The signature lets you know that this event came from Teambridge.
Request Headers:
X-Webhook-Signature: HMAC-SHA256 signature with sha256= prefix (e.g., sha256=abc123...)X-Webhook-Timestamp: Unix timestamp in seconds (when the webhook was sent)Content-Type: application/jsonSignature Verification:
X-Webhook-Timestamp and X-Webhook-Signature headers from the requestsha256= prefix from the signature header{timestamp}.{request_body} (use the raw request body string, not parsed JSON)Example Verification (Node.js):
First, check that the timestamp is recent (within 5 minutes):
const timestamp = request.headers['x-webhook-timestamp'];
const currentTime = Math.floor(Date.now() / 1000);
if (Math.abs(currentTime - timestamp) > 300) {
throw new Error('Webhook timestamp too old');
}
Then, compute the expected signature and compare. Note that you must use the raw request body string, not parsed JSON:
const crypto = require('crypto');
const signatureHeader = request.headers['x-webhook-signature'];
const signature = signatureHeader.replace('sha256=', '');
const rawBody = request.rawBody;
const signedPayload = `${timestamp}.${rawBody}`;
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(signedPayload)
.digest('hex');
if (!crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
)) {
throw new Error('Invalid webhook signature');
}
Best Practices:
event_id to deduplicate events200 OK - Webhook received and verified successfully400 Bad Request - Invalid signature or expired timestamp500 Internal Server Error - Processing error (will trigger retry)The webhook payload format is versioned. The current version is 1.0 (see the version field in the payload).
version field to handle different payload formatsIf your endpoint does not return 200 OK, Teambridge will retry the webhook
| version required | string Webhook payload version (current version is "1.0") |
| event_type required | string The type of event that triggered the webhook. Event types follow snake_case naming convention (e.g., shift_created, user_updated, location_deleted). |
| event_id required | string <uuid> Unique identifier for this webhook event. Use this for idempotent processing to prevent duplicate handling of the same event. |
| timestamp required | string <date-time> ISO 8601 timestamp when the event occurred |
| account_id required | string <uuid> The account ID where the event occurred |
required | object |
{- "version": "1.0",
- "event_type": "shift_updated",
- "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "timestamp": "2025-06-05T14:30:00Z",
- "account_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
- "data": {
- "action": "updated",
- "collection_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "record_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
- "actor": {
- "user_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
- "name": "Sarah Sherman"
}
}
}