Catch The Good Ones API
The Catch The Good Ones API is stream-centred. A stream is a campaign: a named operational unit that owns N(tracked_account, segment) pairs and a shared schedule + enrichment + delivery config. Three primary verbs frame the surface:
- Create streams with
POST /api/v2/streams(one-shot: handles + segments + everything) - Update streams with
PATCH /api/v2/streams/{id}(any setting, including full-replace pairs) - Extract leads with
GET /api/v2/streams/{id}/leads(per-stream) orGET /api/v2/leads(cross-stream polling)
Base URL
Quick start
- Generate an API key from your API Key page
- Verify the key:
- Create a campaign in one call:
- Pull leads from the campaign:
Endpoints by user goal
Set up a campaign
Manage campaigns
Monitor campaigns
Extract leads
Account management
Account + billing visibility
Webhooks
DM templates + notification settings
Lookups (Chrome extension surface)
One-shot enrichment + segment-from-description for the extension. Distinct from the campaign-centric surface above.Async operations
Some operations run asynchronously and return a run ID for polling:POST /api/v2/streams/{id}/runreturns{queued: [{accountId, syncRunId}], skipped: [{accountId, reason}]}. Poll each withGET /api/v2/streams/{id}/runs/{runId}.POST /api/v2/streams/{id}/re-testreturns the same shape. Poll the same way.
Billing effects
Several operations affect your Stripe subscription:POST /api/v2/streamswith new handles - upserts tracked accounts + increments Stripe quantity (response carriesbillingDeltaper account)PATCH /api/v2/streams/{id}with new handles inpairs- samePOST /api/v2/accounts/{id}/wake- increments Stripe quantityPOST /api/v2/accounts/{id}/sleep- decrements Stripe quantityPOST /api/v2/accounts/{id}/change-tier- upgrades apply immediately with proration; downgrades schedule for end-of-period
Rate limits
60 requests per minute per Bearer key. Response headers:
In-app session-cookie calls aren’t rate-limited at this layer.
Errors
Paywall and validation errors return a structured{ error: '<code>', message: '<copy>' } body. Branch on the code, not the message text. See the Migration guide for the full list.
Standard HTTP status codes apply: