Add sources to a monitor
curl --request POST \
--url https://api.airscale.io/v1/post-engagement-monitors/{monitor_id}/sources \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sources": [
"https://www.linkedin.com/in/example-person-2"
]
}
'const url = 'https://api.airscale.io/v1/post-engagement-monitors/{monitor_id}/sources';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({sources: ['https://www.linkedin.com/in/example-person-2']})
};
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/post-engagement-monitors/{monitor_id}/sources"
payload = { "sources": ["https://www.linkedin.com/in/example-person-2"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"sources": [
{
"id": "72222222-2222-4222-8222-222222222222",
"linkedin_url": "https://www.linkedin.com/company/example-company",
"kind": "company",
"status": "monitoring",
"last_checked_at": "2026-11-02T09:00:00.000Z",
"last_error": null
},
{
"id": "72222223-2222-4222-8222-222222222223",
"linkedin_url": "https://www.linkedin.com/in/example-person",
"kind": "profile",
"status": "monitoring",
"last_checked_at": "2026-11-02T09:00:00.000Z",
"last_error": null
},
{
"id": "72222224-2222-4222-8222-222222222224",
"linkedin_url": "https://www.linkedin.com/in/example-person-2",
"kind": "profile",
"status": "pending",
"last_checked_at": null,
"last_error": null
}
],
"added_source_count": 1,
"source_count": 3
}{
"error": "Invalid JSON"
}{
"error": {
"code": "invalid_api_key",
"message": "The API key is not valid"
}
}{
"error": {
"code": "monitor_not_found",
"message": "Monitor not found"
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": "Too Many Requests",
"message": "Rate limit exceeded: 120 requests per minute"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Add sources to a post engagement monitor
Follow more LinkedIn company pages or profiles, up to 100 per monitor. Rate limit: 120 requests per fixed minute per API key, shared by all post engagement monitor endpoints.
POST
/
v1
/
post-engagement-monitors
/
{monitor_id}
/
sources
Add sources to a monitor
curl --request POST \
--url https://api.airscale.io/v1/post-engagement-monitors/{monitor_id}/sources \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sources": [
"https://www.linkedin.com/in/example-person-2"
]
}
'const url = 'https://api.airscale.io/v1/post-engagement-monitors/{monitor_id}/sources';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({sources: ['https://www.linkedin.com/in/example-person-2']})
};
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/post-engagement-monitors/{monitor_id}/sources"
payload = { "sources": ["https://www.linkedin.com/in/example-person-2"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"sources": [
{
"id": "72222222-2222-4222-8222-222222222222",
"linkedin_url": "https://www.linkedin.com/company/example-company",
"kind": "company",
"status": "monitoring",
"last_checked_at": "2026-11-02T09:00:00.000Z",
"last_error": null
},
{
"id": "72222223-2222-4222-8222-222222222223",
"linkedin_url": "https://www.linkedin.com/in/example-person",
"kind": "profile",
"status": "monitoring",
"last_checked_at": "2026-11-02T09:00:00.000Z",
"last_error": null
},
{
"id": "72222224-2222-4222-8222-222222222224",
"linkedin_url": "https://www.linkedin.com/in/example-person-2",
"kind": "profile",
"status": "pending",
"last_checked_at": null,
"last_error": null
}
],
"added_source_count": 1,
"source_count": 3
}{
"error": "Invalid JSON"
}{
"error": {
"code": "invalid_api_key",
"message": "The API key is not valid"
}
}{
"error": {
"code": "monitor_not_found",
"message": "Monitor not found"
}
}{
"error": "<string>",
"message": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": "Too Many Requests",
"message": "Rate limit exceeded: 120 requests per minute"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Post engagement 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.
{"sources": ["https://www.linkedin.com/in/example-person-2"]}. Each URL must be a LinkedIn company (/company/...) or profile (/in/...) URL; single post URLs are rejected with 422 invalid_sources.
The 201 response returns sources (all active sources), added_source_count (URLs already followed are ignored), and source_count. A monitor follows at most 100 sources; exceeding it returns 422 source_limit_reached.
Adding sources restarts coverage for the monitor. Delivered engagers and the results table are kept, and people already delivered are never charged again.
Next step
Use Get a post engagement monitor to follow the first check of each new source.Authorizations
Use an Airscale workspace API key. Never expose the key in client-side code.
Path Parameters
Body
application/json
Provide 1–100 LinkedIn company or profile URLs in a JSON body of at most 256 KiB (262,144 bytes).
1–100 LinkedIn company (/company/...) or personal profile (/in/...) URLs. URLs are canonicalized and de-duplicated. Single post URLs are rejected.
Required array length:
1 - 100 elementsRequired string length:
1 - 1000