Get a monitor with profiles and recent events
curl --request GET \
--url https://api.airscale.io/v1/job-change-monitors/{monitor_id} \
--header 'Authorization: Bearer <token>'const url = 'https://api.airscale.io/v1/job-change-monitors/{monitor_id}';
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/job-change-monitors/{monitor_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"monitor": {
"id": "11111111-1111-4111-8111-111111111111",
"name": "CRM champions",
"frequency": "every_30_days",
"status": "active",
"results_table_id": "44444444-4444-4444-8444-444444444444",
"results_status": "ready",
"results_error": null,
"next_check_at": "2026-11-02T10:00:00.000Z",
"last_successful_check_at": null,
"created_at": "2026-11-02T10:00:00.000Z",
"updated_at": "2026-11-02T10:00:00.000Z",
"webhook_url": "https://hooks.example.com/airscale/job-changes",
"webhook_configured": true,
"run_block_reason": null,
"run_block_detail": null,
"active_profile_count": 1,
"unread_event_count": 0
},
"profiles": [
{
"id": "22222222-2222-4222-8222-222222222222",
"linkedin_url": "https://www.linkedin.com/in/example-person",
"external_id": "crm-contact-123",
"status": "pending",
"removed_at": null
}
],
"events": [
{
"id": "33333333-3333-4333-8333-333333333333",
"monitor_id": "11111111-1111-4111-8111-111111111111",
"profile_id": "22222222-2222-4222-8222-222222222222",
"linkedin_url": "https://www.linkedin.com/in/example-person",
"external_id": "crm-contact-123",
"previous_employer": {
"identity": "example-old-company",
"name": "Example Old Company"
},
"new_employer": {
"identity": "example-new-company",
"name": "Example New Company"
},
"detected_at": "2026-12-02T10:00:00.000Z",
"read_at": null
}
]
}{
"error": "<string>",
"message": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Get a job-change monitor
Retrieve one monitor, its profiles, and its latest events. Rate limit: 120 requests per fixed minute per API key, shared by all job-change monitor endpoints.
GET
/
v1
/
job-change-monitors
/
{monitor_id}
Get a monitor with profiles and recent events
curl --request GET \
--url https://api.airscale.io/v1/job-change-monitors/{monitor_id} \
--header 'Authorization: Bearer <token>'const url = 'https://api.airscale.io/v1/job-change-monitors/{monitor_id}';
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/job-change-monitors/{monitor_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"monitor": {
"id": "11111111-1111-4111-8111-111111111111",
"name": "CRM champions",
"frequency": "every_30_days",
"status": "active",
"results_table_id": "44444444-4444-4444-8444-444444444444",
"results_status": "ready",
"results_error": null,
"next_check_at": "2026-11-02T10:00:00.000Z",
"last_successful_check_at": null,
"created_at": "2026-11-02T10:00:00.000Z",
"updated_at": "2026-11-02T10:00:00.000Z",
"webhook_url": "https://hooks.example.com/airscale/job-changes",
"webhook_configured": true,
"run_block_reason": null,
"run_block_detail": null,
"active_profile_count": 1,
"unread_event_count": 0
},
"profiles": [
{
"id": "22222222-2222-4222-8222-222222222222",
"linkedin_url": "https://www.linkedin.com/in/example-person",
"external_id": "crm-contact-123",
"status": "pending",
"removed_at": null
}
],
"events": [
{
"id": "33333333-3333-4333-8333-333333333333",
"monitor_id": "11111111-1111-4111-8111-111111111111",
"profile_id": "22222222-2222-4222-8222-222222222222",
"linkedin_url": "https://www.linkedin.com/in/example-person",
"external_id": "crm-contact-123",
"previous_employer": {
"identity": "example-old-company",
"name": "Example Old Company"
},
"new_employer": {
"identity": "example-new-company",
"name": "Example New Company"
},
"detected_at": "2026-12-02T10:00:00.000Z",
"read_at": null
}
]
}{
"error": "<string>",
"message": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Job-change monitoring requires a V2 workspace API key. V1 (Bubble) API keys are not supported by these endpoints. Monitors and monitoring credits belong to the V2 workspace associated with the key.
monitor_id. The response contains all profiles, including soft-removed profiles, and up to the latest 200 events ordered newest first.
Use the profile
status and removed_at fields to distinguish an active profile from one removed from future checks. Profile status is pending, baseline, checked, unavailable, failed, or removed. Historical events remain available after a profile is removed.next_check_at and last_successful_check_at as ISO 8601 timestamps. A paused monitor has no next check scheduled. When a check could not start or stopped early, run_block_reason (for example insufficient_credits) and run_block_detail explain why; they clear when a later check starts. results_table_id, results_status and results_error describe the results table that receives one row per new event.
A monitor can contain up to 10,000 active profiles under the same schedule and webhook. Checks run asynchronously and large checks can take time. Internally, profiles are processed in batches with durable progress, so a retried check keeps its billing identity and does not charge a profile twice. Profiles added after a check starts join the next check. A profile’s first successful check establishes its baseline without emitting a job-change event.
Next step
Use List job-change events when you need cursor pagination beyond the latest 200 events or webhook delivery receipts.Authorizations
Use an Airscale workspace API key. Never expose the key in client-side code.