Homerun Public API (2.0.0)

Introduction

Welcome to the Homerun API! You can use our API to programmatically access your jobs and applicants in Homerun.

Authentication

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>

Authorization

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.

General security advice and fair use

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.

Pagination

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": "&laquo; 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 &raquo;",
                "active": false
            }
        ],
        "path": "http://api.homerun.co/v2/job-applications",
        "per_page": 15,
        "to": 15,
        "total": 46
    }
}

Changelog

21.09.2023

  • total_candidate_count field from Vacancy schema is now an optional and can be added using include[]=total_candidate_count

14.09.2023

  • 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.

Job Applications

Get a list of job applications

Required scope: job-applications:read

Authorizations:
public-api-v2-key
query Parameters
object
Examples:
  • filter[vacancy_id]=job_pvjbDqdSOpO070eLHSvT - Only return job applications from a specific vacancy
  • filter[vacancy_id]=job_pvjbDqdSOpO070eLHSvT,job_bzNXUjKw9yoPcgE3CyVI,job_8FAj89sQHHAZPcc2yKjx - Only return job applications from a specific vacancy
  • filter[stage]=hired - Only return job applications from a specific stage in the hiring process. Stage names are specific to vacancies they were defined for.
  • filter[hired_after]=2023-06-01 - Only return job application of applicants hired after a specific date

Filter by one of the fields

include
Array of strings
Items Enum: "sources" "stage" "vacancy"
Examples:
  • include[]=stage - If a job application was created for a specific vacancy then return the stage it's in
  • include[]=sources - Return all sources of the job application
  • include[]=vacancy - If a job application was created for a specific vacancy then return that vacancy object

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

Responses

Response samples

Content type
application/json
{
  • "data": [
    • {
      }
    ]
}

Create new job applications

Required scope: job-applications:write

Authorizations:
public-api-v2-key
Request Body schema: application/json

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 null, the application will be visible on candidate page in our UI.

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
facebook
string <url>
twitter
string <url>
linkedin
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 assignment type.

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

Responses

Request samples

Content type
application/json
{
  • "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"
    ]
}

Response samples

Content type
application/json
{
  • "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": {
      },
    • "vacancy_id": "string",
    • "stage": {
      },
    • "notes": [
      ],
    • "sources": [
      ],
    • "education": "string",
    • "experience": "string",
    • "pronouns": "string",
    • "skype": "string",
    • "facebook": "string",
    • "twitter": "string",
    • "linkedin": "string",
    • "github": "string",
    • "website": "string",
    • "assignment": "string",
    • "files": [
      ],
    • "custom_data": {
      }
    }
}

Get detailed information of a job application

Required scope: job-applications:read

Authorizations:
public-api-v2-key
path Parameters
job_application_id
required
string
Example: ap_D3kCkoClbG6n6KlqD0ob

Job Application ID

query Parameters
include
Array of strings
Items Enum: "notes" "sources" "vacancy"
Examples:
  • include[]=notes - Include notes associated with this application. Requires `job-application-notes:read` scope
  • include[]=sources - Return all sources of the job application
  • include[]=vacancy - Include the vacancy if job application was made to one

Include additional information in the response

Responses

Response samples

Content type
application/json
{
  • "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": {
      },
    • "vacancy_id": "string",
    • "stage": {
      },
    • "notes": [
      ],
    • "sources": [
      ],
    • "education": "string",
    • "experience": "string",
    • "pronouns": "string",
    • "skype": "string",
    • "facebook": "string",
    • "twitter": "string",
    • "linkedin": "string",
    • "github": "string",
    • "website": "string",
    • "assignment": "string",
    • "files": [
      ],
    • "custom_data": {
      }
    }
}

Update job application properties

Required scope: job-applications:write

Authorizations:
public-api-v2-key
path Parameters
job_application_id
required
string
Example: ap_D3kCkoClbG6n6KlqD0ob

Job Application ID

Request Body schema: application/json

Job application attributes

first_name
string
last_name
string
email
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 null, the application will be moved to candidate page in our UI. If id cannot be matched to any of your jobs, 404 response will be returned.

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
facebook
string <url>
twitter
string <url>
linkedin
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.

name
required
string
custom_data
object

Only sent properties will be affected

Responses

Request samples

Content type
application/json
Example
{
  • "stage": {
    • "name": "hired"
    }
}

