---
title: "Fill a campaign with prospects from the contact database"
method: POST
path: "/prospects/source"
tags: ["Prospecting"]
---

# Fill a campaign with prospects from the contact database

`POST /prospects/source`

## Request

- Base URL: `https://api.emailchaser.com/r`
- URL: `https://api.emailchaser.com/r/prospects/source`
- Auth: HTTP bearer

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.

## Request body

- ModelsSourceProspectsRequest
  - `campaignId` integer, required: CampaignID is the campaign the sourced prospects are added to.
  - `count` integer: Count is how many prospects to add in this request. Defaults to 50, capped at 500. A stored prospect costs the reveal price in credits (1 at the time of writing); the response states the price it charged and the total the batch is expected to cost, so nothing has to trust this comment to stay current.
  - `icpId` integer: IcpID names the Ideal Customer Profile whose targeting criteria drive the search. Omitted, the workspace's primary profile is used.

## Response `202`

Sourcing job queued

- ModelsSourceProspectsResponse
  - `campaignId` integer
  - `creditsPerProspect` integer: CreditsPerProspect is what one stored prospect debits, read from the pricing table at request time. It is reported because the price has changed twice (1 to 5 in August 2026, back to 1 in September 2026 when the contact data moved to a flat monthly plan) and every caller that budgets from a hardcoded number budgets wrong the day it changes again.
  - `estimatedCredits` integer: EstimatedCredits is Requested x CreditsPerProspect: the ceiling this batch can cost. The run settles against prospects actually stored, so the real debit is this or less.
  - `icpId` integer: IcpID is the profile that was used, echoed back so callers relying on the primary-profile default can see which one it resolved to.
  - `prospectSearchId` integer: ProspectSearchID identifies the search being advanced. Repeated requests for the same campaign and profile return the same id: the search resumes from its provider cursor instead of re-revealing the same people.
  - `requested` integer
  - `status` string

## Other responses

- `400`: Invalid request body, invalid count, no usable profile, or the profile has no targeting criteria
- `401`: Unauthorized - invalid or missing API key
- `402`: The workspace has no prospect credits
- `404`: Campaign or profile not found
- `500`: Failed to queue prospect sourcing

---

[API](https://skmtc.dev/emailchaser/apis/emailchaser-api.md) · [All operations](https://skmtc.dev/emailchaser/apis/emailchaser-api/llms.txt) · [OpenAPI document](https://skmtc.dev/emailchaser/apis/emailchaser-api/revisions/8b114990abb7?raw)
