---
title: "Start a draft agent (spends credits)"
method: POST
path: "/business/agents/{agentId}/activate"
tags: ["Agents"]
---

# Start a draft agent (spends credits)

`POST /business/agents/{agentId}/activate`

## Request

- Base URL: `https://api.tryfuse.ai/api/v1`
- URL: `https://api.tryfuse.ai/api/v1/business/agents/{agentId}/activate`
- Auth: HTTP basic

Starts a DRAFT agent and SPENDS CREDITS. It creates the agent's results list, checks and deducts the balance, sets up the provider subscriptions and kicks off the first run; the agent moves through `processing` to `active` (a scrape stays `processing` until the scrape finishes). Only drafts can be activated: there is no resume in this API, so a started, paused, expired or failed agent answers 409 AGENT_NOT_A_DRAFT — to restart a paused agent, duplicate it and activate the copy. Nothing is created or spent when the draft's `expirationDate` is not in the future (422 VALIDATION_FAILED), its name is already taken (409 LIST_NAME_TAKEN) or the balance is short (402 INSUFFICIENT_CREDITS). Any OTHER reason a config cannot be started (a source list with nothing to watch, a plan limit, a field the type's schema refuses) is not classified at activation time and answers 500 UNEXPECTED_ERROR: create the agent with `start: true` instead, which reports those properly. Answers 202 with the agent as GET returns it; keep polling GET /business/agents/{agentId} until `status` settles.

Errors:
- `404` `AGENT_NOT_FOUND` — No agent with this id belongs to the token owner. A deleted agent and another user's agent answer identically.
- `409` `AGENT_NOT_A_DRAFT` — The agent is not a draft (status is not `initializing`): it was already started, or is paused, expired or failed. Only drafts are editable and activatable — duplicate the agent and work on the copy.
- `409` `LIST_NAME_TAKEN` — `listName` is already used by one of your lists or agents. Pick another name.
- `402` `INSUFFICIENT_CREDITS` — The workspace does not have enough credits to start this agent. Nothing was created or spent.
- `409` `AGENT_CONFIG_MISSING` — The draft carries no stored config to work from (a legacy draft saved before configs were persisted). Create the agent again.
- `409` `AGENT_TYPE_UNSUPPORTED` — The agent is of a legacy kind this API can no longer edit or activate; its `type` reads as null.
- `422` `VALIDATION_FAILED` — The activation was rejected by validation: the draft's `expirationDate` is not in the future (fix it with PATCH, or duplicate the agent and set a new date), or the request itself failed this endpoint's validation (`agentId` must be a 24-character hex id). No other config problem is reported here: see the 500 entry.
- `422` `AGENT_SIGNAL_REJECTED` — web-monitor only: the search provider refused the `prompt` as a searchable signal. Rewrite the prompt rather than retrying it.
- `429` `RATE_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 the `Retry-After` header.
- `500` `UNEXPECTED_ERROR` — The agents service failed (5xx, refused service credential, or a timeout after 60s) or the rate limiter was unavailable. A config the activation cannot accept for any reason other than the expiry rule (a source list with nothing to watch, a plan limit, a field the type's schema refuses) also lands here, because the agents service does not classify those at activation time. Retry later; quote `request_id` to support.

Requires one of the following token scopes: agents.

## Path parameters

- `agentId` string, required: The agent's id: a 24-character hex string — the `id` of an item from GET /business/agents, or the `agent.id` a create or duplicate returned.

## Response `202`

Success

- object
  - `agent` object, required
    - `id` string, required: The agent's id — pass it as `{agentId}` to every other agent operation.
    - `type` 'web-monitor' | 'person-starting-new-job' | 'linkedin-posts' | 'person-discovery-via-filters' | 'job-postings' | 'job-posting-in-location' | 'first-person-hired-in-company-department' | 'first-person-hired-internationally' | 'company-headcount-growth' | 'company-headcount-growth-over-baseline' | 'company-department-headcount' | 'company-employee-job-location-in-two-countries' | 'funding-announcements' | 'people-watcher' | 'companies-watcher' | 'job-changes-watcher' | 'linkedin-profile' | 'linkedin-post' | 'null', nullable, required: The public agent kind — the same slug you POST to at /business/agents/{type}. null for a legacy kind this API no longer offers.
    - `name` string, required: The agent's name, which is also the name of the results list it delivers into.
    - `status` 'initializing' | 'processing' | 'active' | 'paused' | 'expired' | 'failed' | 'completed' | 'deleted', required: initializing = saved draft, nothing billed; processing = a run is under way; active = running; paused = stopped by you; expired = past its expirationDate; failed = the provider setup failed. Older agents can also read `completed` (a one-off scrape that has finished) and `deleted` (an agent deleted before deletions were timestamped: still readable, but it can no longer be edited or activated).
    - `config` object, required: The agent's config in CREATE shape: exactly the body you would POST to /business/agents/{type} (without `start`) to build this agent again. Its fields are the ones documented on that type's create operation.
    - `isReconstructed` boolean, required: false = the config is the stored snapshot, returned verbatim (always the case for a draft). true = the agent was started before its snapshot existed and the config was rebuilt from the live record, so check `lossyFields`.
    - `lossyFields` string[], required: Config fields that could not be recovered when `isReconstructed` is true; `["*"]` means only `name` is known. Empty otherwise.
    - `sourceLists` object[], required: Watcher kinds only: the source lists the config names, resolved to their names. Empty for every other kind.
      - `id` string, required: The source list's id.
      - `name` string, nullable, required: The source list's name, or null when the list has been deleted.

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `403`: Error
- `404`: Error
- `409`: Error
- `422`: Error
- `429`: Error
- `500`: Error

---

[API](https://skmtc.dev/fuseai/apis/fuse-business-api.md) · [All operations](https://skmtc.dev/fuseai/apis/fuse-business-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fuseai/apis/fuse-business-api/revisions/50d95e0536f4?raw)
