NAV
shell

Introduction

Bullhorn Data Hub is a flexible data structure to store data for reporting and analytics across Bullhorn, marketplace partners, and external sources. It is built directly within the Bullhorn ATS Platform to help customers consolidate their staffing and relevant business data in a single location. This reference guide provides information about each Data Hub API operation and supported entity type.

Data Hub Entities

EdsSourceSystem

Represents the external system sending data. This entity’s name is represented as sourceSystem when making Data Hub API requests. See POST / PUT /data-hub/sourceSystem section of Data Hub API for more details.

EdsSourceSystem field Type Description Not null Read-only
name String(64) Name of the source system. X
display String(64) How the source system will be displayed. X

EdsEntityType

Represents a category of data in the source system. This entity’s name is represented as entityType when making Data Hub API requests. See POST / PUT /data-hub/entityType section of Data Hub API for more details.

EdsEntityType field Type Description Not null Read-only
sourceSystem To-one association Source system associated with entity type. X
name String(64) Name of the entity type. X
display String(64) How the entity type will be displayed. X
isPrivate Boolean Determines whether an entity type is private or not. X

EdsEntityTypeSchemaVersion

Represents the structure of data for an entity type. This entity’s name is represented as entityTypeSchemaVersion when making Data Hub API requests. See POST / PUT /data-hub/entityTypeSchemaVersion section of Data Hub API for more details.

EdsEntityTypeSchemaVersion field Type Description Not null Read-only
entityType To-one association Entity type associated with schema version. X
schema String The structure of data for an entity type. X
description String Description of the schema version. X
name String(64) Name of the schema version. X

EdsData

Represents an individual data entry identified by entity type ID and source ID. This entity’s name is represented as data when making Data Hub API requests. See POST /data-hub/data section of Data Hub API for more details.

EdsData field Type Description Not null Read-only
sourceId String(64) Unique identifier for records within a source system. X
entityType To-one association Entity type associated with data record. X
entityTypeSchemaVersion To-one association Schema version associated with data record. X
sourceId String(64) Unique identifier for records within a source system. X
dateAddedInSourceSystem Timestamp Date the record was added in source system. X
dateLastModifiedInSourceSystem Timestamp Date the record was last updated in source system. X
payload String JSON object defined by entity type schema. X
isDeleted Boolean Indicates whether this record has been marked as deleted. X
placementId Integer Identifier for placement.
candidateId Integer Identifier for candidate.
clientContactId Integer Identifier for contact.
clientCorporationId Integer Identifier for corporation.
jobOrderId Integer Identifier for job.
jobSubmissionId Integer Identifier for job submission.
leadId Integer Identifier for lead.
opportunityId Integer Identifier for opportunity.
corporateUserId Integer Identifier for corporate user.
noteId Integer Identifier for note.
appointmentId Integer Identifier for appointment.
payableChargeId Integer Identifier for payable charge.
billableChargeId Integer Identifier for billable charge.

Data Hub API

The Data Hub API allows partners to pass customer data to Data Hub where it is replicated onwards to Bullhorn Analytics and Data Replicator. All Data Hub API calls must be made with a valid BH REST Token and accepts UTF-8 encoded JSON via HTTP. This will section list examples of all the Data Hub endpoints.

The Data Hub API is secured in the same manner as the Bullhorn REST API. For a full guide on logging into the API and authorizing a request please follow this documentation: Authorization

POST /data-hub/data

curl https://rest{swimlane#}.bullhornstaffing.com/rest-services/e999/data-hub/data

