List new hire events
curl --request GET \
--url https://api.airscale.io/v1/new-hire-monitors/{monitor_id}/events \
--header 'Authorization: Bearer <token>'const url = 'https://api.airscale.io/v1/new-hire-monitors/{monitor_id}/events';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.airscale.io/v1/new-hire-monitors/{monitor_id}/events"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"events": [
{
"id": "63333333-3333-4333-8333-333333333333",
"monitor_id": "61111111-1111-4111-8111-111111111111",
"detected_at": "2026-11-09T10:05:00.000Z",
"hire_type": "external",
"person": {
"name": "Example Person",
"linkedin_url": "https://www.linkedin.com/in/example-person",
"location": "Paris, France"
},
"title": "VP Sales",
"start_date": "2026-10",
"company": {
"name": "Example Company",
"linkedin_company_id": null,
"linkedin_url": null
},
"previous_title": "Director of Sales",
"previous_company_name": "Example Previous Company",
"read_at": null,
"webhook": {
"status": "sent",
"attempt_count": 1,
"last_attempt_at": "2026-11-09T10:06:00.000Z",
"sent_at": "2026-11-09T10:06:01.000Z",
"error_code": null
}
}
],
"next_cursor": null
}{
"error": {
"code": "invalid_api_key",
"message": "The API key is not valid"
}
}{
"error": {
"code": "monitor_not_found",
"message": "Monitor not found"
}
}{
"error": {
"code": "invalid_event_page",
"message": "Number must be less than or equal to 100"
}
}{
"error": "Too Many Requests",
"message": "Rate limit exceeded: 120 requests per minute"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}List new hire events
Read cursor-paginated new hires, filtered by hire type and date, with their webhook delivery receipts. Rate limit: 120 requests per fixed minute per API key, shared by all new hire monitor endpoints.
GET
/
v1
/
new-hire-monitors
/
{monitor_id}
/
events
List new hire events
curl --request GET \
--url https://api.airscale.io/v1/new-hire-monitors/{monitor_id}/events \
--header 'Authorization: Bearer <token>'const url = 'https://api.airscale.io/v1/new-hire-monitors/{monitor_id}/events';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.airscale.io/v1/new-hire-monitors/{monitor_id}/events"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"events": [
{
"id": "63333333-3333-4333-8333-333333333333",
"monitor_id": "61111111-1111-4111-8111-111111111111",
"detected_at": "2026-11-09T10:05:00.000Z",
"hire_type": "external",
"person": {
"name": "Example Person",
"linkedin_url": "https://www.linkedin.com/in/example-person",
"location": "Paris, France"
},
"title": "VP Sales",
"start_date": "2026-10",
"company": {
"name": "Example Company",
"linkedin_company_id": null,
"linkedin_url": null
},
"previous_title": "Director of Sales",
"previous_company_name": "Example Previous Company",
"read_at": null,
"webhook": {
"status": "sent",
"attempt_count": 1,
"last_attempt_at": "2026-11-09T10:06:00.000Z",
"sent_at": "2026-11-09T10:06:01.000Z",
"error_code": null
}
}
],
"next_cursor": null
}{
"error": {
"code": "invalid_api_key",
"message": "The API key is not valid"
}
}{
"error": {
"code": "monitor_not_found",
"message": "Monitor not found"
}
}{
"error": {
"code": "invalid_event_page",
"message": "Number must be less than or equal to 100"
}
}{
"error": "Too Many Requests",
"message": "Rate limit exceeded: 120 requests per minute"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}New hire monitoring requires a V2 workspace API key. Legacy V1 API keys are not supported by these endpoints. Monitors and their credits belong to the V2 workspace associated with the key.
limit from 1 to 100 (default 50), filter with type (all, external, internal), and from and to (YYYY-MM-DD, UTC, inclusive). When next_cursor is not null, send it unchanged as cursor with the same filters; a cursor used with different filters returns 422 invalid_event_cursor. Unknown query parameters return 422 invalid_event_page.
Each event has hire_type, person (name, linkedin_url, location), title, start_date (the reported start month YYYY-MM, or null), company (name, linkedin_company_id, linkedin_url), previous_title, previous_company_name, detected_at, and read_at. Unknown fields are null. This endpoint is also the durable fallback when webhook delivery is delayed or unavailable.
Webhook delivery receipts
Each event carries awebhook object, or null when no delivery exists. status is pending, sending, retryable, sent, failed, uncertain, or cancelled, with attempt_count, last_attempt_at, sent_at, and error_code (for example webhook_http_410 or webhook_configuration_changed). uncertain means a timeout or dropped connection: the request may have been received. Use Redeliver a webhook to send an event again.
Next step
Use Mark an event as read after your application has processed an event.Authorizations
Use an Airscale workspace API key. Never expose the key in client-side code.
Path Parameters
Query Parameters
Number of events to return, from 1 to 100. Defaults to 50.
Required range:
1 <= x <= 100Only external hires, only internal moves, or both.
Available options:
all, external, internal First detection date to include, YYYY-MM-DD in UTC (inclusive).
Last detection date to include, YYYY-MM-DD in UTC (inclusive). Must not precede from.
Opaque cursor from the preceding response. It is only valid with the same type, from and to.
Required string length:
1 - 1024