Download OpenAPI specification:
This documentation details the API for the Sourceflow platform.
Where endpoints require authentication, it will be marked as OAuth2.0. Authentication uses the client credentials flow of OAuth 2.0. See https://auth0.com/docs/get-started/authentication-and-authorization-flow/client-credentials-flow for more information.
The token endpoint is /_sf/api/oauth/token.json. Authenticated endpoints require an
Authorization header with the value Bearer TOKEN, where TOKEN is a UUID valid for 1 hour.
Obtain a Bearer token using the OAuth 2.0 client credentials flow.
The returned token is valid for 1 hour and must be included in subsequent
authenticated requests as Authorization: Bearer TOKEN.
| grant_type required | string Value: "client_credentials" |
| client_id required | string Your OAuth2 client ID |
| client_secret required | string Your OAuth2 client secret |
{- "grant_type": "client_credentials",
- "client_id": "your-client-id",
- "client_secret": "your-client-secret"
}{- "access_token": "5b83dc8e-b95b-4c68-9e94-368a63e4b4f3",
- "token_type": "bearer",
- "expires_in": 3599
}Create a new job posting. external_reference and url_slug must be unique.
object (JobInput) |
{- "job": {
- "title": "A Fantastic Job Title",
- "description": "<p>A fantastic job description</p>",
- "external_reference": "JOB-12345",
- "url_slug": "1234-fantastic-job",
- "location": "10 Downing St, London SW1A 2AA",
- "expires_at": "2025-01-01Z12:00:00",
- "displayed_posting_date": "2022-09-30Z12:00:00",
- "external_application_email": "applications@mybestwebsite.com",
- "salary_package": "£20 per hour + free doughnuts",
- "salary_low": 1000,
- "salary_high": 100000,
- "featured": true,
- "consultant_name": "Joe Bloggs",
- "consultant_email": "j.bloggs@rec.rec",
- "origin": "my_ats_system",
- "categories": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "values": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
]
}
}{- "action": "create",
- "status": 0,
- "job": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "summary": "string",
- "image": "string",
- "external_reference": "string",
- "url_slug": "string",
- "location": "string",
- "addresses": [
- "string"
], - "salary_package": "string",
- "salary_low": 0,
- "salary_high": 0,
- "external_application_email": "string",
- "external_application_url": "string",
- "featured": true,
- "consultant_name": "string",
- "consultant_email": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "categories": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "values": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
], - "sectors": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "employment_types": [
- "string"
], - "salary_bands": [
- "string"
], - "consultants": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "regions": [
- "string"
], - "pay_period": [
- "string"
], - "hybrid_working": [
- "string"
]
}
}If a job with the given external_reference exists it will be updated;
otherwise a new job will be created. Returns an action field indicating
whether the record was created or updated.
object (JobInput) |
{- "job": {
- "title": "A Fantastic Job Title",
- "description": "<p>A fantastic job description</p>",
- "external_reference": "JOB-12345",
- "url_slug": "1234-fantastic-job",
- "location": "10 Downing St, London SW1A 2AA",
- "expires_at": "2025-01-01Z12:00:00",
- "displayed_posting_date": "2022-09-30Z12:00:00",
- "external_application_email": "applications@mybestwebsite.com",
- "salary_package": "£20 per hour + free doughnuts",
- "salary_low": 1000,
- "salary_high": 100000,
- "featured": true,
- "consultant_name": "Joe Bloggs",
- "consultant_email": "j.bloggs@rec.rec",
- "origin": "my_ats_system",
- "categories": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "values": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
]
}
}{- "action": "create",
- "status": 0,
- "job": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "summary": "string",
- "image": "string",
- "external_reference": "string",
- "url_slug": "string",
- "location": "string",
- "addresses": [
- "string"
], - "salary_package": "string",
- "salary_low": 0,
- "salary_high": 0,
- "external_application_email": "string",
- "external_application_url": "string",
- "featured": true,
- "consultant_name": "string",
- "consultant_email": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "categories": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "values": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
], - "sectors": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "employment_types": [
- "string"
], - "salary_bands": [
- "string"
], - "consultants": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "regions": [
- "string"
], - "pay_period": [
- "string"
], - "hybrid_working": [
- "string"
]
}
}Same upsert behaviour as /jobs/update_or_create.json but accepts
human-readable category names (e.g. sector names) instead of UUIDs.
Use /jobs/simplified_categories.json to retrieve the available names.
object (SimplifiedJobInput) Simplified job creation/update using category names instead of UUIDs |
{- "job": {
- "title": "string",
- "description": "string",
- "external_reference": "string",
- "url_slug": "string",
- "location": "string",
- "expires_at": "string",
- "displayed_posting_date": "string",
- "external_application_email": "user@example.com",
- "salary_package": "string",
- "salary_low": 0,
- "salary_high": 0,
- "featured": true,
- "consultant_name": "string",
- "consultant_email": "user@example.com",
- "origin": "string",
- "sectors": [
- "string"
], - "employment_types": [
- "string"
], - "salary_bands": [
- "string"
], - "consultants": [
- "string"
], - "regions": [
- "string"
]
}
}{- "action": "create",
- "status": 0,
- "job": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "summary": "string",
- "image": "string",
- "external_reference": "string",
- "url_slug": "string",
- "location": "string",
- "addresses": [
- "string"
], - "salary_package": "string",
- "salary_low": 0,
- "salary_high": 0,
- "external_application_email": "string",
- "external_application_url": "string",
- "featured": true,
- "consultant_name": "string",
- "consultant_email": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "categories": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "values": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
], - "sectors": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "employment_types": [
- "string"
], - "salary_bands": [
- "string"
], - "consultants": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "regions": [
- "string"
], - "pay_period": [
- "string"
], - "hybrid_working": [
- "string"
]
}
}Partially update an existing job. Only fields included in the payload will be changed.
Setting a field to null will clear its value.
The {jobId} can be either the external_reference used when creating the job,
or the Sourceflow UUID returned on creation.
| jobId required | string Sourceflow UUID or external_reference of the job |
object (JobInput) |
{- "job": {
- "title": "A Fantastic Job Title",
- "description": "<p>A fantastic job description</p>",
- "external_reference": "JOB-12345",
- "url_slug": "1234-fantastic-job",
- "location": "10 Downing St, London SW1A 2AA",
- "expires_at": "2025-01-01Z12:00:00",
- "displayed_posting_date": "2022-09-30Z12:00:00",
- "external_application_email": "applications@mybestwebsite.com",
- "salary_package": "£20 per hour + free doughnuts",
- "salary_low": 1000,
- "salary_high": 100000,
- "featured": true,
- "consultant_name": "Joe Bloggs",
- "consultant_email": "j.bloggs@rec.rec",
- "origin": "my_ats_system",
- "categories": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "values": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
]
}
}{- "action": "create",
- "status": 0,
- "job": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "summary": "string",
- "image": "string",
- "external_reference": "string",
- "url_slug": "string",
- "location": "string",
- "addresses": [
- "string"
], - "salary_package": "string",
- "salary_low": 0,
- "salary_high": 0,
- "external_application_email": "string",
- "external_application_url": "string",
- "featured": true,
- "consultant_name": "string",
- "consultant_email": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "categories": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "values": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
], - "sectors": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "employment_types": [
- "string"
], - "salary_bands": [
- "string"
], - "consultants": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "regions": [
- "string"
], - "pay_period": [
- "string"
], - "hybrid_working": [
- "string"
]
}
}Permanently delete a job from the website and search index. This cannot be undone and will remove the job's web page (potentially breaking existing links).
If you only want to hide a job, use PATCH to set expires_at to a date in the past.
The {jobId} can be either the external_reference or the Sourceflow UUID.
| jobId required | string Sourceflow UUID or external_reference of the job |
Returns jobs similar to a specified job, based on category matching.
| job_id required | string The external_reference or Sourceflow UUID of the source job |
{- "jobs": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "summary": "string",
- "image": "string",
- "external_reference": "string",
- "url_slug": "string",
- "location": "string",
- "addresses": [
- "string"
], - "salary_package": "string",
- "salary_low": 0,
- "salary_high": 0,
- "external_application_email": "string",
- "external_application_url": "string",
- "featured": true,
- "consultant_name": "string",
- "consultant_email": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "categories": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "values": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
], - "sectors": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "employment_types": [
- "string"
], - "salary_bands": [
- "string"
], - "consultants": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "regions": [
- "string"
], - "pay_period": [
- "string"
], - "hybrid_working": [
- "string"
]
}
]
}Search and filter the job index. Supports text queries, category filters,
and commute-time filtering. Pagination is supported via page_token.
object |
{- "job_search": {
- "query": "finance",
- "filters": {
- "14db7d92-f95c-4d19-bd4f-213db3419dd5": [
- "a53cb5f4-05ad-4a26-91a2-625c97ca95d0"
]
}, - "commute_filter": {
- "commute_method": 1,
- "start_coordinates": {
- "latitude": 53.4791821,
- "longitude": -2.2463738
}, - "travel_duration": {
- "seconds": 2400
}
}, - "page_token": null
}
}{- "jobs": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "summary": "string",
- "image": "string",
- "external_reference": "string",
- "url_slug": "string",
- "location": "string",
- "addresses": [
- "string"
], - "salary_package": "string",
- "salary_low": 0,
- "salary_high": 0,
- "external_application_email": "string",
- "external_application_url": "string",
- "featured": true,
- "consultant_name": "string",
- "consultant_email": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "published_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "categories": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "values": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
], - "sectors": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "employment_types": [
- "string"
], - "salary_bands": [
- "string"
], - "consultants": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "regions": [
- "string"
], - "pay_period": [
- "string"
], - "hybrid_working": [
- "string"
]
}
], - "page_token": "string"
}Returns all job categories with their metadata.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
}
]Returns all categories in a simplified format designed for use with the
/jobs/update_or_create_simplified.json endpoint. Keys match the field
names accepted by that endpoint.
{- "sectors": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}
], - "employment_types": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}
], - "salary_bands": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}
], - "consultants": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}
], - "regions": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}
], - "pay_period": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}
], - "hybrid_working": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}
]
}Returns detailed information for a single category including all of its values.
| categoryId required | string <uuid> UUID of the category |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "identifier": "string",
- "category_values": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": {
- "property1": "string",
- "property2": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "identifier": "string",
- "category_values": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": {
- "property1": "string",
- "property2": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}
]Creates a new CMS category with a defined schema.
| dataset_id | string <uuid> |
| name required | string |
| description | string |
required | Array of objects (CmsCategorySchemaField) |
| has_template | boolean |
| url_pattern | string |
| identifier required | string |
| job_categorisation | boolean |
| is_job_categorisation_required | boolean |
| is_nested | boolean |
| default_sort_field | string |
| default_sort_direction | string Enum: "ASC" "DESC" |
| simplified_api_name | string |
| category_type | Array of strings |
| locked_values | boolean |
{- "dataset_id": "8c4c51f1-f6f3-43bc-b65d-7415e8ef22c0",
- "name": "string",
- "description": "string",
- "schema": [
- {
- "name": "string",
- "data_type": "text",
- "default_value": null,
- "description": "string",
- "isRequired": true,
- "isMulti": true,
- "dropdown_values": [
- "string"
], - "object_entries": [
- { }
], - "foreign_category_id": "5ebc966d-f868-4084-9fd1-5ea7af2afa6c"
}
], - "has_template": true,
- "url_pattern": "string",
- "identifier": "string",
- "job_categorisation": true,
- "is_job_categorisation_required": true,
- "is_nested": true,
- "default_sort_field": "string",
- "default_sort_direction": "ASC",
- "simplified_api_name": "string",
- "category_type": [
- "string"
], - "locked_values": true
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "identifier": "string",
- "category_values": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": {
- "property1": "string",
- "property2": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Returns a specific CMS category by ID, including its schema and all values.
| categoryId required | string <uuid> UUID of the CMS category |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "identifier": "string",
- "category_values": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": {
- "property1": "string",
- "property2": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Placement is located by external_placement_id. If found it will be updated;
otherwise a new placement record is created.
object (PlacementInput) |
{- "placement": {
- "record_type": "candidate",
- "external_placement_id": "PLC-775544",
- "form_name": "string",
- "form_id": "string",
- "flat_fee": "8000.0",
- "candidate_name": "string",
- "candidate_email": "user@example.com",
- "job_title": "string",
- "employment_type": "string",
- "company_name": "string",
- "category": "string",
- "speciality": "string",
- "date_added": "string",
- "date_begin": "string",
- "date_submitted": "string",
- "time_to_place": 0,
- "candidate_source": "string",
- "lead_source": "string",
- "campaign_source": "string",
- "job_id": "string",
- "lead_id": "string",
- "client_id": "string",
- "contact_id": "string",
- "skills": [
- "string"
], - "business_sectors": [
- "string"
], - "corporate_users": [
- "user@example.com"
]
}
}Sends an email via the Sourceflow platform.
| to required | string <email> |
| subject required | string |
| body required | string |
{- "to": "recipient@example.com",
- "subject": "Hello from Sourceflow",
- "body": "hello\n cruel\n world"
}Provisions a new API partner user, returning client credentials.
object |
{- "api_user": {
- "name": "string"
}
}{- "message": "API User 'Partner Name API User' provisioned.",
- "user": {
- "client_id": "ff08bca4-1e3c-47e2-bf8a-00000000000",
- "client_secret": "xxxxxxxxxxx"
}
}