Skip to main content

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) or GET /api/v2/leads (cross-stream polling)
Use it to pipe your leads into Zapier, Make, n8n, HeyReach, Apollo, Clay, or your own applications.

Base URL

API v1 paths return 410 Gone. See the Migration guide for old-to-new mappings.

Quick start

  1. Generate an API key from your API Key page
  2. Verify the key:
  1. Create a campaign in one call:
  1. 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}/run returns {queued: [{accountId, syncRunId}], skipped: [{accountId, reason}]}. Poll each with GET /api/v2/streams/{id}/runs/{runId}.
  • POST /api/v2/streams/{id}/re-test returns the same shape. Poll the same way.

Billing effects

Several operations affect your Stripe subscription:
  • POST /api/v2/streams with new handles - upserts tracked accounts + increments Stripe quantity (response carries billingDelta per account)
  • PATCH /api/v2/streams/{id} with new handles in pairs - same
  • POST /api/v2/accounts/{id}/wake - increments Stripe quantity
  • POST /api/v2/accounts/{id}/sleep - decrements Stripe quantity
  • POST /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: