Developer API
The clipping-campaign radar, over REST
Every live pay-per-view clipping campaign ClipRadar tracks — rates, budgets, categories, viral scores — behind one scoped, metered JSON API, plus your own bookmarks, alerts, earnings and analyses, writes and webhooks. Build alert bots, dashboards, spreadsheets and agents on the same data the members-only radar runs on.
Your first request
Create a key on the Developer console (shown once, stored hashed), then:
curl "https://clipradar.co/api/v1/campaigns?target_platform=tiktok&sort=rate&limit=5" \ -H "Authorization: Bearer cr_live_YOUR_KEY"
Success envelope: { data, meta? } · errors: { error: { code, message, details? } } · the x-api-key header works as an alias. Reads are GET; writes use POST/PATCH/PUT/DELETE, validate strictly and accept an Idempotency-Key. All JSON, all CORS-open.
Pricing
Metered per request, funded from three pools and spent in this order — monthly quota first, prepaid credits after:
Membership allowance
included
- 500 requests/mo
- 30 req/min
- with an active Clipper membership
Dev tier
$9/mo
- 6,000 requests/mo
- 60 req/min
- Side projects and prototypes — a bot, a dashboard, a Discord feed.
Builder tier
$29/mo
- 30,000 requests/mo
- 120 req/min
- Production apps polling the radar on a schedule.
Scale tier
$99/mo
- 250,000 requests/mo
- 300 req/min
- High-volume integrations and multi-tenant tools.
Pay as you go
one-time
- $3.50 → 2,000 · $12 → 8,000 · $40 → 35,000
- 30 req/min on their own
- prepaid requests, never expire
Quotas reset on the 1st (UTC). Tiers stack with the membership allowance. Buy on Billing → API plans — crypto or card.
Endpoints
~85 operations across the campaign radar, your own data and webhooks. This table renders from the same endpoint registry the API enforces, so it can’t drift; every path also appears in GET /api/v1 (the free discovery index) and the OpenAPI spec. The scope column is the one scope each route needs — see Scopes below.
Discovery & account
GET /api/v1freeEndpoint catalog, scope list and cost table.GET /api/v1/pingfreeConnectivity and clock check.GET /api/v1/openapi.jsonfreeOpenAPI 3.1 description of this API.GET /api/v1/usagefreePlan, quota, credits and rate limit — never metered.GET /api/v1/me1 reqaccount:readThis key: owner, scopes, plan, quota and balances.Campaigns
GET /api/v1/campaigns1 reqcampaigns:readSearch, filter and sort the campaign feed.GET /api/v1/campaigns/bulk50 reqcampaigns:readFetch up to 100 campaigns by id in one call.GET /api/v1/campaigns/exportper rowcampaigns:readExport the filtered feed as CSV (up to 5,000 rows).GET /api/v1/campaigns/{id}3 reqcampaigns:readOne campaign by id.GET /api/v1/campaigns/{id}/similar2 reqcampaigns:readCampaigns most like this one, ranked.Market
GET /api/v1/platforms1 reqcampaigns:readSource platforms with counts and rate stats.GET /api/v1/categories1 reqcampaigns:readEnriched categories with counts and rate stats.GET /api/v1/tags1 reqcampaigns:readEnrichment tags with counts and rate stats.GET /api/v1/languages1 reqcampaigns:readContent languages with counts and rate stats.GET /api/v1/content-types1 reqcampaigns:readAccepted content types with counts and rate stats.GET /api/v1/target-platforms1 reqcampaigns:readWhere clips may be posted, with counts and rate stats.GET /api/v1/stats1 reqmarket:readMarket aggregates across the live radar.GET /api/v1/stats/timeseries2 reqmarket:readNew drops, rate trend and category mix over time.GET /api/v1/status1 reqmarket:readRadar freshness — last successful ingest per source.GET /api/v1/events1 reqmarket:readRecent campaign events — poll instead of using webhooks.GET /api/v1/estimate1 reqcampaigns:readProjected payout for a view count, budget-capped.Leaderboard & profiles
GET /api/v1/leaderboard2 reqleaderboard:readPublic earnings leaderboard by period and platform.GET /api/v1/leaderboard/rising2 reqleaderboard:readBiggest climbers versus the previous window.GET /api/v1/profiles/{username}1 reqleaderboard:readA creator's public profile and opted-in earnings.Bookmarks & presets
GET /api/v1/me/bookmarks1 reqbookmarks:readSaved campaigns, hydrated.POST /api/v1/me/bookmarks1 reqbookmarks:writeSave a campaign.DELETE /api/v1/me/bookmarks/{campaignId}1 reqbookmarks:writeUn-save a campaign.GET /api/v1/me/hidden1 reqbookmarks:readHidden campaign ids.POST /api/v1/me/hidden1 reqbookmarks:writeHide a campaign from the feed.DELETE /api/v1/me/hidden/{campaignId}1 reqbookmarks:writeUn-hide a campaign.GET /api/v1/me/presets1 reqpresets:readSaved filter presets.POST /api/v1/me/presets1 reqpresets:writeSave a filter preset (max 8).PATCH /api/v1/me/presets/{id}1 reqpresets:writeRename or re-point a preset.DELETE /api/v1/me/presets/{id}1 reqpresets:writeDelete a preset.Alerts
GET /api/v1/me/alerts/rules1 reqalerts:readAlert rules.POST /api/v1/me/alerts/rules1 reqalerts:writeCreate an alert rule (max 20).GET /api/v1/me/alerts/rules/{id}1 reqalerts:readOne alert rule.PATCH /api/v1/me/alerts/rules/{id}1 reqalerts:writeEdit an alert rule.DELETE /api/v1/me/alerts/rules/{id}1 reqalerts:writeDelete an alert rule.POST /api/v1/me/alerts/rules/{id}/test2 reqalerts:writeSend a test delivery for a rule.GET /api/v1/me/alerts/channels1 reqalerts:readDelivery channels.POST /api/v1/me/alerts/channels1 reqalerts:writeAdd a delivery channel (max 10).PATCH /api/v1/me/alerts/channels/{id}1 reqalerts:writeEdit a delivery channel.DELETE /api/v1/me/alerts/channels/{id}1 reqalerts:writeDelete a delivery channel.GET /api/v1/me/alerts/deliveries1 reqalerts:readRecent alert delivery history.POST /api/v1/me/alerts/preview2 reqalerts:readHow many live campaigns a rule's filters match.Profit
GET /api/v1/me/profit/entries1 reqprofit:readEarnings journal entries.POST /api/v1/me/profit/entries1 reqprofit:writeLog an earnings entry.PATCH /api/v1/me/profit/entries/{id}1 reqprofit:writeEdit an earnings entry.DELETE /api/v1/me/profit/entries/{id}1 reqprofit:writeDelete an earnings entry.GET /api/v1/me/profit/summary1 reqprofit:readMonthly totals, streak, best day and goal progress.GET /api/v1/me/profit/export2 reqprofit:readExport the earnings journal as CSV.GET /api/v1/me/profit/goals1 reqprofit:readMonthly earnings goals.PUT /api/v1/me/profit/goals1 reqprofit:writeSet or clear a month's goal.GET /api/v1/me/profit/videos1 reqprofit:readAuto-tracked videos and their campaign matches.PATCH /api/v1/me/profit/videos/{id}1 reqprofit:writeAssign, unassign or ignore a tracked video.POST /api/v1/me/profit/feedback1 reqprofit:writeRate a video-to-campaign match.GET /api/v1/me/profit/sync1 reqprofit:readAuto-tracking settings and recent sync runs.PATCH /api/v1/me/profit/sync1 reqprofit:writeSet auto-tracking on/off and how often it checks.Social & analysis
GET /api/v1/me/social-accounts1 reqsocial:readConnected social accounts.POST /api/v1/me/social-accounts1 reqsocial:writeStart bio-proof verification for a handle.POST /api/v1/me/social-accounts/{id}/verify5 reqsocial:writeCheck the bio for the proof code and verify.PATCH /api/v1/me/social-accounts/{id}1 reqsocial:writeSet primary or niches for an account.DELETE /api/v1/me/social-accounts/{id}1 reqsocial:writeDisconnect a social account.GET /api/v1/me/analyses1 reqanalysis:readStored per-account analyses.POST /api/v1/me/analyses25 reqanalysis:writeAnalyse a connected account.GET /api/v1/me/picks1 reqanalysis:readToday's per-account campaign picks.GET /api/v1/me/for-you2 reqanalysis:readPersonalized feed ranked for connected accounts.GET /api/v1/me/recommendations2 reqanalysis:readRank live campaigns against a niche profile.Profile & affiliate
GET /api/v1/me/profile1 reqprofile:readThe owner's public profile.PATCH /api/v1/me/profile1 reqprofile:writeChange username, avatar or earnings visibility.GET /api/v1/me/affiliate1 reqaffiliate:readReferral code, clicks, referrals and commissions.PATCH /api/v1/me/affiliate1 reqaffiliate:writeClaim a custom referral code.GET /api/v1/me/affiliate/payouts1 reqaffiliate:readPayout requests and available balance.POST /api/v1/me/affiliate/payouts1 reqaffiliate:writeRequest a payout of the available balance.Webhooks
GET /api/v1/me/webhooks1 reqwebhooks:readWebhook endpoints.POST /api/v1/me/webhooks1 reqwebhooks:writeRegister a webhook endpoint (max 10).GET /api/v1/me/webhooks/{id}1 reqwebhooks:readOne webhook endpoint, including its signing secret.PATCH /api/v1/me/webhooks/{id}1 reqwebhooks:writeEdit a webhook's url, events, filters or enabled state.DELETE /api/v1/me/webhooks/{id}1 reqwebhooks:writeDelete a webhook endpoint.POST /api/v1/me/webhooks/{id}/test2 reqwebhooks:writeSend a signed test event to a webhook.GET /api/v1/me/webhooks/{id}/deliveries1 reqwebhooks:readDelivery attempts for a webhook./campaigns query parameters
All optional; invalid values fall back to defaults rather than erroring. platform, category, target_platform, tag, language and content_type accept comma-separated multi-values (match any).
statuslive (default) · expired · allplatform / categorysource platform or enriched category — discover values via /platforms and /categoriestarget_platform / content_typewhere clips post (tiktok, youtube, …) / accepted content type (clipping, …)tag / languageenrichment tag match / ISO 639-1 language (or multi)min_rate / max_ratebounds on USD per 1,000 viewsmin_viral / min_scoreminimum viral score / minimum opportunity score (each 0–100)min_budget / min_budget_left_pctminimum total budget (USD) / minimum budget remaining (0–100)ending_within_honly campaigns ending within N hours from nowhas_budget / new_today1/true — only campaigns with a published budget / first seen in the last 24hsince / untilbounds on first_seen_at (ISO 8601) — poll new drops with sinceexcludecomma-separated terms excluded from name/summary/descriptionqcase-insensitive name searchfieldscomma-separated subset of the public columns (id always included; unknowns dropped)sortnewest (default) · oldest · rate · budget · viral · score · ends_soonlimit / offset1–100 (default 25) / 0–10,000 — meta.total drives paginationcursoropaque keyset cursor from meta.next_cursor — sort=newest|oldest only; wins over offsetScopes
A key carries scopes chosen at creation; each route needs one, and a call whose scope the key lacks returns 403 insufficient_scope before anything is metered. write never implies read. Keys issued before scopes existed keep only the public reads they already had (campaigns:read, market:read, account:read) — widening is an explicit re-scope, never automatic.
Public — safe to hand out
campaigns:readRead the campaign feed, detail, facets and exportsmarket:readRead market stats, trends and radar freshnessleaderboard:readRead the public earnings leaderboard and creator profilesaccount:readRead the key's own plan, quota and credit balance
Account — your own data (read)
bookmarks:readRead saved and hidden campaignspresets:readRead saved filter presetsalerts:readRead alert rules, channels and delivery historyprofit:readRead the earnings journal, goals and tracked videossocial:readRead connected social accountsanalysis:readRead account analyses and daily picksprofile:readRead the public profileaffiliate:readRead affiliate earnings, referrals and payoutswebhooks:readRead webhook endpoints and delivery history
Write — mutate your data
bookmarks:writeSave, hide and unhide campaignspresets:writeCreate, rename and delete filter presetsalerts:writeCreate, edit, delete and test alert rules and channelsprofit:writeWrite earnings entries, goals, video matches and trigger syncssocial:writeConnect, verify, update and disconnect social accountsanalysis:writeRun account analyses (spends usage credits)profile:writeUpdate the public profileaffiliate:writeChange the affiliate code and request payoutswebhooks:writeCreate, edit, delete and test webhook endpoints
Meters & errors
Costs are per-operation now (most reads 1, an analysis 25) — every metered response reports what it debited and where you stand:
X-Request-Cost # requests THIS call debited X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset # per minute, per key X-Quota-Limit / X-Quota-Remaining / X-Quota-Reset # calendar month, UTC X-Credits-Remaining # prepaid wallet
missing_key · invalid_keyno key, malformed, unknown or revokedno_active_plankey is fine but nothing funds itinsufficient_scopekey lacks the route's scope — a config fix, not retryablenot_a_membera members-only surface (leaderboard, profiles, alert preview)validation_faileda write's body — error.details names the field(s); also a bad cursorpayment_requireda paid write (alert-rule create, analysis) with no plan or creditsconflict · limit_reachedsemantic clash / at a per-account cap — waiting won't helpno_signalsanalysis run on an account with nothing to analyserate_limitedrequests/minute spent (or the sync cooldown) — honor Retry-Afterquota_exhaustedmonth quota AND prepaid credits both emptyinvalid_id · not_foundbad or unknown id (a foreign id reads as not_found)Only successful responses consume budget — our 5xx and your 401/403/429 (and validation 400s) are free. Writes validate strictly and support an Idempotency-Key; two operations (alert-rule create, analysis run) also spend the main app’s usage credits.
Webhooks
Push instead of poll. Register an https endpoint and subscribe it to campaign.created, campaign.budget_low, campaign.expired or campaign.enriched — ClipRadar POSTs the campaign payload, signed with an HMAC-SHA256 signature you verify on receipt. Up to 10 per account, with retries, auto-disable after repeated failures, and a delivery log for debugging.
curl -X POST "https://clipradar.co/api/v1/me/webhooks" \
-H "Authorization: Bearer cr_live_YOUR_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://hooks.example.com/clipradar","events":["campaign.created"]}'Full event catalog, the signature-verification recipe (Node & Python), the retry schedule, and the GET /api/v1/events polling alternative for receivers that can’t accept inbound HTTP live in the OpenAPI spec and the repo’s webhooks guide. Requires the webhooks:write scope.
Use it from Claude — no code
ClipRadar speaks MCP. Drop the server into Claude Desktop, Claude Code or Cursor and ask in plain language — “what TikTok campaigns are paying over $2 per 1K right now, and which still have budget?”
claude mcp add clipradar --env CLIPRADAR_API_KEY=cr_live_YOUR_KEY -- npx -y clipradar-mcp
For Claude Desktop or Cursor, put the same command in the client’s JSON config — full setup in the package README. Six read-only tools (list_campaigns, get_campaign, list_platforms, list_categories, get_market_stats, check_api_usage), your existing key, the same meter — and zero dependencies, so you can read the whole server before you hand it a key.
Every result ends with the budget you have left, and errors arrive as instructions rather than status codes — a 429 comes back as “wait 30 seconds” — so the model paces itself instead of burning your quota in a loop.
For everything else
Not on an MCP client — ChatGPT, your own agent stack, a script? Two files carry everything a model needs:
skill.md
A ready-to-attach skill file (YAML frontmatter + instructions): auth, every endpoint, budget etiquette, error reactions and task recipes. Paste it into a Claude Project / Skill, a custom GPT's instructions, or your agent's context.
openapi.json
OpenAPI 3.1 with per-operation descriptions and the metering contract — import it as a ChatGPT Action, a Claude tool definition, or codegen a typed client.
Give the agent its own key and tell it, at minimum:
Use the ClipRadar API per https://clipradar.co/skill.md API key: set in env as CLIPRADAR_API_KEY — send as "Authorization: Bearer <key>". Check GET /api/v1/usage (free) before batch work; stop on 429.
The free /usage endpoint exists precisely so agents can budget themselves — total_remaining is the number to watch. An llms.txt index is also served at the site root.
Point something at the radar
Keys take ten seconds, the first taste is included with any membership, and pay-as-you-go packs never expire.