> For the complete documentation index, see [llms.txt](https://run.emailchaser.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://run.emailchaser.com/api-reference/prospecting.md).

# Prospecting

## Fill a campaign with prospects from the contact database

> Queues a background job that searches Emailchaser's internal contact database with the targeting criteria of an Ideal Customer Profile, reveals matching people and adds them to the campaign as leads. The profile defaults to the workspace's primary ICP when icpId is omitted. Sourcing is asynchronous: poll GET /leads?campaignId= to watch the prospects arrive. Each stored prospect costs the reveal price in credits (1 at the time of writing), reported per request as creditsPerProspect with the batch ceiling as estimatedCredits; duplicates, blocklisted domains and contacts without an email address are filtered out before any credit is spent. Repeated calls for the same campaign and profile resume the same search at its provider cursor, so they page deeper into the audience instead of re-revealing (and re-paying for) the same people.

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"servers":[{"url":"https://api.emailchaser.com/r"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","name":"Authorization","in":"header"}},"schemas":{"models.SourceProspectsResponse":{"type":"object","properties":{"campaignId":{"type":"integer"},"creditsPerProspect":{"description":"CreditsPerProspect is what one stored prospect debits, read from the\npricing table at request time. It is reported because the price has\nchanged twice (1 to 5 in August 2026, back to 1 in September 2026 when\nthe contact data moved to a flat monthly plan) and every caller that\nbudgets from a hardcoded number budgets wrong the day it changes again.","type":"integer"},"estimatedCredits":{"description":"EstimatedCredits is Requested x CreditsPerProspect: the ceiling this\nbatch can cost. The run settles against prospects actually stored, so\nthe real debit is this or less.","type":"integer"},"icpId":{"description":"IcpID is the profile that was used, echoed back so callers relying on\nthe primary-profile default can see which one it resolved to.","type":"integer"},"prospectSearchId":{"description":"ProspectSearchID identifies the search being advanced. Repeated requests\nfor the same campaign and profile return the same id: the search resumes\nfrom its provider cursor instead of re-revealing the same people.","type":"integer"},"requested":{"type":"integer"},"status":{"type":"string"}}},"models.ErrorResponse":{"type":"object","properties":{"error":{"type":"string"}}},"models.ErrorUnauthorized":{"type":"object","properties":{"error":{"type":"string"}}},"models.SourceProspectsRequest":{"type":"object","required":["campaignId"],"properties":{"campaignId":{"description":"CampaignID is the campaign the sourced prospects are added to.","type":"integer"},"count":{"description":"Count is how many prospects to add in this request. Defaults to 50,\ncapped at 500. A stored prospect costs the reveal price in credits (1\nat the time of writing); the response states the price it charged and\nthe total the batch is expected to cost, so nothing has to trust this\ncomment to stay current.","type":"integer"},"icpId":{"description":"IcpID names the Ideal Customer Profile whose targeting criteria drive\nthe search. Omitted, the workspace's primary profile is used.","type":"integer"}}}}},"paths":{"/prospects/source":{"post":{"description":"Queues a background job that searches Emailchaser's internal contact database with the targeting criteria of an Ideal Customer Profile, reveals matching people and adds them to the campaign as leads. The profile defaults to the workspace's primary ICP when icpId is omitted. Sourcing is asynchronous: poll GET /leads?campaignId= to watch the prospects arrive. Each stored prospect costs the reveal price in credits (1 at the time of writing), reported per request as creditsPerProspect with the batch ceiling as estimatedCredits; duplicates, blocklisted domains and contacts without an email address are filtered out before any credit is spent. Repeated calls for the same campaign and profile resume the same search at its provider cursor, so they page deeper into the audience instead of re-revealing (and re-paying for) the same people.","tags":["Prospecting"],"summary":"Fill a campaign with prospects from the contact database","responses":{"202":{"description":"Sourcing job queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.SourceProspectsResponse"}}}},"400":{"description":"Invalid request body, invalid count, no usable profile, or the profile has no targeting criteria","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}}},"401":{"description":"Unauthorized - invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorUnauthorized"}}}},"402":{"description":"The workspace has no prospect credits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}}},"404":{"description":"Campaign or profile not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}}},"500":{"description":"Failed to queue prospect sourcing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.SourceProspectsRequest"}}},"description":"Campaign, optional profile and count","required":true}}}}}
```