# Example Request
[
    {
        "sourceSystem": "sourceSystemName",
        "entityType": "entityTypeName",
        "schemaVersion": "schemaVersionName",
        "items": [
            {
                "sourceId": 1,
                "dateAddedInSourceSystem": "2024-11-31T17:48:17.182+00:00",
                "dateLastModifiedInSourceSystem": "2024-11-31T17:48:17.182+00:00",
                "payload": "{ \"name\": \"bob\", \"age\": 25, \"address\": { \"street\": \"789 Main St\", \"city\": \"New York\", \"state\": \"NY\", \"postalCode\": \"10001\" }, \"hobbies\": [\"reading\", \"running\"] }",
                "isDeleted": false,
                "placementId": 107,
                "candidateId": 123,
                "clientContactId": 55,
                "clientCorporationId": 55,
                "jobOrderId": 123,
                "jobSubmissionId": 123,
                "leadId": 123,
                "opportunityId": 465,
                "corporateUserId": 123,
                "noteId": 123,
                "appointmentId": 123,
                "payableChargeId": 123,
                "billableChargeId": 134
            },
            {
                "sourceId": 2,
                "dateAddedInSourceSystem": "2024-11-31T17:48:17.182+00:00",
                "dateLastModifiedInSourceSystem": "2024-11-31T17:48:17.182+00:00",
                "payload": "{ \"name\": \"sam\", \"age\": 30, \"address\": { \"street\": \"123 Main St\", \"city\": \"Dallas\", \"state\": \"TX\", \"postalCode\": \"75001\" }, \"hobbies\": [\"gaming\", \"running\"] }",
                "isDeleted": false,
                "placementId": 107,
                "candidateId": 123,
                "clientContactId": 55,
                "clientCorporationId": 55,
                "jobOrderId": 123,
                "jobSubmissionId": 123,
                "leadId": 123,
                "opportunityId": 465,
                "corporateUserId": 123,
                "noteId": 123,
                "appointmentId": 123,
                "payableChargeId": 123,
                "billableChargeId": 134
            }
            // up to 100 items
        ]
    }
]

# Example Response
{
    "statusCode": 200,
    "messages": [],
    "data": [
        {
            "entityType": "entityTypeName",
            "sourceSystem": "sourceSystemName",
            "totalSuccessfulItems": 1,
            "successfulItems": [
                {
                    "sourceId": "1",
                    "dataId": 1234
                },
                {
                    "sourceId": "2",
                    "dataId": 1235
                }
            ]
        }
    ]
}

Upserts up to 100 records to Data Hub. Payload must be formatted according to schema definition setup for the corporation.

HTTP Request

{corpToken}/data-hub/data

Parameter Required Description
BhRestToken yes Token that represents a session established by the login process. Must be sent with all subsequent requests to the API. The session key can be provided in the BhRestToken query string, a cookie, or an HTTP header.

POST /data-hub/data/find

curl https://rest{swimlane#}.bullhornstaffing.com/rest-services/e999/data-hub/data/find

# Example Request
{
    "criteria": {
        "and": [
            {
                "entityType.name": {
                    "equalTo": "entityTypeName"
                }
            },
            {
                "sourceId": {
                   "in": ["2","7"] 
                }
            },
            {
                "entityType.sourceSystem.name": {
                    "equalTo": "sourceSystemName"
                }
            }
        ]
    }
}

# Example Response
{
    "statusCode": 200,
    "messages": null,
    "data": {
        "start": 0,
        "count": 1,
        "total": 1,
        "data": [
            {
                "dataId": 1234,
                "sourceId": "2",
                "entityType": {
                    "entityTypeId": 241,
                    "name": "entityTypeName"
                },
                "entityTypeSchemaVersion": {
                    "entityTypeSchemaVersionId": 441,
                    "name": "schemaVersionName"
                },
                "dateAdded": "2025-01-10T22:56:18.012+00:00",
                "dateLastModified": "2025-01-10T22:56:18.012+00:00",
                "dateAddedInSourceSystem": "2024-12-01T17:48:17.000+00:00",
                "dateLastModifiedInSourceSystem": "2024-12-01T17:48:17.000+00:00",
                "payload": "{ \"name\": \"John Smith\", \"age\": 25, \"address\": { \"street\": \"789 Main St\", \"city\": \"New York\", \"state\": \"NY\", \"postalCode\": \"10001\" }, \"hobbies\": [\"reading\", \"running\"] }",
                "isDeleted": false,
                "candidateId": 123,
                "clientContactId": 10,
                "clientCorporationId": 456,
                "jobOrderId": 123,
                "jobSubmissionId": 123,
                "placementId": 123,
                "leadId": 123,
                "opportunityId": 123,
                "corporateUserId": 123,
                "noteId": 123,
                "appointmentId": 123,
                "payableChargeId": 123,
                "billableChargeId": 134,
                "entityId": 342
            }
        ]
    }
}

