Welcome to the Homerun API! You can use our API to programmatically access your jobs and applicants in Homerun.
All API endpoints require Bearer authentication. We'll reference this authentication method later in this document as public-api-v2-key
. Example authentication header:
Authorization: Bearer <your secret API key>
Your API key has scopes attached to it. Those scopes are used to authorize request to each endpoint. We recommend that you only assign scopes that you need to get the job done and nothing more.
Scopes can only be assigned once, when generating a new key on the Integrations Page page in the Homerun App.
Possible scopes include:
vacancies:read
job-applications:read
job-applications:write
job-application-notes:read
job-application-notes:write
job-application-files:write
Check endpoint documentation below to learn which scopes are required to make a specific request.
Don’t share your API key in publicly accessible places such as client-side code or services like Github. If you suspect unauthorized usage of your key, please delete it on the Integrations Page in the Homerun App.
When assigning scopes to your API keys, follow the principle of least privilege and only grant the scopes that are absolutely necessary for your use-case. If you want to use our API in multiple workflows, consider generating separate keys with scopes tailored to the their specific needs, rather than re-using the same key.
Consider periodically rotating your API keys. You can have up to 10 active API keys, so you can generate new ones to replace old ones without forcing downtime on your workflows.
Note that keys can have an expiry date assigned to them. You can use it for keys that you know in advance you'll only need for a limited time.
If your workflow only involves fetching a list of vacancies, please consider using our Job XML Feeds feature instead.
We enforce a rate limit of 60 requests per minute to our API to ensure fair usage and limit abuse.
All endpoints returning a list of objects are using configurable pagination mechanism. You can adjust the number of items per page (through perPage
parameter). You can fetch more objects by incrementing the page
query parameter. Pagination metadata is returned in a separate, top-level meta
property, providing convenience links to following pages, current pagination state and a total number of objects.
Example of a meta
object:
{
"meta": {
"current_page": 1,
"from": 1,
"last_page": 4,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "http://api.homerun.co/v2/job-applications?page=1",
"label": "1",
"active": true
},
{
"url": "http://api.homerun.co/v2/job-applications?page=2",
"label": "2",
"active": false
},
{
"url": "http://api.homerun.co/v2/job-applications?page=3",
"label": "3",
"active": false
},
{
"url": "http://api.homerun.co/v2/job-applications?page=4",
"label": "4",
"active": false
},
{
"url": "http://api.homerun.co/v2/job-applications?page=2",
"label": "Next »",
"active": false
}
],
"path": "http://api.homerun.co/v2/job-applications",
"per_page": 15,
"to": 15,
"total": 46
}
}
total_candidate_count
field from Vacancy
schema is now an optional and can be added using include[]=total_candidate_count
is_remote
field from Vacancy
has been deprecated in favour of the new enum location_type
field. remote
is one of the values of the new field.Required scope: job-applications:read
object Examples:
Filter by one of the fields | |
include | Array of strings Items Enum: "sources" "stage" "vacancy" Examples:
Include additional information in the response |
page | integer >= 1 Default: 1 Change the page number to get more results |
perPage | integer [ 1 .. 100 ] Default: 15 Change the number of object returned per page |
{- "data": [
- {
- "id": "string",
- "rating": 0,
- "retention_period_ends_at": "2019-08-24T14:15:22Z",
- "sourced": true,
- "total_votes": 0,
- "homerun_url": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "disqualified": true,
- "hired_at": "2019-08-24T14:15:22Z",
- "first_reply_at": "2019-08-24T14:15:22Z",
- "personal_info": {
- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "city": "string",
- "country": "string",
- "date_of_birth": "2019-08-24",
- "phone_number": "string",
- "photo": "string"
}, - "vacancy_id": "string",
- "stage": {
- "name": "string"
}, - "notes": [
- {
- "display_name": "string",
- "is_sensitive": true,
- "note": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "sources": [
- {
- "name": "Homerun Career Page"
}
]
}
]
}
Required scope: job-applications:write
Job application attributes
first_name required | string |
last_name required | string |
email required | string <email> |
date_of_birth | string <date> Date string in the format of YYYY-MM-DD |
vacancy_id | string Id of one of the existing vacancies in open or private status.
If not sent or sent as |
city | string |
country | string |
phone_number | string |
photo | string <url> You can also upload a photo through Job Application Files endpoint |
sourced | boolean Indicates if the candidate was sourced or "applied" themselves. |
experience | string |
education | string |
pronouns | string |
skype | string |
string <url> | |
string <url> | |
string <url> | |
github | string <url> |
website | string <url> |
assignment | string Text part of the assignment.
Files can be added via Job Application Files endpoint with |
custom_data | object Key-Value property storage for properties not covered by Job Application object schema |
sources | Array of arrays Names of job application sources |
{- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "date_of_birth": "1983-01-28",
- "vacancy_id": "job_jfGhv8FnurJalJTmp8I1",
- "city": "Rotterdam",
- "country": "The Netherlands",
- "phone_number": "012-34567890",
- "sourced": true,
- "experience": "string",
- "education": "string",
- "pronouns": "string",
- "skype": "string",
- "facebook": "string",
- "twitter": "string",
- "linkedin": "string",
- "github": "string",
- "website": "string",
- "assignment": "string",
- "custom_data": {
- "internal_id": "hr-2131",
- "driving_licence": "yes"
}, - "sources": [
- "Homerun Career Page"
]
}
{- "data": {
- "id": "string",
- "rating": 0,
- "retention_period_ends_at": "2019-08-24T14:15:22Z",
- "sourced": true,
- "total_votes": 0,
- "homerun_url": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "disqualified": true,
- "hired_at": "2019-08-24T14:15:22Z",
- "first_reply_at": "2019-08-24T14:15:22Z",
- "personal_info": {
- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "city": "string",
- "country": "string",
- "date_of_birth": "2019-08-24",
- "phone_number": "string",
- "photo": "string"
}, - "vacancy_id": "string",
- "stage": {
- "name": "string"
}, - "notes": [
- {
- "display_name": "string",
- "is_sensitive": true,
- "note": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "sources": [
- {
- "name": "Homerun Career Page"
}
], - "education": "string",
- "experience": "string",
- "pronouns": "string",
- "skype": "string",
- "facebook": "string",
- "twitter": "string",
- "linkedin": "string",
- "github": "string",
- "website": "string",
- "assignment": "string",
- "files": [
- {
- "name": "my-resume.pdf",
- "type": "resume",
- "temporary_download_url": "string"
}
], - "custom_data": {
- "key": "value",
- "different_key": "diffrent value"
}
}
}
Required scope: job-applications:read
job_application_id required | string Example: ap_D3kCkoClbG6n6KlqD0ob Job Application ID |
include | Array of strings Items Enum: "notes" "sources" "vacancy" Examples:
Include additional information in the response |
{- "data": {
- "id": "string",
- "rating": 0,
- "retention_period_ends_at": "2019-08-24T14:15:22Z",
- "sourced": true,
- "total_votes": 0,
- "homerun_url": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "disqualified": true,
- "hired_at": "2019-08-24T14:15:22Z",
- "first_reply_at": "2019-08-24T14:15:22Z",
- "personal_info": {
- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "city": "string",
- "country": "string",
- "date_of_birth": "2019-08-24",
- "phone_number": "string",
- "photo": "string"
}, - "vacancy_id": "string",
- "stage": {
- "name": "string"
}, - "notes": [
- {
- "display_name": "string",
- "is_sensitive": true,
- "note": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "sources": [
- {
- "name": "Homerun Career Page"
}
], - "education": "string",
- "experience": "string",
- "pronouns": "string",
- "skype": "string",
- "facebook": "string",
- "twitter": "string",
- "linkedin": "string",
- "github": "string",
- "website": "string",
- "assignment": "string",
- "files": [
- {
- "name": "my-resume.pdf",
- "type": "resume",
- "temporary_download_url": "string"
}
], - "custom_data": {
- "key": "value",
- "different_key": "diffrent value"
}
}
}
Required scope: job-applications:write
job_application_id required | string Example: ap_D3kCkoClbG6n6KlqD0ob Job Application ID |
Job application attributes
first_name | string | ||
last_name | string | ||
string <email> | |||
date_of_birth | string <date> | ||
vacancy_id | string Id of one of the existing vacancies in open or private status.
If not sent or sent as | ||
city | string | ||
country | string | ||
phone_number | string | ||
photo | string <url> | ||
sourced | boolean Indicates if the candidate was sourced or "applied" themselves. | ||
experience | string | ||
education | string | ||
pronouns | string | ||
skype | string | ||
string <url> | |||
string <url> | |||
string <url> | |||
github | string <url> | ||
website | string <url> | ||
assignment | string | ||
object Move application to a different, existing hiring stage. If stage cannot be matched, a 404 will be returned. If also moving between vacancies, stage also needs to exist in the new vacancy otherwise a 404 response will be returned. | |||
| |||
custom_data | object Only sent properties will be affected |
{- "stage": {
- "name": "hired"
}
}
{- "data": {
- "id": "string",
- "rating": 0,
- "retention_period_ends_at": "2019-08-24T14:15:22Z",
- "sourced": true,
- "total_votes": 0,
- "homerun_url": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "disqualified": true,
- "hired_at": "2019-08-24T14:15:22Z",
- "first_reply_at": "2019-08-24T14:15:22Z",
- "personal_info": {
- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "city": "string",
- "country": "string",
- "date_of_birth": "2019-08-24",
- "phone_number": "string",
- "photo": "string"
}, - "vacancy_id": "string",
- "stage": {
- "name": "string"
}, - "notes": [
- {
- "display_name": "string",
- "is_sensitive": true,
- "note": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "sources": [
- {
- "name": "Homerun Career Page"
}
], - "education": "string",
- "experience": "string",
- "pronouns": "string",
- "skype": "string",
- "facebook": "string",
- "twitter": "string",
- "linkedin": "string",
- "github": "string",
- "website": "string",
- "assignment": "string",
- "files": [
- {
- "name": "my-resume.pdf",
- "type": "resume",
- "temporary_download_url": "string"
}
], - "custom_data": {
- "key": "value",
- "different_key": "diffrent value"
}
}
}
Required scope: job-applications:write
job_application_id required | string Example: ap_D3kCkoClbG6n6KlqD0ob Job Application ID |
{- "code": 401,
- "error": true,
- "message": "Unauthenticated"
}
Required scope: job-application-notes:write
job_application_id required | string Example: ap_D3kCkoClbG6n6KlqD0ob Job Application ID |
Note attributes
note required | string Content of the note |
display_name required | string Name of the note's author |
is_sensitive | boolean Mark note's content as sensitive. |
{- "note": "Excellent candidate, interview scheduled for Monday.",
- "display_name": "Ted",
- "is_sensitive": false
}
{- "data": {
- "display_name": "string",
- "is_sensitive": true,
- "note": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}
Maximum allowed file size is 25MB (can be subject to change in the future).
Required scope: job-application-files:write
job_application_id required | string Example: ap_D3kCkoClbG6n6KlqD0ob Job Application ID |
File attributes
type required | string Enum: "resume" "assignment" Type of uploaded file |
file required | string <binary> Uploaded file |
{- "data": {
- "name": "my-resume.pdf",
- "type": "resume",
- "temporary_download_url": "string"
}
}
If job application already has a photo, it'll be replaced by the newly
uploaded one.
Maximum allowed file size is 5MB (can be subject to change in the future).
Required scope: job-application-files:write
job_application_id required | string Example: ap_D3kCkoClbG6n6KlqD0ob Job Application ID |
File attributes
file required | string <binary> Image, only jpg, png and gif formats are supported. |
{- "data": {
- "id": "string",
- "rating": 0,
- "retention_period_ends_at": "2019-08-24T14:15:22Z",
- "sourced": true,
- "total_votes": 0,
- "homerun_url": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "disqualified": true,
- "hired_at": "2019-08-24T14:15:22Z",
- "first_reply_at": "2019-08-24T14:15:22Z",
- "personal_info": {
- "first_name": "string",
- "last_name": "string",
- "email": "user@example.com",
- "city": "string",
- "country": "string",
- "date_of_birth": "2019-08-24",
- "phone_number": "string",
- "photo": "string"
}, - "vacancy_id": "string",
- "stage": {
- "name": "string"
}, - "notes": [
- {
- "display_name": "string",
- "is_sensitive": true,
- "note": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "sources": [
- {
- "name": "Homerun Career Page"
}
]
}
}
Required scope: vacancies:read
object Examples:
Name of the vacancy status | |
include | Array of strings Items Enum: "location" "department" "stages" "total_candidate_count" Examples:
Include additional information in the response |
page | integer >= 1 Default: 1 Change the page number to get more results |
perPage | integer [ 1 .. 100 ] Default: 15 Change the number of object returned per page |
{- "data": [
- {
- "id": "string",
- "status": "public",
- "title": "string",
- "description": "string",
- "total_candidate_count": 0,
- "type": "Contracted",
- "expires_at": "2019-08-24T14:15:22Z",
- "is_remote": true,
- "location_type": "on-site",
- "location": {
- "name": "string",
- "country": "string",
- "address": "string",
- "postal_code": "string",
- "city": "string",
- "region": "string"
}, - "department": {
- "name": "string"
}, - "stages": [
- {
- "name": "string"
}
], - "created_at": "2019-08-24T14:15:22Z"
}
]
}
Required scope: vacancies:read
vacancy_id required | string Example: job_SnhUsAg1QwTRFIRNUfM6 Vacancy ID |
include | Array of strings Items Enum: "location" "department" "stages" "total_candidate_count" Include additional information in the response |
{- "data": {
- "id": "string",
- "status": "public",
- "title": "string",
- "description": "string",
- "total_candidate_count": 0,
- "type": "Contracted",
- "expires_at": "2019-08-24T14:15:22Z",
- "is_remote": true,
- "location_type": "on-site",
- "location": {
- "name": "string",
- "country": "string",
- "address": "string",
- "postal_code": "string",
- "city": "string",
- "region": "string"
}, - "department": {
- "name": "string"
}, - "stages": [
- {
- "name": "string"
}
], - "created_at": "2019-08-24T14:15:22Z"
}
}