curl --request POST \
--url https://api.tryfuse.ai/api/v1/business/agents/companies-watcher \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"listName": "<string>"
}
'import requests
url = "https://api.tryfuse.ai/api/v1/business/agents/companies-watcher"
payload = { "listName": "<string>" }
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({listName: '<string>'})
};
fetch('https://api.tryfuse.ai/api/v1/business/agents/companies-watcher', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"agent": {
"id": "6a8dce4e65fd738c00d89288",
"type": "companies-watcher",
"name": "Target accounts hiring",
"status": "initializing",
"started": false
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Create a companies watcher agent
Creates a Companies watcher (from a list) agent (companies-watcher). Watches the COMPANIES of an existing list (exactly one of listId/listIds) for the chosen eventType; job-posting watchers require at least one keywords entry and accept jobPostingLocationTypes (remote/on_site/hybrid). With start: false (the default) a DRAFT is saved — status initializing, nothing billed: read it back with GET /business/agents/, adjust it with PATCH /business/agents/, then start it with POST /business/agents//activate. With start: true the agent is created AND started in one call: its dedicated results list is created, credits are checked and spent, and the provider subscriptions are set up. Either way the answer is 201 { agent: { id, type, name, status, started } } — the same shape for every agent kind, draft or started. Poll GET /business/agents for status and contactsFound, and read the delivered rows with the Lists endpoints via the agent’s listId. Free-plan accounts hold at most 10 agents, drafts included (403 AGENT_LIMIT_REACHED). Every field below is validated by the agents service: a rejected field answers 422 VALIDATION_FAILED, naming it in param and describing every failure in message. listName must not collide with an existing list or agent name (409 LIST_NAME_TAKEN), and starting without enough credits answers 402 INSUFFICIENT_CREDITS without creating anything.
Errors:
422VALIDATION_FAILED— The request was rejected by validation. Either this endpoint’s own request validation (a malformed body), or the agent config itself: a field missing, out of range or not one of the accepted values, or a business rule broken (anexpirationDatethat is not in the future, more industries than the kind accepts, a notification count out of range).paramnames the first offending field andmessagelists every failure.409LIST_NAME_TAKEN—listNameis already used by one of your lists or agents. Pick another name.402INSUFFICIENT_CREDITS— The workspace does not have enough credits to start this agent. Nothing was created or spent.403AGENT_LIMIT_REACHED— Free-plan accounts may hold at most 10 agents, drafts included. Delete an agent or upgrade the plan.404LIST_NOT_FOUND— A source list named inlistId/listIdsdoes not exist or does not belong to the token owner.422AGENT_SOURCE_LIST_EMPTY— The source list holds nothing this agent kind can watch — no LinkedIn URLs, no companies, or no trackable contacts. Fill the list first.400INVALID_REQUEST— The agents service rejected the request for a reason this API does not model specifically. The request is not retryable unchanged.429RATE_LIMITED— The agents bucket is exhausted: 30 requests per minute or 2,000 per day per token owner, shared by every /business/agents operation (a 429 raised by the agents service is relayed with this code too). Retry after theRetry-Afterheader.500UNEXPECTED_ERROR— The agents service failed (5xx, refused service credential, or a timeout after 60s) or the rate limiter was unavailable. Retry later; quoterequest_idto support.
Requires one of the following token scopes: agents.
curl --request POST \
--url https://api.tryfuse.ai/api/v1/business/agents/companies-watcher \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"listName": "<string>"
}
'import requests
url = "https://api.tryfuse.ai/api/v1/business/agents/companies-watcher"
payload = { "listName": "<string>" }
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({listName: '<string>'})
};
fetch('https://api.tryfuse.ai/api/v1/business/agents/companies-watcher', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"agent": {
"id": "6a8dce4e65fd738c00d89288",
"type": "companies-watcher",
"name": "Target accounts hiring",
"status": "initializing",
"started": false
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Authorizations
Your API token (af_…) as the Basic-auth username, with an empty password.
Body
Name for BOTH the agent and the NEW dedicated results list this watcher creates. Must be unique — never reuse a source list's name; name it after the agent the user is creating.
1Which change to watch on the companies in the source list(s).
company-watch-linkedin-job-postings, company-watch-linkedin-posts, company-watch-press-mentions, company-watch-funding-milestones true creates AND activates the agent (spends credits); false (default) saves a draft to activate later.
The existing SOURCE list(s) to watch, by id — the people/companies whose changes are tracked.
1The existing SOURCE list(s) to watch, by id: the companies whose changes are tracked. Each id is a list id from GET /business/lists. Every list you name is watched, their members are unioned and duplicate ids are collapsed, and there is no cap on how many lists; listIds and listId are mutually exclusive (sending both is rejected). A source list holding no companies is rejected when the agent starts (422 AGENT_SOURCE_LIST_EMPTY).
11Date the agent stops running, as YYYY-MM-DD (for example "2026-12-31"), and in the future. Pass null to run until you pause or delete it; omit it for the default of one month from creation.
Free text, matched as a keyword against the job POSTING TITLE upstream, never against the description (for example ["account executive", "sdr"]). At least one is required when eventType is company-watch-linkedin-job-postings, and the value is ignored entirely by the other event types. Every value must be distinct and non-empty: a repeated keyword is refused with 422 ("keywords must not contain duplicates") and so is an empty string. Values are passed to the provider as written, so near-duplicates that differ only by surrounding spaces are accepted and both kept. No cap on how many you send.
1Work arrangement of the job posting. Use one of exactly: remote, on_site, hybrid. Multiple values are OR-joined (a posting with any listed arrangement matches); there are only three values, so listing all three is the same as omitting the field, which matches any arrangement. Read only when eventType is company-watch-linkedin-job-postings.
1remote, on_site, hybrid How often the watcher checks its source list(s), in days (1-90, default 1). This is also its billing cadence.
1 <= x <= 90Cap on the total number of results this agent delivers into its list. Omit for no cap.
Maximum credits this agent may spend in a single run or refresh (1000 to 200000); delivery-driven monitors stop once their total delivered results reach it. Omit for no limit.
1000 <= x <= 200000Response
Success
Show child attributes
Show child attributes