Used to lookup and view Data Hub records using adaptive query.

HTTP Request

{corpToken}/data-hub/sourceSystem

Parameter Required Description
BhRestToken yes Token that represents a session established by the login process. Must be sent with all subsequent requests to the API. The session key can be provided in the BhRestToken query string, a cookie, or an HTTP header.

POST / PUT /data-hub/sourceSystem

curl https://rest{swimlane#}.bullhornstaffing.com/rest-services/e999/data-hub/sourceSystem

# Example Request
{
    "name": "sourceSystemName",
    "display": "sourceSystemDisplay"
}

# Example Response
{
    "changedEntityType": "SourceSystem",
    "changedEntityId": 293,
    "changeType": "INSERT",
    "data": {
        "name": "sourceSystemName",
        "display": "sourceSystemDisplay"
    }
}

Used to add or update source systems.

HTTP Request

{corpToken}/data-hub/sourceSystem and {corpToken}/data-hub/sourceSystem/{sourceSystemId}

Parameter Required Description
BhRestToken yes Token that represents a session established by the login process. Must be sent with all subsequent requests to the API. The session key can be provided in the BhRestToken query string, a cookie, or an HTTP header.

POST / PUT /data-hub/entityType

curl https://rest{swimlane#}.bullhornstaffing.com/rest-services/e999/data-hub/entityType

# Example Request
{
    "sourceSystem": {
        "id": 293 // Can also associate source system using sourceSystem.name
    },
    "name": "entityTypeName",
    "display": "entityTypeDisplay",
    "isPrivate": true
}

# Example POST Response
{
    "changedEntityType": "EntityType",
    "changedEntityId": 311,
    "changeType": "INSERT",
    "data": {
        "display": "TiffTests33",
        "name": "TiffTestLetsGO!CertVid-2234",
        "sourceSystem": {
            "id": 293
        },
        "isPrivate": true
    }
}

Used to add or update entity types.

HTTP Request

{corpToken}/data-hub/entityType and {corpToken}/data-hub/entityType/{entityTypeId}

Parameter Required Description
BhRestToken yes Token that represents a session established by the login process. Must be sent with all subsequent requests to the API. The session key can be provided in the BhRestToken query string, a cookie, or an HTTP header.

POST / PUT /data-hub/entityTypeSchemaVersion

curl https://rest{swimlane#}.bullhornstaffing.com/rest-services/e999/data-hub/entityTypeSchemaVersion

# Example Request associating entity type by entityTypeId
{
    "entityType": {
        "id": 311
    },
    "schema": "{\n  \"$id\": \"https://example.com/person.schema.json\",\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"description\": \"Schema for a person with name, age, address, and hobbies\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"name\": {\n      \"type\": \"string\",\n      \"description\": \"Name of the person\"\n    },\n    \"age\": {\n      \"type\": \"integer\",\n      \"description\": \"Age of the person\"\n    },\n    \"address\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"street\": {\n          \"type\": \"string\",\n          \"description\": \"Street address\"\n        },\n        \"city\": {\n          \"type\": \"string\",\n          \"description\": \"City name\"\n        },\n        \"state\": {\n          \"type\": \"string\",\n          \"description\": \"State abbreviation\"\n        },\n        \"postalCode\": {\n          \"type\": \"string\",\n          \"description\": \"Postal code\"\n        }\n      },\n      \"required\": [\"street\", \"city\", \"state\", \"postalCode\"],\n      \"description\": \"Address of the person\"\n    },\n    \"hobbies\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"description\": \"List of hobbies\"\n    }\n  },\n  \"required\": [\"name\", \"age\", \"address\", \"hobbies\"]\n}",
    "description": "New Schema Version",
    "name":"schemaVersionName"
}

