Organization API
API Endpoint:
https://api.huntr.co/org
The Huntr API for Organizations is organized around REST. You can use this API to access Huntr's Organizational API endpoints, which can get information on your members plus the jobs, employers, and events they manage through Huntr.
This API is for you if you are an organization using Huntr to follow the job search progress of your members (job seekers). This is the case if you have an organizational account with member boards managed by your organization's advisors.
This API will NOT work for you if multiple job seekers have personally shared their boards with you, in that case there is no concept of an organization, and you are using Huntr as an individual.
Authentication
To authorize, use this code:
# With shell, you can just pass the correct header with each request
curl "api_endpoint_here"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
Make sure to replace
ORG_ACCESS_TOKEN
with your API key.
Huntr uses Access Tokens to allow access to the organization API. You can register a new Huntr Access Token in your organization's admin dashboard.
Huntr expects for the Access Token to be included in all API requests to the server in a header that looks like the following:
Authorization: Bearer <ORG_ACCESS_TOKEN>
Pagination
A sample list query:
curl "https://api.huntr.co/org/members?limit=2"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5b0379b5712bb674fd0d561e",
"givenName": "Graciela",
"familyName": "Varela",
"email": "[email protected]",
"createdAt": 1526954421,
"isActive": true
},
{
"id": "5b037898b7f93473edc1c43a",
"givenName": "Nicole",
"familyName": "Haylock",
"email": "[email protected]",
"createdAt": 1526954136,
"isActive": false
}
],
"next": "5b037898b7f93473edc1c43a"
}
Retrieve the second page of results with this query:
curl "https://api.huntr.co/org/members?limit=2&next=5a70a7361d06bb000f0f1c44"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
Some API resources have support for bulk fetches via "list" API methods. For instance, you can list members, jobs, and job events. These list API methods share a common structure, taking these two parameters: limit
, next
.
Huntr uses cursor-based pagination via the next
parameter which takes an existing object ID value. Every "list" endpoint result includes a data
parameter, with the results from the call, along with a next
parameter. The next
parameter represents the id of the last object returned. Passing this parameter in subsequent call will return the next page of results. So, if you've made your first query and set 100 as a limit and want to retrieve the second page of results, you can repeat the same query, but with the next
parameter set with the value returned by your first call. You can see an example set of queries on the right.
Organization Invitations
Organization Invitation Resource
An invitation sent to a member to join your Huntr Organization as a job seeker:
{
"id": "5e6a9d1f62593578ce9de841",
"toEmail": "[email protected]",
"boardName": "Job Search 2020",
"to": {
"id": "5e6a7c99c56bc6669e3da876",
"givenName": "Cristobal",
"familyName": "Hackett",
"email": "[email protected]",
"createdAt": 1584045343
},
"boardTemplate": {
"id": "5a6e4a567e42789e6e65c986",
"name": "Tech Jobs",
"listTemplates": [
{
"id": "5fc9686050c1de39c8412af7",
"name": "Wishlist"
},
{
"id": "5fc9686050c1de39c8412af8",
"name": "Applied"
},
{
"id": "5fc9686050c1de39c8412af9",
"name": "Phone Interview"
},
{
"id": "5fc9686050c1de39c8412af2",
"name": "On Site Interview"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Offer"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Rejected"
}
]
},
"memberFieldValues": [
{
"fieldId": "5b3f908c99c94b6177d55a28",
"value": "Seattle"
}
],
"createdAt": 1539800736
}
Field | Type | Description |
---|---|---|
id | String | Invitation id |
toEmail | String | Email to which invitation was sent to |
boardName | String | Name to give the board created when member accepts invite |
to | Object | If the user with this email already has a Huntr account this object will show his/her user account information |
String | Member's email | |
boardTemplate | Object | The board template to use to define the board stages when member accepts invite |
memberFieldValues | Array | Array of member field values to assign to the member when invitation is accepted. Each object in the array is of type {fieldId: "5b3f908c99c94b6177d55a28", value: "Montreal"} , where fieldId represents the id of an existing Member Field |
createdAt | Unix timestamp | Date the invitation was created |
List Organization Invitations
curl "https://api.huntr.co/org/organization-invitations"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5bc77e60856b6201a7f84d99",
"toEmail": "[email protected]",
"boardName": "Fall 2020",
"memberFieldValues": [],
"createdAt": 1539800672
},
{
"id": "5bc77ea0856b6201a7f84d9a",
"toEmail": "[email protected]",
"boardName": "Fall 2020",
"memberFieldValues": [],
"createdAt": 1539800736
},
{
"id": "5ca53f5687967fd925e3aff4",
"toEmail": "[email protected]",
"boardName": "Fall 2020",
"boardTemplate": {
"id": "5a6e4c3c7e42789e6e65c987",
"name": "Fall 2020 Cohort 1",
"listTemplates": [
{
"id": "5fc9686050c1de39c8412af7",
"name": "Wishlist"
},
{
"id": "5fc9686050c1de39c8412af8",
"name": "Applied"
},
{
"id": "5fc9686050c1de39c8412af9",
"name": "Phone Interview"
},
{
"id": "5fc9686050c1de39c8412af2",
"name": "On Site Interview"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Offer"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Rejected"
}
]
},
"memberFieldValues": [
{
"fieldId": "5b3f908c99c94b6177d55a28",
"value": "Seattle"
}
],
"createdAt": 1554333526
}
]
}
This endpoint retrieves all pending organization invitations.
HTTP Request
GET https://api.huntr.co/org/organization-invitations
Create Organization Invitation
curl --location --request POST 'https://api.huntr.co/org/organization-invitations' \
--header 'Authorization: Bearer <ORG_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "[email protected]",
"boardName": "Job Search 2020",
"boardTemplateId": "5a6e4a567e42789e6e65c986",
"memberFieldValues": [
{"fieldId": "5b3f908c99c94b6177d55a28", "value": "Vancouver"},
{"fieldId": "5b3f9cf499c94b6177d55a2a", "value": "Web Design"}
]
}'
The above command returns JSON structured like this:
{
"id": "5ec478c20f3c3c8443328eb5",
"toEmail": "[email protected]",
"boardName": "Job Search 2020",
"boardTemplate": {
"id": "5a6e4a567e42789e6e65c986",
"name": "Tech Jobs",
"listTemplates": [
{
"id": "5fc9686050c1de39c8412af7",
"name": "Wishlist"
},
{
"id": "5fc9686050c1de39c8412af8",
"name": "Applied"
},
{
"id": "5fc9686050c1de39c8412af9",
"name": "Phone Interview"
},
{
"id": "5fc9686050c1de39c8412af2",
"name": "On Site Interview"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Offer"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Rejected"
}
]
},
"memberFieldValues": [
{
"fieldId": "5b3f908c99c94b6177d55a28",
"value": "Vancouver"
},
{
"fieldId": "5b3f9cf499c94b6177d55a2a",
"value": "Web Design"
}
],
"createdAt": 1589934274
}
This endpoint creates and sends a single Organization Invitation. The person invited through this endpoint will receive an email invitation to join your organization under Huntr.
To prevent duplicate invitations from being sent, requests with an email that has an existing pending invitation from your organization will return an error and no invitation will be created.
HTTP Request
POST https://api.huntr.co/org/organization-invitations
JSON Body Parameters
Parameter | Required | Type | Description |
---|---|---|---|
email |
yes | String | An email address for the job seeker your want to invite |
boardName |
no | String | Name of board to be created for member |
boardTemplateId |
no | String | Id of the board template to use when creating a board for member, if none is submitted it will default to Organization's default board template, or Huntr's default template if no template has been set as a default. |
memberFieldValues |
no | Array | Array of member field values to assign to the member when invitation is accepted. Each object in the array is of type {fieldId: "5b3f908c99c94b6177d55a28", value: "Montreal"} , where fieldId represents the id of an existing Member Field |
Members
Member Resource
A member of your organization:
{
"id": "5b0379b5712bb674fd0d561e",
"givenName": "Graciela",
"familyName": "Varela",
"email": "[email protected]",
"createdAt": 1526954421,
"isActive": true,
"memberFieldValues": [
{
"fieldId": "5b3f908c99c94b6177d55a28",
"value": "Montreal"
}
]
}
A member is one of the job seekers using Huntr under your organization. If you are an educational institution, your job seeking students qualify as your members.
Field | Type | Description |
---|---|---|
id | String | Member's Huntr id |
givenName | String | Member's first name |
familyName | String | Member's last name |
String | Member's email | |
createdAt | Unix timestamp | Date the member signed up for Huntr |
isActive | Boolean | Defines if member has been deactivated by an organization admin or advisor. Deactivating a member prevents them from continuing activity on boards managed by your organization, and it is usually done for members who have found a job and stopped using Huntr. |
memberFieldValues | Array | Array of assigned member field values. Each object in the array is of type {fieldId: "5b3f908c99c94b6177d55a28", value: "Montreal"} , where fieldId represents the id of an existing Member Field |
List Members
curl "https://api.huntr.co/org/members?active=true&limit=3"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5b0377c7b7f93473edc1c433",
"givenName": "Roberto",
"familyName": "Moscoso",
"email": "[email protected]",
"createdAt": 1526953927,
"isActive": true,
"memberFieldValues": []
},
{
"id": "5a9f699edd2f935a4e5b263a",
"givenName": "Rennie",
"familyName": "Haylock",
"email": "[email protected]",
"createdAt": 1520396702,
"isActive": true,
"memberFieldValues": []
},
{
"id": "5a9b3d392bd2e22e37dee4f0",
"givenName": "John",
"familyName": "Smith",
"email": "[email protected]",
"createdAt": 1520123193,
"isActive": true,
"memberFieldValues": []
}
],
"next": "5a9b3d392bd2e22e37dee4f0"
}
This endpoint retrieves all members for your organization.
HTTP Request
GET https://api.huntr.co/org/members
Query Parameters
Parameter | Type | Default | Description |
---|---|---|---|
active |
Boolean | none | If set to true , the result will only include active members. If set to false the result will only include deactivated members. |
email |
String | none | If set, it will return the single member that matches the provided email address. |
limit |
Integer | 100 | Defines the maximum number of members to return |
next |
String | none | If set, returns the next set of results after the object id provided |
Retrieve a Member
curl "https://api.huntr.co/org/members/5a9b3d392bd2e22e37dee4f0"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"id": "5a9b3d392bd2e22e37dee4f0",
"givenName": "John",
"familyName": "Smith",
"email": "[email protected]",
"createdAt": 1520123193,
"isActive": true,
"memberFieldValues": []
}
This endpoint retrieves a specific member.
HTTP Request
GET https://api.huntr.co/org/members/<ID>
URL Parameters
Parameter | Type | Description |
---|---|---|
ID | String | The ID of the member to retrieve |
Update a Job Seeker's member field value
curl --location --request PUT 'https://api.huntr.co/org/members/5a9b3d392bd2e22e37dee4f0/member-fields/5b3f908c99c94b6177d55a28' \
--header 'Authorization: Bearer <ORG_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"value": "Seattle"
}'
The above command returns JSON structured like this:
{
"id": "5a9b3d392bd2e22e37dee4f0",
"givenName": "John",
"familyName": "Smith",
"email": "[email protected]",
"createdAt": 1589931899,
"isActive": true,
"memberFieldValues": [
{
"fieldId": "5b3f908c99c94b6177d55a28",
"value": "Seattle"
},
{
"fieldId": "5b3f9cf499c94b6177d55a2a",
"value": "Web Design"
},
{
"fieldId": "5b3fb247d9d5bd9d6de8f655",
"value": "YVR-001"
}
]
}
This endpoint updates or sets a specific member's field value.
HTTP Request
PUT https://api.huntr.co/org/members/<memberId>/member-fields/<fieldId>
Where <fieldId>
is the id
for an existing Member Field
URL Parameters
Parameter | Type | Description |
---|---|---|
value |
Mixed | The value to give the member field |
Member Fields
Member Field Resource
A member field:
{
"id": "5b3f908c99c94b6177d55a28",
"name": "Location",
"fieldType": "MULTIPLE_CHOICE",
"choices": [
"Vancouver",
"Seattle",
"New York",
"Montreal",
"Miami"
]
}
A member field is a custom field created by someone in your organization which describes your members and is used to filter and/or group your members in different areas of your advisor dashboard. For example: If your members are in different cities, you could create a 'location' custom field.
Field | Type | In all fields | Description |
---|---|---|---|
id | String | true | Member field id |
name | String | true | Member field name |
fieldType | String | true | Field type |
choices | String | false | Choices found on member fields of fieldType MULTIPLE_CHOICE |
Types of Member Fields
This is a list of all the types of fields currently available.
memberField.fieldType |
Description |
---|---|
MULTIPLE_CHOICE |
Represents a multiple choice field type like "Locations" or "Specialties" |
TEXT |
Represents a text field type like "Nickname" |
NUMBER |
Represents a number field type like "Age" |
DATE |
Represents a date field type like "Graduation Date" |
List Member Fields
curl "https://api.huntr.co/org/member-fields"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5b3f908c99c94b6177d55a28",
"name": "Location",
"fieldType": "MULTIPLE_CHOICE",
"choices": [
"Vancouver",
"Seattle",
"New York",
"Montreal",
"Miami"
]
},
{
"id": "5b3f960c99c94b6177d55a29",
"name": "Graduation",
"fieldType": "DATE"
},
{
"id": "5b3f9cf499c94b6177d55a2a",
"name": "Program",
"fieldType": "MULTIPLE_CHOICE",
"choices": [
"Web Design",
"iOS",
"Data Science"
]
},
{
"id": "5b3fb247d9d5bd9d6de8f655",
"name": "Cohort",
"fieldType": "MULTIPLE_CHOICE",
"choices": [
"YVR-001",
"TRT-001",
"YVR-002",
"MTR-001"
]
},
{
"id": "5b3ff25b0ec3828665ff7c81",
"name": "Status",
"fieldType": "MULTIPLE_CHOICE",
"choices": [
"In program",
"Searching",
"Placed"
]
},
{
"id": "5b40d89ae582264d4368a2bc",
"name": "Gender",
"fieldType": "MULTIPLE_CHOICE",
"choices": [
"Female",
"Male"
]
},
{
"id": "5b43ee4a8308d2400b9cced3",
"name": "Nickname",
"fieldType": "TEXT"
}
]
}
This endpoint retrieves all member fields for your organization.
HTTP Request
GET https://api.huntr.co/org/member-fields
Create new member field
curl --location --request POST 'https://api.huntr.co/org/member-fields' \
--header 'Authorization: Bearer <ORG_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Location",
"fieldType": "MULTIPLE_CHOICE",
"choices": ["London", "Paris", "New York", "San Francisco"]
}'
The above command returns JSON structured like this:
{
"id": "5ec44b9cc482170b3129e569",
"name": "Locations",
"fieldType": "MULTIPLE_CHOICE",
"choices": [
"London",
"Paris",
"New York",
"San Francisco"
]
}
This endpoint creates a new Member Field. After creating the new field, you will
be able to view the field from your advisor dashboard and will be able to send
organization invitations with the memberFieldValues
referring to the newly created field.
To prevent duplicate fields from being created, requests with a field name that matches an existing Member Field from your organization, will return an error message and the field will not be created.
HTTP Request
POST https://api.huntr.co/org/member-fields
JSON Body Parameters
Parameter | Required | Type | Description |
---|---|---|---|
name |
yes | String | Name of the new field, must be unique (i.e: you cannot have two fields with the same name) |
fieldType |
yes | String | One of type of member fields |
choices |
only when fieldType == 'MULTIPLE_CHOICE' |
Array | List of strings representing choices in a field of type MULTIPLE_CHOICE |
Board Templates
Board Template Resource
A board template:
{
"id": "5a6e4a567e42789e6e65c986",
"name": "Tech Jobs",
"listTemplates": [
{
"id": "5fc9686050c1de39c8412af7",
"name": "Wishlist"
},
{
"id": "5fc9686050c1de39c8412af8",
"name": "Applied"
},
{
"id": "5fc9686050c1de39c8412af9",
"name": "Phone Interview"
},
{
"id": "5fc9686050c1de39c8412af2",
"name": "On Site Interview"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Offer"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Rejected"
}
],
"isDefault": true
}
A template to use when creating a new board for your members. Board templates are used when you want your job seekers' boards to have specific stages. Say you want your job seekers' board to have the following stages ['Wishlist', 'Applied', 'Interview', 'Offer']
. First you create a board template where listTemplates == [{name: 'Wishlist'}, {name: 'Applied'}, {name: 'Interview'}, {name: 'Offer'}]
(the order of the stages is the same order that will be followed when a new board is created). Then you can create a new Organization Invitation in which boardTemplateId
is the id of the Board Template you just created.
Field | Type | Found in all records | Description |
---|---|---|---|
id | String | true | Board Template id |
name | String | true | Board template name |
listTemplates | Array | true | Template used to create each stage in a board created with this template |
isDefault | Boolean | true | If true, it means the template is the default within the organization |
Deprecated board template fields
These fields will be supported until the end of Q1 2021. See the Replacement field column to see what field is replacing the deprecated fields.
Field | Type | Replacement field | Description |
---|---|---|---|
listNames |
Array | listTemplates |
Names of each stage in a board created with this template |
Default Board Stages
In cases where there are no existing Board Templates for your organization. Huntr will create boards with the following stages (in the order shown):
[ "wishlist", "applied", "interview", "offer", "rejected" ]
List Board Templates
curl "https://api.huntr.co/org/board-templates"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5a6bd300f92659747fe49a53",
"name": "Spring 2018",
"isDefault": false,
"listTemplates": [
{
"id": "5fc9686050c1de39c8412ad8",
"name": "Applied"
},
{
"id": "5fc9686050c1de39c8412ad9",
"name": "Wishlist"
},
{
"id": "5fc9686050c1de39c8412ad2",
"name": "Interview"
},
{
"id": "5fc9686050c1de39c8412ada",
"name": "Offer"
}
]
},
{
"id": "5a6e4a567e42789e6e65c986",
"name": "Tech Jobs",
"isDefault": true,
"listTemplates": [
{
"id": "5fc9686050c1de39c8412af7",
"name": "Wishlist"
},
{
"id": "5fc9686050c1de39c8412af8",
"name": "Applied"
},
{
"id": "5fc9686050c1de39c8412af9",
"name": "Phone Interview"
},
{
"id": "5fc9686050c1de39c8412af2",
"name": "On Site Interview"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Offer"
},
{
"id": "5fc9686050c1de39c8412afa",
"name": "Rejected"
}
]
}
]
}
This endpoint retrieves all board templates for your organization.
HTTP Request
GET https://api.huntr.co/org/board-templates
Jobs
Job Resource
A job in one of your members' boards:
{
"id": "5eb0a4338899ba51bf96f645",
"title": "Senior Engineer",
"htmlDescription": "<p><strong>Description</strong></p><p>Great opportunity</p>",
"salary": "$90k",
"url": "https://linkedin.com/job/123",
"location": {
"address": "2015 Main St, Vancouver, BC V5T 3C2, Canada",
"name": "Mailchimp",
"placeId": "ChIJG7btXnJxhlQR62EUZuSVsOE",
"id": "ceb4675ecb0f218b4adf86d215eeffbcb12f5f1f",
"url": "https://maps.google.com/?cid=16262663062632554987",
"lat": "49.2668893",
"lng": "-123.1012246"
},
"createdAt": 1588634675,
"ownerMember": {
"id": "5e6a7bbdc56bc6669e3da86c",
"givenName": "Ruipo",
"familyName": "Fauli",
"email": "[email protected]",
"createdAt": 1584036797,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"employer": {
"id": "5a016b5221bce9aa2bd70296",
"name": "MailChimp",
"domain": "mailchimp.com",
"foundedYear": 2001,
"isPartner": true,
"description": "MailChimp provides marketing automation for e-commerce businesses. Send beautiful emails, connect your e-commerce store, advertise, and build your brand.\n",
"location": "675 Ponce De Leon Ave NE #5000, Atlanta, GA 30308, USA"
},
"list": {
"name": "Applied"
},
"activities": [
{
"id": "5eb0abc13fac1580adcf5b19",
"title": "Follow Up",
"note": "With pete",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588809403,
"createdAt": 1588636609
},
{
"id": "5eb0cbafacf21d6980c45d64",
"title": "Apply",
"completed": true,
"createdByWorkflow": false,
"startAt": 1588748400,
"completedAt": 1588644783,
"createdAt": 1588644783
},
{
"id": "5eb0cbb2acf21d6980c45d66",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588834800,
"createdAt": 1588644786
},
{
"id": "5eb0cbb6acf21d6980c45d68",
"title": "Offer Received",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590044400,
"completedAt": 1588644790,
"createdAt": 1588644790
},
{
"id": "5eb0cbbaacf21d6980c45d6a",
"title": "Accept Offer",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590562800,
"completedAt": 1588644794,
"createdAt": 1588644794
},
{
"id": "5eb0cebdf9e9ac821876aab0",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1589353200,
"createdAt": 1588645565
}
],
"interviewActivities": [
{
"id": "5eb0cbb2acf21d6980c45d66",
"title": "Phone interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588834800,
"createdAt": 1588644786
},
{
"id": "5eb0cebdf9e9ac821876aab0",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1589353200,
"createdAt": 1588645565
}
],
"applicationActivity": {
"id": "5eb0cbafacf21d6980c45d64",
"title": "Apply",
"completed": true,
"createdByWorkflow": false,
"startAt": 1588748400,
"completedAt": 1588644783,
"createdAt": 1588644783
},
"offerActivity": {
"id": "5eb0cbb6acf21d6980c45d68",
"title": "Offer Received",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590044400,
"completedAt": 1588644790,
"createdAt": 1588644790
},
"offerAcceptedActivity": {
"id": "5eb0cbbaacf21d6980c45d6a",
"title": "Accept Offer",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590562800,
"completedAt": 1588644794,
"createdAt": 1588644794
}
}
A job is an instance of a job opportunity that one of your members has added to one of their boards managed by your organization. Each job card in the Huntr UI represent a different Job.
Field | Type | Description |
---|---|---|
id |
String | Job's id |
title |
String | Job title |
description |
String | Job description |
htmlDescription |
String | Html Job description |
description |
String | Job description |
salary |
String | Job salary |
url |
String | URL for the original job post |
location |
Object | Object representing job's location |
deadline |
Unix timestamp | Date of job's application deadline |
activities |
Array | Activities linked to job |
applicationActivity |
Object | Application Activity linked to job |
interviewActivities |
Array | Interview Activities linked to job |
offerActivity |
Object | Offer Received Activity linked to job |
offerAcceptedActivity |
Object | Offer Accepted Activity linked to job |
creatorMember |
Object | Member who created the job |
ownerMember |
Object | Member who owns the job |
employer |
Object | Employer for the job |
list |
Object | Object representing the list the job is in. A list is a stage in a specific Huntr board. |
createdAt |
Unix timestamp | Date the job was created by the member |
Deprecated job fields
These fields will be supported until the end of 2020. See the Replacement field column to see what field is replacing the deprecated fields.
Field | Type | Replacement field | Description |
---|---|---|---|
applicationDate |
Unix timestamp | applicationActivity |
Date of application deadline |
firstInterviewDate |
Unix timestamp | interviewActivities |
Date of first interview |
secondInterviewDate |
Unix timestamp | interviewActivities |
Date of second interview |
offerDate |
Unix timestamp | offerActivity |
Date offer was received |
member |
Object | ownerMember |
Object representing the member who owns the job |
List Jobs
curl "https://api.huntr.co/org/jobs?limit=2"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5eb0a4338899ba51bf96f645",
"title": "Software Developer",
"htmlDescription": "<p><strong>Description</strong></p><p>Great job!</p>",
"salary": "$90k",
"url": "google.com",
"location": {
"address": "2015 Main St, Vancouver, BC V5T 3C2, Canada",
"name": "Mailchimp",
"placeId": "ChIJG7btXnJxhlQR62EUZuSVsOE",
"id": "ceb4675ecb0f218b4adf86d215eeffbcb12f5f1f",
"url": "https://maps.google.com/?cid=16262663062632554987",
"lat": "49.2668893",
"lng": "-123.1012246"
},
"createdAt": 1588634675,
"ownerMember": {
"id": "5e6a7bbdc56bc6669e3da86c",
"givenName": "Ruipo",
"familyName": "Fauli",
"email": "[email protected]",
"createdAt": 1584036797,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"employer": {
"id": "5a016b5221bce9aa2bd70296",
"name": "MailChimp",
"domain": "mailchimp.com",
"foundedYear": 2001,
"isPartner": true,
"description": "MailChimp provides marketing automation for e-commerce businesses. Send beautiful emails, connect your e-commerce store, advertise, and build your brand.\n",
"location": "675 Ponce De Leon Ave NE #5000, Atlanta, GA 30308, USA"
},
"list": {
"name": "Applied"
},
"activities": [
{
"id": "5eb0abc13fac1580adcf5b19",
"title": "Follow Up",
"note": "With pete",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588809403,
"createdAt": 1588636609
},
{
"id": "5eb0cbafacf21d6980c45d64",
"title": "Apply",
"completed": true,
"createdByWorkflow": false,
"startAt": 1588748400,
"completedAt": 1588644783,
"createdAt": 1588644783
},
{
"id": "5eb0cbb2acf21d6980c45d66",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588834800,
"createdAt": 1588644786
},
{
"id": "5eb0cbb6acf21d6980c45d68",
"title": "Offer Received",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590044400,
"completedAt": 1588644790,
"createdAt": 1588644790
},
{
"id": "5eb0cbbaacf21d6980c45d6a",
"title": "Accept Offer",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590562800,
"completedAt": 1588644794,
"createdAt": 1588644794
},
{
"id": "5eb0cebdf9e9ac821876aab0",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1589353200,
"createdAt": 1588645565
}
],
"interviewActivities": [
{
"id": "5eb0cbb2acf21d6980c45d66",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588834800,
"createdAt": 1588644786
},
{
"id": "5eb0cebdf9e9ac821876aab0",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1589353200,
"createdAt": 1588645565
}
],
"applicationActivity": {
"id": "5eb0cbafacf21d6980c45d64",
"title": "Apply",
"completed": true,
"createdByWorkflow": false,
"startAt": 1588748400,
"completedAt": 1588644783,
"createdAt": 1588644783
},
"offerActivity": {
"id": "5eb0cbb6acf21d6980c45d68",
"title": "Offer Received",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590044400,
"completedAt": 1588644790,
"createdAt": 1588644790
},
"offerAcceptedActivity": {
"id": "5eb0cbbaacf21d6980c45d6a",
"title": "Accept Offer",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590562800,
"completedAt": 1588644794,
"createdAt": 1588644794
}
},
{
"id": "5eaf7f8e7d33a823fd5a06c1",
"title": "Front end engineer",
"location": {},
"createdAt": 1588559758,
"ownerMember": {
"id": "5eae15c3a4e9196db88cb394",
"givenName": "Rennie",
"familyName": "Haylock",
"email": "[email protected]",
"createdAt": 1588467139,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"employer": {
"id": "5903fe3a0ceb436653b2bf7d",
"name": "ESPN",
"domain": "espn.com",
"isPartner": false,
"description": "Visit ESPN to get up-to-the-minute sports news coverage, scores, highlights and commentary for NFL, MLB, NBA, College Football, NCAA Basketball and more.",
"location": "935 Middle St, Bristol, CT 06010, USA"
},
"list": {
"name": "offer"
},
"activities": [
{
"id": "5eaf7fa5f0cf6b54208282be",
"title": "Offer received",
"completed": true,
"createdByWorkflow": true,
"startAt": 1588559758,
"completedAt": 1588559781,
"createdAt": 1588559781
}
],
"offerActivity": {
"id": "5eaf7fa5f0cf6b54208282be",
"title": "Offer received",
"completed": true,
"createdByWorkflow": true,
"startAt": 1588559758,
"completedAt": 1588559781,
"createdAt": 1588559781
}
}
],
"next": "5eaf7f8e7d33a823fd5a06c1"
}
This endpoint lists all jobs added by members from your organization, jobs are sorted by the date they were created, starting from the most recently created.
HTTP Request
GET https://api.huntr.co/org/jobs
Query Parameters
Parameter | Type | Default | Description |
---|---|---|---|
owner_member_id |
String | none | If set, will only return jobs owned by member |
creator_member_id |
String | none | If set, will only return jobs created by member |
created_after |
Unix timestamp | none | If set, will only return jobs created after created_after |
created_before |
Unix timestamp | none | If set, will only return jobs created before created_before |
limit |
Integer | 100 | Defines the maximum number of jobs to return |
next |
String | none | If set, returns the next set of results after the object id provided |
Retrieve a Job
curl "https://api.huntr.co/org/jobs/5eb0a4338899ba51bf96f645"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"id": "5eb0a4338899ba51bf96f645",
"title": "Software Engineer",
"htmlDescription": "<p><strong>Description</strong></p><p>Great job!</p>",
"salary": "$90k",
"url": "google.com",
"location": {
"address": "2015 Main St, Vancouver, BC V5T 3C2, Canada",
"name": "Mailchimp",
"placeId": "ChIJG7btXnJxhlQR62EUZuSVsOE",
"id": "ceb4675ecb0f218b4adf86d215eeffbcb12f5f1f",
"url": "https://maps.google.com/?cid=16262663062632554987",
"lat": "49.2668893",
"lng": "-123.1012246"
},
"createdAt": 1588634675,
"ownerMember": {
"id": "5e6a7bbdc56bc6669e3da86c",
"givenName": "Ruipo",
"familyName": "Fauli",
"email": "[email protected]",
"createdAt": 1584036797,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"employer": {
"id": "5a016b5221bce9aa2bd70296",
"name": "MailChimp",
"domain": "mailchimp.com",
"foundedYear": 2001,
"isPartner": true,
"description": "MailChimp provides marketing automation for e-commerce businesses. Send beautiful emails, connect your e-commerce store, advertise, and build your brand.\n",
"location": "675 Ponce De Leon Ave NE #5000, Atlanta, GA 30308, USA"
},
"list": {
"name": "Applied"
},
"activities": [
{
"id": "5eb0abc13fac1580adcf5b19",
"title": "Follow Up",
"note": "With pete",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588809403,
"createdAt": 1588636609
},
{
"id": "5eb0cbafacf21d6980c45d64",
"title": "Apply",
"completed": true,
"createdByWorkflow": false,
"startAt": 1588748400,
"completedAt": 1588644783,
"createdAt": 1588644783
},
{
"id": "5eb0cbb2acf21d6980c45d66",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588834800,
"createdAt": 1588644786
},
{
"id": "5eb0cbb6acf21d6980c45d68",
"title": "Offer Received",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590044400,
"completedAt": 1588644790,
"createdAt": 1588644790
},
{
"id": "5eb0cbbaacf21d6980c45d6a",
"title": "Accept Offer",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590562800,
"completedAt": 1588644794,
"createdAt": 1588644794
},
{
"id": "5eb0cebdf9e9ac821876aab0",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1589353200,
"createdAt": 1588645565
}
],
"interviewActivities": [
{
"id": "5eb0cbb2acf21d6980c45d66",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588834800,
"createdAt": 1588644786
},
{
"id": "5eb0cebdf9e9ac821876aab0",
"title": "On Site Interview",
"completed": false,
"createdByWorkflow": false,
"startAt": 1589353200,
"createdAt": 1588645565
}
],
"applicationActivity": {
"id": "5eb0cbafacf21d6980c45d64",
"title": "Apply",
"completed": true,
"createdByWorkflow": false,
"startAt": 1588748400,
"completedAt": 1588644783,
"createdAt": 1588644783
},
"offerActivity": {
"id": "5eb0cbb6acf21d6980c45d68",
"title": "Offer Received",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590044400,
"completedAt": 1588644790,
"createdAt": 1588644790
},
"offerAcceptedActivity": {
"id": "5eb0cbbaacf21d6980c45d6a",
"title": "Accept Offer",
"completed": true,
"createdByWorkflow": false,
"startAt": 1590562800,
"completedAt": 1588644794,
"createdAt": 1588644794
}
}
This endpoint retrieves a specific job.
HTTP Request
GET https://api.huntr.co/org/jobs/<ID>
URL Parameters
Parameter | Description |
---|---|
ID | The ID of the job to retrieve |
Activities
Activity Resource
An activity object:
{
"id": "5eb0abc13fac1580adcf5b19",
"title": "Follow Up",
"note": "",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588809403,
"createdAt": 1588636609,
"ownerMember": {
"id": "5e6a7bbdc56bc6669e3da86c",
"givenName": "Ruipo",
"familyName": "Fauli",
"email": "[email protected]",
"createdAt": 1584036797,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"job": {
"id": "5eb0a4338899ba51bf96f645",
"title": "Software Engineer",
"location": {},
"createdAt": 1588634675
},
"employer": {
"id": "5a016b5221bce9aa2bd70296",
"name": "MailChimp",
"domain": "mailchimp.com",
"foundedYear": 2001,
"isPartner": true,
"description": "MailChimp provides marketing automation for e-commerce businesses. Send beautiful emails, connect your e-commerce store, advertise, and build your brand.\n",
"location": "675 Ponce De Leon Ave NE #5000, Atlanta, GA 30308, USA"
},
"activityCategory": {
"id": "5e448f3bf2b856c29af1128c",
"name": "Follow Up"
}
}
An activity represents any task and/or event that happens during a job seeker's search. Activities represent real world things like an On Site Interview
or an Offer Received
, or even a Prep for Interview
task. Each activity is clearly classified into an Activity Category.
Field | Type | In all events | Description |
---|---|---|---|
id |
String | true | id for the activity |
title |
String | true | Title of the activity |
note |
String | false | Note about activity |
completed |
Boolean | true | Completion state of activity |
completedAt |
Unix timestamp | false | If activity.completed is true, then this is the date when activity was completed |
startAt |
Unix timestamp | false | Date when activity is/was scheduled to start |
endAt |
Unix timestamp | false | Date when activity is/was scheduled to end |
createdAt |
Unix timestamp | true | Date when activity was created |
activityCategory |
Object | true | Activity Category representing the type of Activity |
job |
Object | false | Job linked to activity |
employer |
Object | false | If activity is linked to a job, then this is the job's employer |
ownerMember |
Object | true | Member who owns the board where the activity was added. i.e: your job seeker |
creatorMember |
Object | false | Member who created the activity. In most cases, this is your job seeker; but if an advisor created this activity, then it would be your advisor. |
createdByWorkflow |
Boolean | true | If true, it means the Activity was created by the Huntr system as a response to a user action; like a job being moved to a specific stage. See Workflows for more information |
List Activities
curl "https://api.huntr.co/org/activities?limit=4"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5eb0a92378ddef71d0748fb9",
"title": "Prep for Interviews",
"note": "",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588635936,
"createdAt": 1588635939,
"ownerMember": {
"id": "5b2bbb5837fbc835bbe32187",
"givenName": "Nicole",
"familyName": "Thinkful",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"activityCategory": {
"id": "5e448f3bf2b856c29af112a7",
"name": "Prep for Interview"
}
},
{
"id": "5eb0a4745125d758466dea60",
"title": "Applied",
"completed": true,
"createdByWorkflow": true,
"startAt": 1588634685,
"completedAt": 1588634740,
"createdAt": 1588634740,
"ownerMember": {
"id": "5e6a7bbdc56bc6669e3da86c",
"givenName": "Ruipo",
"familyName": "Fauli",
"email": "[email protected]",
"createdAt": 1584036797,
"isActive": true
},
"job": {
"id": "5eb0a4338899ba51bf96f645",
"title": "No Job Title",
"location": {},
"createdAt": 1588634675
},
"employer": {
"id": "5a016b5221bce9aa2bd70296",
"name": "MailChimp",
"domain": "mailchimp.com",
"foundedYear": 2001,
"isPartner": true,
"description": "MailChimp provides marketing automation for e-commerce businesses. Send beautiful emails, connect your e-commerce store, advertise, and build your brand.\n",
"location": "675 Ponce De Leon Ave NE #5000, Atlanta, GA 30308, USA"
},
"activityCategory": {
"id": "5e448f3bf2b856c29af11289",
"name": "Apply"
}
},
{
"id": "5eb0a4058899ba51bf96f643",
"title": "Got to Networking Event",
"note": "",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588634619,
"createdAt": 1588634629,
"ownerMember": {
"id": "5e6a7bbdc56bc6669e3da86c",
"givenName": "Ruipo",
"familyName": "Fauli",
"email": "[email protected]",
"createdAt": 1584036797,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"activityCategory": {
"id": "5e448f3bf2b856c29af112b3",
"name": "Networking Event"
}
},
{
"id": "5eaf7fa5f0cf6b54208282be",
"title": "Offer received",
"completed": true,
"createdByWorkflow": true,
"startAt": 1588559758,
"completedAt": 1588559781,
"createdAt": 1588559781,
"ownerMember": {
"id": "5eae15c3a4e9196db88cb394",
"givenName": "Rennie",
"familyName": "Haylock",
"email": "[email protected]",
"createdAt": 1588467139,
"isActive": true
},
"job": {
"id": "5eaf7f8e7d33a823fd5a06c1",
"title": "No Job Title",
"location": {},
"createdAt": 1588559758
},
"employer": {
"id": "5903fe3a0ceb436653b2bf7d",
"name": "ESPN",
"domain": "espn.com",
"isPartner": false,
"description": "Visit ESPN to get up-to-the-minute sports news coverage, scores, highlights and commentary for NFL, MLB, NBA, College Football, NCAA Basketball and more.",
"location": "935 Middle St, Bristol, CT 06010, USA"
},
"activityCategory": {
"id": "5e448f3bf2b856c29af1129c",
"name": "Offer Received"
}
}
],
"next": "5eaf7fa5f0cf6b54208282be"
}
This endpoint retrieves all activities for your organization, sorted from most recently created to oldest.
HTTP Request
GET https://api.huntr.co/org/activities
Query Parameters
Parameter | Type | Default | Description |
---|---|---|---|
owner_member_id |
String | none | If set, will only return activities belonging to member |
creator_member_id |
String | none | If set, will only return activities executed by member |
job_id |
String | none | If set, will only return activities linked to job |
activity_category_id |
String | none | If set, will only return Activity activities of the specified activity category |
employer_id |
String | none | If set, will only return activities linked to employer |
limit |
Integer | 100 | Defines the maximum number of activities to return |
next |
String | none | If set, returns the next set of results after the object id provided |
created_after |
Unix timestamp | none | If set, will only return activities created after created_after |
created_before |
Unix timestamp | none | If set, will only return activities created before created_before |
Activity Categories
Activity Category Resource
An activity category object:
{
"id": "5b05ca43f193b66c692c29a0",
"name": "On Site Interview",
}
This resource classifies a specific instance of an Activity into one of a discrete set of Activity Categories.
Parameter | Type | Default | Description |
---|---|---|---|
id |
String | none | id for the activity category |
name |
String | none | name for the activity category |
Types of Activity Categories
This is a list of all the activity categories currently available.
activityCategory.name |
Description |
---|---|
Email |
Job seeker needs to send an email |
Meeting |
Job seeker is attending a meeting |
Phone Call |
Job seeker needs to make a phone call |
Reach Out |
Job seeker needs to reach out to someone |
Get Reference |
Job seeker needs to get a reference(s) |
Prep Cover Letter |
Job seeker needs to prepare their cover letter |
Prep Resume |
Job seeker needs to prepare their resume |
Apply |
Job seeker has applied to a job opportunity |
Follow Up |
Job seeker needs to follow up with someone |
Send Availability |
Job seeker needs to send their availability |
Prep for Interview |
Job seeker needs to prepare for an interview |
Phone Screen |
Job seeker has or completed a phone screen type interview |
Phone Interview |
Job seeker has or completed a phone interview |
Assignment |
Job seeker has or has completed an assignment |
On Site Interview |
Job seeker has or completed an on site interview |
Rejected |
Job seeker's application has been rejected by the employer |
Offer Received |
Job seeker has received an offer |
Decline Offer |
Job seeker declines an offer |
Accept Offer |
Job seeker accepts an offer |
Send Thank You |
Job seeker needs to send a thank you |
Networking Event |
Job seeker needs to or has attended a networking event |
Application Withdrawn |
Job seeker has withdrawn their application |
Other |
Other activities |
Key Activity Categories
Here is a shorter list of activity categories we believe represent important milestones in a job seeker's search:
activityCategory.name |
Description |
---|---|
Apply |
Job seeker has applied to a job opportunity |
Phone Screen |
Job seeker has scheduled or completed a phone screen type interview |
Phone Interview |
Job seeker has scheduled or completed a phone interview |
Assignment |
Job seeker has scheduled or completed an assignment |
On Site Interview |
Job seeker has scheduled or completed an on site interview |
Rejected |
Job seeker's application has been rejected by the employer |
Offer Received |
Job seeker has received an offer |
Decline Offer |
Job seeker has declined an offer |
Accept Offer |
Job seeker has accepted an offer |
Application Withdrawn |
Job seeker has withdrawn their application |
List Activity Categories
curl "https://api.huntr.co/org/activity-categories"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"name" : "Email",
"id" : "5e448e8df2b856c29af11181"
},
{
"name" : "Meeting",
"id" : "5e448f3bf2b856c29af11280"
},
{
"name" : "Phone Call",
"id" : "5e448f3bf2b856c29af11281"
},
{
"name" : "Reach Out",
"id" : "5e448f3bf2b856c29af11284"
},
{
"name" : "Get Reference",
"id" : "5e448f3bf2b856c29af11285"
},
{
"name" : "Prep Cover Letter",
"id" : "5e448f3bf2b856c29af11288"
},
{
"name" : "Apply",
"id" : "5e448f3bf2b856c29af11289"
},
{
"name" : "Follow Up",
"id" : "5e448f3bf2b856c29af1128c"
},
{
"name" : "Send Availability",
"id" : "5e448f3bf2b856c29af1128d"
},
{
"name" : "Phone Screen",
"id" : "5e448f3bf2b856c29af1128f"
},
{
"name" : "Phone Interview",
"id" : "5e448f3bf2b856c29af11293"
},
{
"name" : "Assignment",
"id" : "5e448f3bf2b856c29af11295"
},
{
"name" : "On Site Interview",
"id" : "5e448f3bf2b856c29af11296"
},
{
"name" : "Rejected",
"id" : "5e448f3bf2b856c29af11299"
},
{
"name" : "Offer Received",
"id" : "5e448f3bf2b856c29af1129c"
},
{
"name" : "Prep Resume",
"id" : "5e448f3bf2b856c29af1129d"
},
{
"name" : "Decline Offer",
"id" : "5e448f3bf2b856c29af1129f"
},
{
"name" : "Accept Offer",
"id" : "5e448f3bf2b856c29af112a1"
},
{
"name" : "Other",
"id" : "5e448f3bf2b856c29af112a3"
},
{
"name" : "Prep for Interview",
"id" : "5e448f3bf2b856c29af112a7"
},
{
"name" : "Send Thank You",
"id" : "5e448f3bf2b856c29af112ad"
},
{
"name" : "Networking Event",
"id" : "5e448f3bf2b856c29af112b3"
},
{
"name" : "Application Withdrawn",
"id" : "5e9a596e53a63660289cd97c"
}
]
}
This endpoint retrieves all activity categories.
Actions
Action Resource
An action object:
{
"id": "5eb0a4338899ba51bf96f646",
"actionType": "JOB_CREATED",
"date": 1588634675,
"ownerMember": {
"id": "5e6a7bbdc56bc6669e3da86c",
"givenName": "Ruipo",
"familyName": "Fauli",
"email": "[email protected]",
"createdAt": 1584036797,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"job": {
"id": "5eb0a4338899ba51bf96f645",
"title": "No Job Title",
"salary": "$90k",
"location": {},
"createdAt": 1588634675
},
"employer": {
"id": "5a016b5221bce9aa2bd70296",
"name": "MailChimp",
"domain": "mailchimp.com",
"foundedYear": 2001,
"isPartner": true,
"description": "MailChimp provides marketing automation for e-commerce businesses. Send beautiful emails, connect your e-commerce store, advertise, and build your brand.\n",
"location": "675 Ponce De Leon Ave NE #5000, Atlanta, GA 30308, USA"
},
"toList": {
"name": "Wishlist"
},
"createdByWorkflow": false,
"createdAt": 1588634675,
"jobId": "5eb0a4338899ba51bf96f645"
}
An action represents CRUD (Create, read, update and delete) type events that occur within the Huntr application in the context of your organization. Essentially, whenever your job seekers or advisors create, update or delete a Job, Activity, Contact, or Note a new Action will be created representing that event:
Field | Type | In all actions | Description |
---|---|---|---|
id |
String | true | id for the action |
actionType |
String | true | Type of action |
date |
Unix timestamp | true | Date when the action happened |
createdByWorkflow |
Boolean | true | If true, it means the Action was taken by the Huntr system as a response to another user action; like a job being moved to a specific stage. See Workflows for more information. |
ownerMember |
Object | true | Member who owns the board where the action occurred. i.e: your job seeker |
creatorMember |
Object | true | Member who took the action. In most cases, this is your job seeker; but if an advisor took the action, then it would be your advisor. |
jobId |
String | false | id for job linked to this action |
job |
Object | false | Job linked to this action |
jobs |
Array | false | Jobs linked to this action; only applies to Contact actions, since a contact can be linked to multiple jobs |
employerId |
String | false | id for Employer linked to this action |
employer |
Object | false | Employer linked to this action |
employers |
Array | false | Employers linked to this action; only applies to Contact actions since a contact can be linked to multiple employers |
activityId |
String | false | id for Activity linked to this action |
activity |
Object | false | Activity linked to this action; only applies to Activity actions |
activityCategory |
Object | false | Activity Category linked to this action; only applies to Activity actions |
noteId |
String | false | id for note linked to this action |
note |
Object | false | Note linked to this action; only applies to Note actions |
contactId |
String | false | id for contact linked to this action |
contact |
Object | false | Contact linked to this action; only applies to Contact actions |
fromList |
Object | false | List from which job was moved in a JOB_MOVED action |
toList |
Object | false | List to which a job was moved or added to in JOB_MOVED and JOB_CREATED actions |
member |
Object | false | Member created in MEMBER_CREATED actions |
organizationInvitation |
Object | false | Organization Invitation that was accepted on MEMBER_CREATED actions. |
update |
Object | false | Entry used to update the resource, only shown in Update actions |
Action Types
There are multiple action types:
Action Type | Description | Extra fields |
---|---|---|
MEMBER_CREATED |
A new member is created. i.e: job seeker has accepted invitation | member organizationInvitation |
JOB_CREATED |
A new job is created | job employer toList |
JOB_UPDATED |
A job is updated | job employer update |
JOB_DELETED |
A job is deleted | jobId employer |
JOB_MOVED |
A job is moved from one stage to another | job employer fromList toList |
ACTIVITY_CREATED |
A new activity is created | activity activityCategory job employer |
ACTIVITY_UPDATED |
An activity is updated | activity activityCategory job employer update |
ACTIVITY_DELETED |
An activity is deleted | activityId activityCategory job employer |
NOTE_CREATED |
A new note is created | note job employer |
NOTE_UPDATED |
A note is updated | note job employer |
NOTE_DELETED |
A note is deleted | noteId job employer |
CONTACT_CREATED |
A new contact is created | contact employers jobs |
CONTACT_UPDATED |
A contact is updated | contact employers jobs update |
CONTACT_DELETED |
A contact is deleted | contactId |
ORGANIZATION_COMPANY_CREATED |
An employer is saved through the '+ Company' Advisor portal modal | employer |
ORGANIZATION_COMPANY_UPDATED |
An employer's info is updated through the Advisor portal | employer update |
List Actions
curl "https://api.huntr.co/org/actions?limit=3"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5eb0abc13fac1580adcf5b1a",
"actionType": "ACTIVITY_CREATED",
"date": 1588636609,
"ownerMember": {
"id": "5e6a7bbdc56bc6669e3da86c",
"givenName": "Ruipo",
"familyName": "Fauli",
"email": "[email protected]",
"createdAt": 1584036797,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"job": {
"id": "5eb0a4338899ba51bf96f645",
"title": "No Job Title",
"salary": "$90k",
"location": {},
"createdAt": 1588634675
},
"employer": {
"id": "5a016b5221bce9aa2bd70296",
"name": "MailChimp",
"domain": "mailchimp.com",
"foundedYear": 2001,
"isPartner": true,
"description": "MailChimp provides marketing automation for e-commerce businesses. Send beautiful emails, connect your e-commerce store, advertise, and build your brand.\n",
"location": "675 Ponce De Leon Ave NE #5000, Atlanta, GA 30308, USA"
},
"activity": {
"id": "5eb0abc13fac1580adcf5b19",
"title": "Follow Up",
"note": "With pete",
"completed": false,
"createdByWorkflow": false,
"startAt": 1588809403,
"createdAt": 1588636609
},
"activityCategory": {
"id": "5e448f3bf2b856c29af1128c",
"name": "Follow Up"
},
"createdByWorkflow": false,
"createdAt": 1588636609,
"jobId": "5eb0a4338899ba51bf96f645",
"activityId": "5eb0abc13fac1580adcf5b19"
},
{
"id": "5eb0a43d8899ba51bf96f647",
"actionType": "JOB_MOVED",
"date": 1588634685,
"ownerMember": {
"id": "5e6a7bbdc56bc6669e3da86c",
"givenName": "Ruipo",
"familyName": "Fauli",
"email": "[email protected]",
"createdAt": 1584036797,
"isActive": true
},
"creatorMember": {
"id": "5b2bbb5837fbc835bbe3218b",
"givenName": "Advisor",
"familyName": "Two",
"email": "[email protected]",
"createdAt": 1529592664,
"isActive": true
},
"job": {
"id": "5eb0a4338899ba51bf96f645",
"title": "No Job Title",
"salary": "$90k",
"location": {},
"createdAt": 1588634675
},
"employer": {
"id": "5a016b5221bce9aa2bd70296",
"name": "MailChimp",
"domain": "mailchimp.com",
"foundedYear": 2001,
"isPartner": true,
"description": "MailChimp provides marketing automation for e-commerce businesses. Send beautiful emails, connect your e-commerce store, advertise, and build your brand.\n",
"location": "675 Ponce De Leon Ave NE #5000, Atlanta, GA 30308, USA"
},
"fromList": {
"name": "Wishlist"
},
"toList": {
"name": "Applied"
},
"createdByWorkflow": false,
"createdAt": 1588634685,
"jobId": "5eb0a4338899ba51bf96f645"
},
{
"id": "5eae1460180a05fbb45f73af",
"actionType": "NOTE_CREATED",
"date": 1588466784,
"ownerMember": {
"id": "5eae15c3a4e9196db88cb394",
"givenName": "Rennie",
"familyName": "Haylock",
"email": "[email protected]",
"createdAt": 1588467139,
"isActive": true
},
"creatorMember": {
"id": "5eae15c3a4e9196db88cb394",
"givenName": "Rennie",
"familyName": "Haylock",
"email": "[email protected]",
"createdAt": 1588467139,
"isActive": true
},
"job": {
"id": "5d7980458a3fd22bfe291f38",
"title": "No Job Title",
"url": "http://localhost:3000/app/track/boards/5cc7ab1f5073b727a3862719/board",
"location": {
"address": ""
},
"createdAt": 1568243781
},
"employer": {
"id": "5d798045ad35fc0158480b95",
"name": "The San Diego Foundation",
"domain": "sdfoundation.org",
"foundedYear": 1975,
"isPartner": false,
"description": "The San Diego Foundation is a community resource that improves San Diegans’ quality of life by creating equity and ensuring opportunities in the region.",
"location": "2508 Historic Decatur Rd #200, San Diego, CA 92106, USA"
},
"note": {
"id": "5eae14603eabef4cb322078e",
"text": "Great Interview"
},
"createdByWorkflow": false,
"createdAt": 1588466784,
"jobId": "5d7980458a3fd22bfe291f38",
"noteId": "5eae14603eabef4cb322078e"
}
],
"next": "5eae1460180a05fbb45f73af"
}
This endpoint retrieves all actions for your organization, sorted from most recently created to oldest.
HTTP Request
GET https://api.huntr.co/org/actions
Query Parameters
Parameter | Type | Default | Description |
---|---|---|---|
action_type |
String | none | If set, will only return actions of the specific type. See action types section for possible action type name values. |
owner_member_id |
String | none | If set, will only return actions belonging to member |
creator_member_id |
String | none | If set, will only return actions executed by member |
job_id |
String | none | If set, will only return actions linked to job |
activity_id |
String | none | If set, will only return actions for the specified activity |
note_id |
String | none | If set, will only return actions for the specified note |
contact_id |
String | none | If set, will only return actions for the specified contact |
activity_category_id |
String | none | If set, will only return Activity actions of the specified activity category |
employer_id |
String | none | If set, will only return actions linked to employer |
limit |
Integer | 100 | Defines the maximum number of actions to return |
next |
String | none | If set, returns the next set of results after the object id provided |
created_after |
Unix timestamp | none | If set, will only return actions created after created_after |
created_before |
Unix timestamp | none | If set, will only return actions created before created_before |
Notes
Note Resource
A note object:
{
"id": "5b05ca42f193b66c692c29a0",
"text": "Interview went well. It lasted about 2 hours and was half technical and half culture fit.",
}
This resource represents a note.
Parameter | Type | Default | Description |
---|---|---|---|
id |
String | none | id for the note |
text |
String | none | text in the note |
Contacts
Contact Resource
A contact object:
{
"id": "5b05ca43f193b64c692c29a0",
"firstName": "Pepe",
"lastName": "Alava",
"email": "[email protected]",
"title": "HR Manager",
"location": "Seattle, WA USA",
"profiles": {
"linkedin" : "pepealava",
"twitter" : "pepealava",
"googlePlus" : "pepealava",
"crunchbase" : "pepealava",
"facebook" : "pepealava",
"github" : "pepealava",
"aboutme" : "pepealava",
"gravatar" : "pepealava"
}
}
This resource represents a contact.
Parameter | Type | Default | Description |
---|---|---|---|
id |
String | none | id for the note |
firstName |
String | none | Contact's first name |
lastName |
String | none | Contact's last name |
email |
String | none | Contact's email |
title |
String | none | Contact's job title |
location |
String | none | Contact's location |
profiles |
Object | none | Contact's social media profile handles |
Employers
Employer Resource
An employer for which your members have added a job for:
{
"id": "589b77128bf3dd17f01a3055",
"name": "Etsy",
"domain": "etsy.com",
"foundedYear": 2005,
"description": "Find handmade, vintage, and unique goods that express who you are.",
"location": "55 Washington St #512, Brooklyn, NY 11201, USA",
"jobCount": 4,
"isPartner": true,
"applicationCount": 2,
"interviewCount": 1,
"offerCount": 1
}
An employer for which your members have added a job for.
Field | Type | Description |
---|---|---|
id |
String | Employer's id |
name |
String | Name of the employer |
domain |
String | Website for the employer |
foundedYear |
Integer | Year the employer was founded |
description |
String | Employer description |
location |
String | Full address for the employer |
jobCount |
Integer | Number of jobs added for this employer |
isPartner |
Boolean | Set to true if the Employer has been marked as a partner for your organization |
applicationCount |
Integer | Number of applications to this employer |
interviewCount |
Integer | Number of interviews from this employer |
offerCount |
Integer | Number of offers from this employer |
List Employers
curl "https://api.huntr.co/org/employers?limit=2"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5b088f63b9defaba88d37264",
"name": "The Art Institutes",
"domain": "artinstitutes.edu",
"foundedYear": 1921,
"description": "The Art Institutes is a system of over 30 nonprofit institutions with a focus on education, student outcomes, and community involvement. Learn more about our programs.\r ",
"location": "K&L Gates Center, 210 Sixth Avenue, Pittsburgh, PA 15222, USA",
"isPartner": true,
"jobCount": 1,
"applicationCount": 0,
"interviewCount": 0,
"offerCount": 0
},
{
"id": "5b088a7bb9defaba88d36f1e",
"name": "ResearchGate",
"domain": "researchgate.net",
"foundedYear": 2008,
"description": "Find 100+ million publication pages, 15+ million researchers, and 700k+ projects. ResearchGate is where you discover scientific knowledge and share your work.",
"location": "10115 Berlin, Germany",
"isPartner": false,
"jobCount": 1,
"applicationCount": 1,
"interviewCount": 2,
"offerCount": 1
}
],
"next": "5b088a7bb9defaba88d36f1e"
}
This endpoint retrieves all employers to which your members have added a job for.
HTTP Request
GET https://api.huntr.co/org/employers
Query Parameters
Parameter | Default | Description |
---|---|---|
limit | 100 | Defines the maximum number of employers to return |
next | none | If set, returns the next set of results after the object id provided |
Events (Deprecated)
Events Deprecation
The Event resource endpoints will work until the end of 2020, but going forward you should replace all Event calls for Action calls. Actions offer a more robust architecture encompassing many more things that occur within the Huntr application (see the Action resource for more info).
Why we are deprecating Events
Our old Event resource mixed CRUD type events like JOB_ADDED
with real life events like
JOB_APPLICATION_DATE_SET
and JOB_OFFER_DATE_SET
. We have addressed this by creating Actions,
which exclusively represent CRUD type events that happen within the application.
Things like JOB_CREATED
, JOB_DELETED
, NOTE_CREATED
, CONTACT_UPDATED
are now Actions.
Events that happen in the real world, like Apply
, Phone Interview
, Prep for Interview
,
Offer Received
, Offer Accepted
are now represented through the Activity resource.
We like to think of these as things you would put on a to do list or a calendar; they map one
to one with the items show on the 'Activities' section of Huntr boards. Each activity
has an Activity Category representing the type of Activity it is (see the Activity resource for more info).
Furthermore, the architecture of our old Event resource limited the number of events that a job seeker could log. There were only two interview fields for example. With the new Activity + Action combo, job seekers can log as many interviews or other activities as they want. It also opens up the possibility to create custom Activity Categories for your organization, to track any type of activity.
Migrating from Events to Actions
You can still listen for both CRUD and real world events through the Action resource
endpoint. Since real world events are Activities, they are accounted for in Actions through the
ACTIVITY_CREATED
action type, which will contain an activityCategory
field that
will let you know what kind of activity it represents.
Here is what the old event types would translate to in the new Action resource:
Event Name | action.actionType |
action.activityCategory.name |
---|---|---|
JOB_ADDED |
JOB_CREATED |
null |
JOB_MOVED |
JOB_MOVED |
null |
JOB_APPLICATION_DATE_SET |
ACTIVITY_CREATED |
Apply |
JOB_FIRST_INTERVIEW_DATE_SET |
ACTIVITY_CREATED |
Phone Interview |
JOB_SECOND_INTERVIEW_DATE_SET |
ACTIVITY_CREATED |
On Site Interview |
JOB_OFFER_DATE_SET |
ACTIVITY_CREATED |
Offer Received |
Events Resource
An event object:
{
"id": "5b05ca43f193b66c692c29a0",
"eventType": "JOB_MOVED",
"createdAt": 1527106115,
"member": {
"id": "5a5a88fae10d8c2cea07f2f7",
"givenName": "Gwen",
"familyName": "Johnson",
"email": "[email protected]",
"createdAt": 1515882746
},
"job": {
"id": "5a8a255bb4271026f0c0f749",
"title": "Engineer",
"applicationDate": 1527106115,
"createdAt": 1519002971
},
"toList": {
"name": "applied"
},
"fromList": {
"name": "wishlist"
}
}
An event represents one of many events that can occur during the lifetime of a job, therefore a single job may have multiple events related to it:
Field | Type | In all events | Description |
---|---|---|---|
id |
String | true | id for the event |
eventType |
String | true | Type of event |
date |
Unix timestamp | false | Date when the event actually happened (will happen), this date is usually set by the job seekers themselves |
createdAt |
Unix timestamp | true | Date the event was logged. As an example, if a member logged an interview date today, but the actual interview date logged is next Friday, then createdAt is today, and date is next friday |
member |
Object | true | Member who owns the job |
job |
Object | true | Job for which event applies to |
fromList |
Object | false | List from which job was moved in a job moved event |
toList |
Object | false | List to which a job was moved or added to |
Event Types
There are multiple event types which include:
Event Name | Description | Extra fields |
---|---|---|
JOB_ADDED |
A new job is created | toList |
JOB_MOVED |
An existing job is moved | fromList , toList |
JOB_APPLICATION_DATE_SET |
Application date is set for an existing job | date |
JOB_FIRST_INTERVIEW_DATE_SET |
First interview date is set for an existing job | date |
JOB_SECOND_INTERVIEW_DATE_SET |
Second interview date is set for an existing job | date |
JOB_OFFER_DATE_SET |
Offer date is set for an existing job | date |
List Events
curl "https://api.huntr.co/org/events?limit=2"
-H "Authorization: Bearer <ORG_ACCESS_TOKEN>"
The above command returns JSON structured like this:
{
"data": [
{
"id": "5b17300b4453e621e676d90e",
"eventType": "JOB_OFFER_DATE_SET",
"date": 1528095600,
"createdAt": 1528246283,
"member": {
"id": "5a6bf0758f18344d6f76d118",
"givenName": "Gracielita",
"familyName": "Varelita",
"email": "[email protected]",
"createdAt": 1517023349
},
"job": {
"id": "5b088a7b12728af4ec0be9d6",
"title": "Senior Engineer",
"description": "A job description",
"salary": "$90,000",
"url": "https://linkedin.com/jobs/asdf234adf",
"location": {
"lng": "13.384453399999984",
"lat": "52.53073269999999",
"url": "https://maps.google.com/?cid=13193077415763177194",
"id": "1c56fadc63fb73a87bfae16a1096735b2817793b",
"placeId": "ChIJbTkS9uxRqEcR6u7KfAI6F7c",
"name": "ResearchGate",
"address": "Invalidenstraße 115, 10115 Berlin, Germany"
},
"deadline": 1527404400,
"applicationDate": 1527490800,
"firstInterviewDate": 1527750000,
"secondInterviewDate": 1527836400,
"offerDate": 1528095600,
"createdAt": 1527286395
}
},
{
"id": "5b1730094453e621e676d905",
"eventType": "JOB_SECOND_INTERVIEW_DATE_SET",
"date": 1527836400,
"createdAt": 1528246281,
"member": {
"id": "5a6bf0758f18344d6f76d118",
"givenName": "Gracielita",
"familyName": "Varelita",
"email": "[email protected]",
"createdAt": 1517023349
},
"job": {
"id": "5b088a7b12728af4ec0be9d6",
"title": "Senior Engineer",
"description": "A job description",
"salary": "$90,000",
"url": "https://linkedin.com/jobs/asdf234adf",
"location": {
"lng": "13.384453399999984",
"lat": "52.53073269999999",
"url": "https://maps.google.com/?cid=13193077415763177194",
"id": "1c56fadc63fb73a87bfae16a1096735b2817793b",
"placeId": "ChIJbTkS9uxRqEcR6u7KfAI6F7c",
"name": "ResearchGate",
"address": "Invalidenstraße 115, 10115 Berlin, Germany"
},
"deadline": 1527404400,
"applicationDate": 1527490800,
"firstInterviewDate": 1527750000,
"secondInterviewDate": 1527836400,
"offerDate": 1528095600,
"createdAt": 1527286395
}
}
],
"next": "5b1730094453e621e676d905"
}
This endpoint retrieves all events for your organization, sorted from most recently created to oldest.
HTTP Request
GET https://api.huntr.co/org/events
Query Parameters
Parameter | Type | Default | Description |
---|---|---|---|
member_id |
String | none | If set, will only return events belonging to member |
job_id |
String | none | If set, will only return events belonging to job |
event_type |
String | none | If set, will only return events of the specific type. See event types section for possible event name values. |
limit |
Integer | 100 | Defines the maximum number of jobs to return |
next |
String | none | If set, returns the next set of results after the object id provided |
Workflows
Workflow Resource
A workflow allows Huntr to automatically complete certain Actions when other actions happen within the application. For now, workflows power the automatic creation of certain activities when a job is moved or created into a specific stage. For example, you will notice that if a job seeker moves a job to a stage called "Apply" then Huntr will automatically create an Activity with the Apply
Activity Category.
Default workflows
Our current default workflows are triggered for ALL Huntr users when jobs are created or moved onto stages with names that imply a specific stage type.
The default workflows that power automatic activity creation when jobs are moved onto certain stages are the following:
create
Apply Activitywhen
job is moved or created onto a stage of type APPLYcreate
Phone Screen Activitywhen
job is moved or created onto a stage of type PHONE_SCREENcreate
Phone Interview Activitywhen
job is moved or created onto a stage of type PHONE_INTERVIEWcreate
On Site Interview Activitywhen
job is moved or created onto a stage of type ON_SITE_INTERVIEWcreate
Offer Received Activitywhen
job is moved or created onto a stage of type OFFER_RECEIVEDcreate
Accept Offer Activitywhen
job is moved or created onto a stage of type OFFER_ACCEPTEDcreate
Decline Offer Activitywhen
job is moved or created onto a stage of type OFFER_DECLINED
Stage names to type mapping
All of the default workflows mentioned above depend on the stage type
inferred from the name of the stage a job is being created or moved onto. Here are the stage names that map to each stage type:
*note: stage name matches are not case sensitive, so a stage named 'APply' and another one named 'apply' will both be classified as a stage of type 'APPLY'.
Stage Type | Stage Names |
---|---|
APPLY |
applied apply applying applied online |
PHONE_SCREEN |
phone screen screening call phone screen(s) phone screening tech screen screening interview technical screen technical phone screen |
PHONE_INTERVIEW |
phone phone interview video interview hr interview hr phone interview phone interviews |
ON_SITE_INTERVIEW |
interview on-site on-site interview onsite interviews onsite interview on site on site interview final round interview interview 2 interview 1 2nd interview 1st interview interviewing interviews 3+ technical interview personal interview virtual interview in person interview in-person interview in-person interview(s) interviewed final round second interview entrevistas tech interview final interview live interview interview (1st) interview (2nd) second round first interview 2nd round interview 3 technical 3rd interview additional onsite interview scheduled 1st round in-person initial interview entrevista |
OFFER_RECEIVED |
offer offers offer received offer extended offered offer letter ofertas |
OFFER_ACCEPTED |
offer accepted accepted accept accept offer |
OFFER_DECLINED |
offer declined declined decline offer i rejected rejected by me i declined declined offer rejected offer reject offer refused offer rejected |
Coming soon
The next step is to allow job seekers and organizations to create their own workflows to accomplish things like recurring Activity creation.
Webhooks
Receiving Webhooks
Huntr can send webhook events to notify your application any time an action happens within your organization.
You can register webhook URLs in your organization's admin dashboard, under the Developers tab that we will notify any time an action happens in your organization. When the action occurs—a new job is created, an activity is updated, etc.—Huntr creates a Action object.
The Action object contains all the information about the event that just happened, including the type of action and the data associated with that action. Huntr will send the Action via an HTTP POST
request, to any endpoint URLs that you have defined in your organization's Webhooks settings.
Responding to a webhook
To acknowledge receipt of a webhook, your endpoint should return a 200
HTTP status code. All other response codes will indicate to Huntr that you did not receive the webhook.
Secure your webhooks (Optional)
Huntr will sign the webhook events it sends to your endpoints by including a signature in each event’s x-huntr-hmac-sha256
header. This allows you to verify that the events were sent by Huntr, not by a third party. Signatures for each webhook event are created using the HMAC SHA-256 algorithm.
Validating Huntr signature
To validate the signature you received from Huntr, you will generate the signature yourself using your Webhook's secret and compare that signature with the signature you receive in the webhook payload.
- Retrieve the Webhook secret through your advisor portal. Head to to the Developers tab -> Click Webhooks -> Click
Reveal
for the Webhook record you are working with. - Using the HMAC SHA-256 algorithm, create a hash (using the retrieved secret from step 1 as a key) of the entire received payload.
- Encode the hash in base64 format.
- Compare the created value with the signature you received in the
x-huntr-hmac-sha256
header from Huntr.
You can find some code samples on how this verification might work for Python and Node in our huntr-webhook-verification-examples repo.
Common issues when validating signature
- You are looking at the wrong header. Check the headers for the specific framework or environment you are working on. While Huntr submits the header name as
x-huntr-hmac-sha256
, certain frameworks will change case or append extra text into headers. Logging all the request headers for inspection can help find the exact key for the signature header within your framework. - Payload used to create hash is incorrect. The body/payload you are providing the hmac algorithm might not exactly match the body that the Huntr system used to encode the hmac signature in the first place. Huntr creates the hmac algorithm with a stringified version of the request body (i.e: the payload). You might have to 'stringify' the request body in certain frameworks and not in others depending on how each framework encodes the request object.
- Don't forget to encode the HMAC hash in base64 format. You might be properly calculating the hmac, but might have forgotten to encode that result to base64, or you might be encoding to 'hex' or another value.
- Use HMAC SHA-256 algorithm. There are a number of SHA variants available with HMAC, make sure that your are using the 'SHA-256' variant.
Webhooks Changelog
May 2020
Before May 2020, Webhooks were powered by the now deprecated Event resource. Webhooks are now powered by the Action resource. To make the transition from Event to Action Webhooks easier, Webhook messages will contain all of the old Event fields until the end of 2020, alongside the new fields introduced in the Action resource.
Errors
Error response
A sample error response:
{
"message": "Limit must be an integer under 500",
"error": {
"message": "Limit must be an integer under 500",
"param": "limit",
"value": "10000",
"location": "query",
"status": 400
},
"errors": [
{
"message": "Limit must be an integer under 500",
"param": "limit",
"value": "10000",
"location": "query",
"status": 400
},
{
"message": "Invalid value",
"param": "next",
"value": "abcd",
"location": "query",
"status": 400
}
]
}
Field | Type | Description |
---|---|---|
message |
String | Human-readable message providing more details about the first error found. |
error |
Object | First error, see Error format. We suggest you use this parameter to detect errors. |
errors |
Array | Array of all Errors found, when there is more than one. |
Error format
Field | Type | Description |
---|---|---|
message |
String | Error message |
param |
String | If the error is parameter-specific, the parameter related to the error. |
value |
String | Value of the parameter that caused the error. |
location |
String | Location of the param that generated this error. It's either body, query, params, cookies or headers. |
status |
Number | See Error Codes |
Error codes
Error Code | Meaning |
---|---|
400 |
Bad Request -- Your request is invalid. |
401 |
Unauthorized -- Your API key is wrong. |
403 |
Forbidden -- The resource requested is hidden for administrators only. |
404 |
Not Found -- The specified resource could not be found. |
405 |
Method Not Allowed -- You tried to access a resource with an invalid method. |
406 |
Not Acceptable -- You requested a format that isn't json. |
410 |
Gone -- The resource requested has been removed from our servers. |
429 |
Too Many Requests -- You're requesting too many resources! Slow down! |
500 |
Internal Server Error -- We had a problem with our server. Try again later. |
503 |
Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |
Changelog
January 4, 2021
Added validation for the limit
parameter for requests that use the List API methods. The maximum limit
value for those requests is now 500.