B-Roll API
Send a subject. Get back real, verified photos and footage of exactly it, with the license and credit line on every shot. Use it from REST or from an agent over MCP.
Base URL: https://clypmint.com/api/v1/broll
OpenAPI file for Postman or a generated client. Python: pip install "git+https://github.com/nuttallp/clypmint-broll#subdirectory=python"
Auth
Make a key in the dashboard. It starts with cm_live_ and is shown once. Send it as a bearer token on every request.
Authorization: Bearer cm_live_YOUR_KEYKeep the key on your server or in your agent’s settings. Never put it in a web page.
Search
/api/v1/broll/searchFind shots for one subject. Add the line of script it plays over to sharpen the pick.
Body
| Field | Type | Notes |
|---|---|---|
query | string, required | The subject. Up to 200 characters. A person, company, product, app, place, event or a plain scene. |
context | string | The script line the shot plays over. Up to 1,000 characters. It tells us which one you mean and how it should look. |
type | image, video or any | Default any. |
orientation | landscape, portrait, square or any | Default any. A preference: fitting shots come first. |
limit | whole number, 1 to 10 | Default 5. |
min_score | number, 0 to 10 | Default 6. The lowest vision score we keep. |
Example
curl -X POST https://clypmint.com/api/v1/broll/search \
-H "Authorization: Bearer cm_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "SpaceX booster landing", "type": "video", "limit": 5}'Request body
{
"query": "SpaceX booster landing",
"context": "Then the first stage lands itself back on the pad.",
"type": "video",
"orientation": "landscape",
"limit": 3,
"min_score": 6
}Response
{
"request_id": "6f1c2b0e-3a52-4d0e-9d5c-1d7a2f9b8c41",
"query": "SpaceX booster landing",
"interpreted": {
"subject": "SpaceX Falcon 9 booster landing",
"kind": "event",
"entity": {
"id": "Q1234567",
"label": "Falcon 9 first-stage landing",
"description": "Vertical landing of a reusable rocket stage",
"url": "https://www.wikidata.org/wiki/Q1234567"
},
"look_for": "A Falcon 9 first stage touching down on a landing pad or ship"
},
"verified": true,
"results": [
{
"id": "commons:Falcon9_landing.webm",
"type": "video",
"title": "Falcon 9 landing",
"shows": "A Falcon 9 first stage descends on its legs and lands on a pad.",
"score": 9,
"url": "https://upload.wikimedia.org/wikipedia/commons/example/Falcon9_landing.webm",
"thumbnail_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/example/Falcon9_landing.jpg",
"width": 1920,
"height": 1080,
"orientation": "landscape",
"duration_seconds": 38,
"source": {
"name": "Wikimedia Commons",
"page_url": "https://commons.wikimedia.org/wiki/File:Falcon9_landing.webm"
},
"license": {
"name": "Public domain",
"url": "https://creativecommons.org/publicdomain/zero/1.0/",
"commercial_use": true,
"attribution": null
},
"official": false,
"delivery": "direct"
},
{
"id": "youtube:official:abc123",
"type": "video",
"title": "Booster landing, official webcast",
"shows": "The booster lands on a drone ship in the ocean.",
"score": 8,
"url": "https://www.youtube.com/watch?v=abc123",
"thumbnail_url": "https://i.ytimg.com/vi/abc123/hqdefault.jpg",
"width": 1920,
"height": 1080,
"orientation": "landscape",
"duration_seconds": 412,
"source": {
"name": "YouTube · SpaceX (official channel)",
"page_url": "https://www.youtube.com/watch?v=abc123"
},
"license": {
"name": "Official channel. Rights reserved by the owner",
"url": null,
"commercial_use": null,
"attribution": null
},
"official": true,
"delivery": "local_cut",
"cut_command": "npx -y github:nuttallp/clypmint-broll cut https://www.youtube.com/watch?v=abc123 --start 0 --duration 4"
}
],
"considered": 14,
"sources_used": ["Wikimedia Commons", "YouTube"],
"took_ms": 5120,
"cached": false,
"usage": {
"billed_searches": 0,
"free_searches_left_this_month": 99,
"price_per_search_usd": 0.02
}
}Top level: request_id, query, interpreted (what we took the subject to be, including its entity and what to look_for), verified, results, considered, sources_used, took_ms, cached and usage.
verified: false means the vision check could not run, so the results are ranked by source alone and have no score.
Each result
| Field | Meaning |
|---|---|
id | A stable id for the shot. |
type | image or video. |
title | The title from the source. |
shows | One plain line on what the shot shows, written by the vision check. |
score | From 0 to 10. How well the shot matches the subject. 7 or more is a strong match. |
url | The original file, or for local deliveries the page to cut from. |
download_url | What to fetch: an image at most 1920 px wide (logos as PNG), or the video file. Null for local deliveries. |
thumbnail_url | A small preview image. |
width, height, orientation | Size in pixels and landscape, portrait or square. Can be null. |
duration_seconds | Length of a video. Null for images. |
source | { name, page_url }. Where it came from. |
license | { name, url, commercial_use, attribution, notes }. notes says what the license does not cover, like a trademark or a real person. See Licensing. |
official | True when it comes from the subject’s own site or official channel. |
delivery | direct, local_cut or local_capture. |
cut_command | For local deliveries: the one command that makes the file on your machine. Safe to paste: the URL is quoted. |
cut_args | The same command as a list of arguments, for agents that run the CLI without a shell. |
An empty results list is a normal answer. It means no shot passed the check, and the search is not billed.
Plan
/api/v1/broll/planSend a whole script. We pick the moments that need a cutaway, name the words each one starts on, and find shots for each. Each moment that finds a shot counts as one search.
Body
| Field | Type | Notes |
|---|---|---|
transcript | string | The script or transcript. Up to 40,000 characters. Send this or words. |
words | array of { text, start, end } | Word timings in seconds. With them, every beat comes back with its time in at. |
max_beats | whole number, 1 to 20 | Default 8. The most cutaway moments to find. |
results_per_beat | whole number, 1 to 5 | Default 3. |
Request
{
"words": [
{ "text": "Notion", "start": 0.4, "end": 0.8 },
{ "text": "launched", "start": 0.8, "end": 1.2 },
{ "text": "in", "start": 1.2, "end": 1.3 },
{ "text": "San", "start": 1.3, "end": 1.6 },
{ "text": "Francisco", "start": 1.6, "end": 2.2 }
],
"max_beats": 8,
"results_per_beat": 3
}Response
{
"request_id": "0b7e4c1a-52de-4a8b-8a30-5f2b7c9d1e66",
"beats": [
{
"quote": "Notion launched in San Francisco",
"at": { "start": 0.4, "end": 2.2 },
"query": "Notion",
"why": "A named app. Show the real product.",
"interpreted": { "subject": "Notion", "kind": "app", "entity": null, "look_for": "The Notion app on screen" },
"results": [ /* shots, same fields as search */ ]
}
],
"took_ms": 9800,
"usage": {
"billed_searches": 0,
"searches": 1,
"free_searches_left_this_month": 98,
"price_per_search_usd": 0.02
}
}Each beat has the quote it starts on, at (start and end in seconds, when you sent word timings), the query we used and its results. If your free searches or your cap run out mid-plan, the remaining beats come back with no results and a withheld reason.
Usage
/api/v1/broll/usageThis month’s searches, what is free, what is billed and your cap.
{
"month": "2026-10",
"searches": 42,
"free_searches_included": 100,
"free_searches_left": 58,
"billed_searches": 0,
"billed_usd": 0,
"price_per_search_usd": 0.02,
"pay_as_you_go": false,
"monthly_cap_usd": null,
"billing_url": "https://clypmint.com/broll/dashboard"
}Errors
Errors come back as { "error": { "code", "message" } } with the HTTP status below.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | A field is missing or wrong. The message names it. |
| 401 | unauthorized | The key is missing, wrong or turned off. |
| 402 | free_allowance_used | The 100 free searches are used. Turn on pay as you go. |
| 402 | monthly_cap_reached | You reached your monthly cap. Raise it in the dashboard. |
| 402 | payment_needed | Billing needs attention. Update your card in the dashboard. |
| 409 | idempotency_key_reused | That Idempotency-Key was used for a different request. Send a new key. |
| 409 | request_in_progress | A request with that key is still running. Retry in a few seconds. |
| 429 | too_many_in_flight | Too many searches are running at once on this account. Wait for some to finish. |
| 503 | unavailable | A source or the checker is busy. Try again in a moment. |
{
"error": {
"code": "free_allowance_used",
"message": "You used your 100 free searches this month. Turn on pay as you go at https://clypmint.com/broll/dashboard."
}
}Pricing and limits
- 100 searches a month are free. No card.
- After that, $0.02 for each search that finds a shot.
- A search that finds nothing is never billed.
- A search whose shots could not be checked (verified: false) is never billed either.
- Pay as you go turns on with a card through Stripe. It is billed monthly for what you used. The default monthly cap is $50, and you can change it in the dashboard.
limitis 1 to 10 for search andresults_per_beatis 1 to 5 for plan. A plan finds 1 to 20 moments.
Idempotency
Add an Idempotency-Key header (8 to 64 letters, numbers, _, . or -) to make a retry safe. A repeat of the same key returns the first answer and is never billed twice. A key sent with a different request is refused.
Idempotency-Key: render-4821-beat-3MCP
Server: https://clypmint.com/mcp/broll (Streamable HTTP). It uses the same cm_live_ key as a bearer token. Three tools: find_broll, plan_broll and broll_usage.
claude mcp add --transport http clypmint-broll https://clypmint.com/mcp/broll --header "Authorization: Bearer cm_live_YOUR_KEY"For Codex, set CLYPMINT_API_KEY in your shell. The open-source client and agent skill are on GitHub.
Local CLI
Platform video and live websites are not served by us. A shot with delivery of local_cut or local_capture carries a cut_command. Run it and the file is made on your own machine.
Cut a clip
npx -y github:nuttallp/clypmint-broll#v1.0.0 cut <url> --start 0 --duration 4--start is the second to begin at. --duration is how many seconds to keep.
Record a real website
npx -y github:nuttallp/clypmint-broll#v1.0.0 capture <site> --duration 5This records the live site for the number of seconds you give.
Licensing
Every shot has a license object. Read it before you publish.
nameandurlsay which license applies.- When
attributionhas a line, use it as the credit in your video or its description. commercial_use: truemeans the license allows it.falsemeans it does not.commercial_use: nullmeans the rights belong to the owner. Ask them, or choose another shot.official: truemeans the shot comes from the subject’s own site or official channel.
This page is a guide, not legal advice.