IntentCast API
Use IntentCast from your own code, scripts, n8n, Make or Zapier. Send a YouTube video, a page URL or a topic; IntentCast finds live Reddit and Quora threads where that content is the answer and drafts a reply for each one.
| Base URL | https://smoeblkrgvbrirkagvhu.supabase.co/functions/v1/api |
| Format | JSON in, JSON out |
| Version | v1 |
| Spec | openapi.json |
Quick start
1. Create a key in the app: Account & billing → API keys → Create API key. Copy it — it is shown only once.
2. Start a cast:
curl -X POST https://smoeblkrgvbrirkagvhu.supabase.co/functions/v1/api/v1/casts \
-H "Authorization: Bearer ic_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: my-first-cast-001" \
-d '{"input": "https://www.youtube.com/watch?v=VIDEO_ID"}'You get an answer straight away (202 Accepted) with the cast id and status: "running". The search itself takes about 15–60 seconds.
3. Check the result every ~10 seconds until status is no longer running:
curl https://smoeblkrgvbrirkagvhu.supabase.co/functions/v1/api/v1/casts/CAST_ID \
-H "Authorization: Bearer ic_live_YOUR_KEY"When status is completed, threads holds every thread worth replying to, with a drafted reply.
Authentication
Send your key on every request, either way:
Authorization: Bearer ic_live_YOUR_KEYX-API-Key: ic_live_YOUR_KEYKeys are secret. Keep them on your server or in your automation tool's credentials. The API refuses calls made from web browsers, so a key placed in a web page will not work and would be exposed to anyone.
Permissions
| Permission | Can do |
|---|---|
| Run + read | Start casts (uses credits) and read results |
| Read only | Read casts and your account usage — never spends credits |
You can give a key an expiry date and revoke any key instantly from Account & billing. Up to 10 active keys per account.
Start a cast — POST /v1/casts
Permission: Run + read. Uses 1 credit.
| Field | Type | Required | Description |
|---|---|---|---|
input | string | yes | A YouTube URL, a page URL (e.g. https://example.com/pricing or example.com), or a topic (max 200 characters). |
| Header | Required | Description |
|---|---|---|
Idempotency-Key | recommended | Any unique string up to 200 characters. Send the same key again (for example when your tool retries after a timeout) and you get the original cast back — you are never charged twice. |
Response 202 Accepted, with a Location header pointing to the cast:
{
"id": "676cc8aa-7822-4ae0-933e-a6d61561b9b0",
"input": "swiftsku.com",
"input_type": "website",
"status": "running",
"source": "api",
"thread_count": 0,
"credit_charged": true,
"error": null,
"duration_ms": null,
"created_at": "2026-10-03T12:05:35.195882+00:00",
"completed_at": null,
"url": "https://smoeblkrgvbrirkagvhu.supabase.co/functions/v1/api/v1/casts/676cc8aa-7822-4ae0-933e-a6d61561b9b0",
"credits_left": 30,
"replayed": false,
"poll_after_seconds": 10
}Repeating a request with the same Idempotency-Key returns 200 OK with "replayed": true and the cast's current state.
Get a cast — GET /v1/casts/{id}
Permission: Read only or higher.
{
"id": "676cc8aa-7822-4ae0-933e-a6d61561b9b0",
"input": "swiftsku.com",
"input_type": "website",
"status": "completed",
"source": "api",
"thread_count": 3,
"credit_charged": true,
"error": null,
"duration_ms": 15795,
"created_at": "2026-10-03T12:05:35.195882+00:00",
"completed_at": "2026-10-03T12:05:51.090299+00:00",
"url": "https://smoeblkrgvbrirkagvhu.supabase.co/functions/v1/api/v1/casts/676cc8aa-7822-4ae0-933e-a6d61561b9b0",
"threads": [
{
"title": "Inventory management for Verifone c18 with commander",
"link": "https://www.reddit.com/r/smallbusiness/comments/1vads7m/...",
"platform": "reddit",
"subreddit": "smallbusiness",
"score": 86,
"search_rank": 1,
"thread_date": null,
"why_this_thread": "c-store price book and inventory management",
"draft_reply": "Commander-style back office setups usually handle price book ...",
"includes_your_link": true,
"is_new": false
}
]
}threads is null while the cast is running, and for casts that ended empty or failed.
Cast status
| Status | Meaning | Credit |
|---|---|---|
running | Search in progress. Check again in ~10 seconds. | Reserved |
completed | Done. threads holds the results. | Used |
empty | Nothing worth replying to was found. | Refunded |
failed | The search could not finish. error explains why. | Refunded |
A cast still running after 10 minutes is marked failed and refunded automatically.
Thread fields
| Field | Description |
|---|---|
title, link | The thread and its URL |
platform | reddit, quora or other |
subreddit | For Reddit threads |
score | 0–100: how well your content answers this thread |
search_rank | Where Google ranks this thread among Reddit (or Quora) threads for the search that found it. Not the thread's position in a normal Google search. |
thread_date | When the thread was posted, if known |
why_this_thread | The angle your reply should take |
draft_reply | A drafted reply. Read and edit it before posting — always post by hand. |
includes_your_link | true on the one reply that carries your link. One link per cast keeps your account safe. |
is_new | false if this thread appeared in one of your earlier casts |
List casts — GET /v1/casts
Permission: Read only or higher. Includes casts started in the app and through the API, newest first.
| Query parameter | Description |
|---|---|
limit | 1–100, default 20 |
status | Optional: running, completed, empty or failed |
cursor | Pass next_cursor from the previous page to get the next one |
{
"data": [ { "id": "...", "input": "swiftsku.com", "status": "completed", "...": "..." } ],
"next_cursor": "MjAyNi0xMC0wM1QxMTo1OToxNC4wODQ5NjErMDA6MDB8..."
}next_cursor is null on the last page. List items have the same fields as a single cast, without threads.
Account and usage — GET /v1/me
Permission: Read only or higher. Check this before running many casts.
{
"email": "you@example.com",
"credits": 30,
"key": { "name": "n8n workflow", "prefix": "ic_live_PgjgA623", "scopes": ["read", "run"], "expires_at": null },
"limits": { "requests_per_hour": 300, "casts_per_24h": 30, "concurrent_casts": 2 },
"usage": { "casts_last_24h": 1, "casts_running": 0, "requests_remaining_this_hour": 296 }
}Credits
- Each cast uses 1 credit, exactly like a search in the app.
- The credit is reserved when the cast starts and refunded automatically if the cast ends empty or failed.
- Buy credits or go Pro from Account & billing in the app.
Limits (per key)
| Limit | Default |
|---|---|
| Requests | 300 per hour |
| Casts | 30 per 24 hours |
| Casts running at the same time | 2 |
Every response includes X-RateLimit-Limit and X-RateLimit-Remaining. When you hit a limit you get 429 with a Retry-After header and retry_after_seconds in the body. Need higher limits? Email support@getintentcast.com.
Errors
Every error has the same shape. Branch on code, not on message.
{ "error": { "code": "RATE_LIMITED", "message": "Rate limit exceeded.", "status": 429, "retry_after_seconds": 1800 } }| Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_INPUT | input is missing, too short, too long, or not a valid URL |
| 400 | INVALID_JSON | The body is not valid JSON |
| 400 | INVALID_IDEMPOTENCY_KEY | Idempotency-Key is longer than 200 characters |
| 400 | INVALID_CURSOR | cursor is not a value returned by this API |
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 401 | KEY_REVOKED | The key was revoked |
| 401 | KEY_EXPIRED | The key has expired |
| 402 | INSUFFICIENT_CREDITS | No credits left — top up in the app |
| 403 | INSUFFICIENT_SCOPE | A read-only key tried to start a cast |
| 403 | BROWSER_NOT_ALLOWED | Called from a web page — call from a server instead |
| 404 | CAST_NOT_FOUND | No cast with that id on your account |
| 404 | NOT_FOUND | Unknown endpoint |
| 405 | METHOD_NOT_ALLOWED | Wrong HTTP method for this endpoint |
| 409 | IDEMPOTENCY_CONFLICT | This Idempotency-Key was already used with a different input |
| 429 | RATE_LIMITED | Too many requests this hour |
| 429 | CONCURRENCY_LIMIT | Two casts are already running on this key — wait for one to finish |
| 429 | DAILY_LIMIT | This key reached its casts-per-24-hours limit |
| 500 | INTERNAL_ERROR | Something went wrong on our side — retry. No credit is used if a cast could not start. |
Every response carries an X-Request-Id header. Include it when you contact support.
Fair use
The API is for finding threads and drafting replies that a person reviews and posts by hand. Automated posting, bulk reply generation and reselling IntentCast output are not allowed — see the Terms of Service. Keys used against these terms can be revoked.
Tips for automation tools
- n8n / Make / Zapier: store the key as a header credential (Authorization: Bearer …). Start the cast with one HTTP step, then loop with a wait on GET /v1/casts/{id} until status is not running.
- Always send an Idempotency-Key (for example the video ID plus today's date). Automation tools retry on timeouts; this makes retries free.
- Check GET /v1/me first if your workflow runs many casts, so you stop before you run out of credits.
Questions: support@getintentcast.com