# Example Request associating entity type by entityTypeName and sourceSystemName
{
    "entityType": {
        "name": "entityTypeName",
         "sourceSystem": {
            "name": "sourceSystemName"
        }
    },
    "schema": "{\n  \"$id\": \"https://example.com/person.schema.json\",\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"description\": \"Schema for a person with name, age, address, and hobbies\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"name\": {\n      \"type\": \"string\",\n      \"description\": \"Name of the person\"\n    },\n    \"age\": {\n      \"type\": \"integer\",\n      \"description\": \"Age of the person\"\n    },\n    \"address\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"street\": {\n          \"type\": \"string\",\n          \"description\": \"Street address\"\n        },\n        \"city\": {\n          \"type\": \"string\",\n          \"description\": \"City name\"\n        },\n        \"state\": {\n          \"type\": \"string\",\n          \"description\": \"State abbreviation\"\n        },\n        \"postalCode\": {\n          \"type\": \"string\",\n          \"description\": \"Postal code\"\n        }\n      },\n      \"required\": [\"street\", \"city\", \"state\", \"postalCode\"],\n      \"description\": \"Address of the person\"\n    },\n    \"hobbies\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"description\": \"List of hobbies\"\n    }\n  },\n  \"required\": [\"name\", \"age\", \"address\", \"hobbies\"]\n}",
    "description": "New Schema Version",
    "name":"schemaVersionName"
}


# Example POST Response
{
    "changedEntityType": "EntityTypeSchemaVersion",
    "changedEntityId": 507,
    "changeType": "INSERT",
    "data": {
        "schema": "{\n  \"$id\": \"https://example.com/person.schema.json\",\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"description\": \"Schema for a person with name, age, address, and hobbies\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"name\": {\n      \"type\": \"string\",\n      \"description\": \"Name of the person\"\n    },\n    \"age\": {\n      \"type\": \"integer\",\n      \"description\": \"Age of the person\"\n    },\n    \"address\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"street\": {\n          \"type\": \"string\",\n          \"description\": \"Street address\"\n        },\n        \"city\": {\n          \"type\": \"string\",\n          \"description\": \"City name\"\n        },\n        \"state\": {\n          \"type\": \"string\",\n          \"description\": \"State abbreviation\"\n        },\n        \"postalCode\": {\n          \"type\": \"string\",\n          \"description\": \"Postal code\"\n        }\n      },\n      \"required\": [\"street\", \"city\", \"state\", \"postalCode\"],\n      \"description\": \"Address of the person\"\n    },\n    \"hobbies\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"description\": \"List of hobbies\"\n    }\n  },\n  \"required\": [\"name\", \"age\", \"address\", \"hobbies\"]\n}",
        "description": "New Schema Version",
        "name": "schemaVersionName",
        "entityType": {
            "id": 311
        }
    }
}

Used to add or update entity type schema versions.

HTTP Request

{corpToken}/data-hub/entityTypeSchemaVersion and {corpToken}/data-hub/entityTypeSchemaVersion/{schemaVersionId}

Parameter Required Description
BhRestToken yes Token that represents a session established by the login process. Must be sent with all subsequent requests to the API. The session key can be provided in the BhRestToken query string, a cookie, or an HTTP header.

GET /data-hub

curl https://rest{swimlane#}.bullhornstaffing.com/rest-services/e999/data-hub/entityType/311

# Example Response
{
    "data": {
        "entityTypeId": 311,
        "display": "entityTypeDisplay",
        "name": "entityTypeName",
        "sourceSystem": {
            "id": 293,
            "name": "sourceSystemName"
        },
        "isPrivate": true,
        "entityTypesSchemaVersions": {
            "data": [],
            "count": 1
        },
        "data": {
            "data": [],
            "count": 2
        }
    }
}

Used to retrieve information about a source system, entity type, or schema version.

HTTP Request

{corpToken}/data-hub/{entityName}/{entityId}

Parameter Required Description
BhRestToken yes Token that represents a session established by the login process. Must be sent with all subsequent requests to the API. The session key can be provided in the BhRestToken query string, a cookie, or an HTTP header.

Errors

The Data Hub API uses the following error codes:

Error Code Meaning
206 Partial Content – The request has only partially succeeded. One or more of the records in the request failed to be stored in Data Hub.
413 Request Entity Too Large – The request has more than 100 items and Data Hub will only process 100 records at a time.
400 Bad Request – The request was unsuccessful. All records failed to be processed.
401 Unauthorized – Your API key is wrong or expired
404 Not Found – The specified entity could not be found
500 Internal Server Error – We had a problem with our server.