Response samples

Content type
application/json
{
  • "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": {
      },
    • "vacancy_id": "string",
    • "stage": {
      },
    • "notes": [
      ],
    • "sources": [
      ],
    • "education": "string",
    • "experience": "string",
    • "pronouns": "string",
    • "skype": "string",
    • "facebook": "string",
    • "twitter": "string",
    • "linkedin": "string",
    • "github": "string",
    • "website": "string",
    • "assignment": "string",
    • "files": [
      ],
    • "custom_data": {
      }
    }
}

Delete a job application

Required scope: job-applications:write

Authorizations:
public-api-v2-key
path Parameters
job_application_id
required
string
Example: ap_D3kCkoClbG6n6KlqD0ob

Job Application ID

Responses

Response samples

Content type
application/json
{
  • "code": 401,
  • "error": true,
  • "message": "Unauthenticated"
}

Job Application Notes

Create a new note

Required scope: job-application-notes:write

Authorizations:
public-api-v2-key
path Parameters
job_application_id
required
string
Example: ap_D3kCkoClbG6n6KlqD0ob

Job Application ID

Request Body schema: application/json

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.

Responses

Request samples

Content type
application/json
{
  • "note": "Excellent candidate, interview scheduled for Monday.",
  • "display_name": "Ted",
  • "is_sensitive": false
}

Response samples

Content type
application/json
{
  • "data": {
    • "display_name": "string",
    • "is_sensitive": true,
    • "note": "string",
    • "created_at": "2019-08-24T14:15:22Z",
    • "updated_at": "2019-08-24T14:15:22Z"
    }
}

Job Application Files

Upload files to a job application

Maximum allowed file size is 25MB (can be subject to change in the future). Required scope: job-application-files:write

Authorizations:
public-api-v2-key
path Parameters
job_application_id
required
string
Example: ap_D3kCkoClbG6n6KlqD0ob

Job Application ID

Request Body schema: multipart/form-data

File attributes

type
required
string
Enum: "resume" "assignment"

Type of uploaded file

file
required
string <binary>

Uploaded file

Responses

Response samples

Content type
application/json
{
  • "data": {
    • "name": "my-resume.pdf",
    • "type": "resume",
    • "temporary_download_url": "string"
    }
}

Upload an applicant photo

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

Authorizations:
public-api-v2-key
path Parameters
job_application_id
required
string
Example: ap_D3kCkoClbG6n6KlqD0ob

Job Application ID

Request Body schema: multipart/form-data

File attributes

file
required
string <binary>

Image, only jpg, png and gif formats are supported.

Responses

Response samples

Content type
application/json
{
  • "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": {
      },
    • "vacancy_id": "string",
    • "stage": {
      },
    • "notes": [
      ],
    • "sources": [
      ]
    }
}

Vacancies

Get a list of vacancies

Required scope: vacancies:read

Authorizations:
public-api-v2-key
query Parameters
object
Examples:
  • filter[status]=draft - Only return draft vacancies
  • filter[status]=private,public - Return private and public vacancies

Name of the vacancy status

include
Array of strings
Items Enum: "location" "department" "stages" "total_candidate_count"
Examples:
  • include[]=location - If a vacancy has a location attached to it then return that location in the response
  • include[]=stages - Return job application stages defined for the vacancy in the response

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

Responses

Response samples

Content type
application/json
{
  • "data": [
    • {
      }
    ]
}

Get detailed information of a vacancy

Required scope: vacancies:read

Authorizations:
public-api-v2-key
path Parameters
vacancy_id
required
string
Example: job_SnhUsAg1QwTRFIRNUfM6

Vacancy ID

query Parameters
include
Array of strings
Items Enum: "location" "department" "stages" "total_candidate_count"

Include additional information in the response

Responses

Response samples

Content type
application/json
{
  • "data": {
    • "id": "string",
    • "application_form_url": "http://example.com",
    • "job_url": "http://example.com",
    • "share_image_url": "http://example.com",
    • "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": {
      },
    • "department": {
      },
    • "stages": [
      ],
    • "created_at": "2019-08-24T14:15:22Z"
    }
}

Other

Dummy endpoint for testing authentication

Authorizations:
public-api-v2-key

Responses

Response samples

Content type
application/json
{
  • "pong": true
}