ShortsIntel
Short-form video and ad intelligence for TikTok, Instagram Reels, YouTube Shorts and Facebook: research what works in a niche, track creators, hashtags, sounds and advertisers, and search the Meta and TikTok ad libraries.
Hosted MCP Server
npx add-mcp 'https://www.shortsintel.com/api/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
ShortsIntel runs a remote MCP server with 27 tools for short-form video research. Connect it once and your assistant can search, enrich, score and track TikTok, Instagram Reels and YouTube Shorts — and quote you a price before it spends anything.
https://www.shortsintel.com/api/mcp
streamable HTTP
an API key as a bearer token, or OAuth 2.1 where the client negotiates it
/.well-known/mcp/server-card.json
Get a key
Create one in the console. It is shown once, has no expiry, and can be revoked at any time. New accounts start with a Starter Grant of 1,000 credits, and whatever is left of it expires after 90 days. Claude.ai is the exception: it connects over OAuth and needs no key at all. The authentication guide covers both paths, what consent grants, and the rate limits that apply either way.
Connect your client
Claude.ai (web and desktop)
No key, no config file. Claude.ai negotiates OAuth with the server on its own.
- Add ShortsIntel in Claude. The link opens Claude.ai’s Add custom connector dialog with the name and endpoint filled in. Check the URL, leave Advanced settings empty, then Add. (Or open Settings → Connectors, choose Add custom connector and paste the endpoint below.)
- Claude.ai sends you to ShortsIntel to sign in. This is the OAuth consent step: you approve the connection and choose which organization it acts for. That choice decides whose balance the connection spends from, so pick deliberately if you belong to more than one.
- You land back in Claude.ai with the connector enabled. Open the connector to confirm all 27 tools are listed, and turn it on for the chat you want to use it in.
Works on Claude Free, which allows one custom connector at a time.
https://www.shortsintel.com/api/mcp
Revoking is symmetrical: remove the connector in Claude.ai, or revoke the grant in the console. Neither touches your API keys.
ChatGPT (web and desktop)
No key. ChatGPT adds MCP servers in Developer mode and signs in over OAuth.
- Open ChatGPT settings, scroll down and switch Developer mode on.
- Choose Create, name it ShortsIntel, paste the endpoint below as the MCP server URL, pick OAuth and create it.
- ChatGPT sends you to ShortsIntel to sign in. Approve the connection and choose which organization it acts for, as with Claude.ai.
- In a new chat, choose the + next to the message box, then Developer mode, and enable ShortsIntel.
https://www.shortsintel.com/api/mcp
Claude Code
One command, from any directory. --scope user makes the server available in every project; drop it to add it to the current project only.
claude mcp add --transport http shortsintel https://www.shortsintel.com/api/mcp \
--scope user \
--header "Authorization: Bearer sk_live_YOUR_KEY"
Then run /mcp inside Claude Code to confirm the 27 tools are listed. Because the key goes into Claude Code’s own configuration rather than a file in your repository, there is nothing here to keep out of a commit.
Codex
One command, no key: Codex signs in over OAuth the first time it connects. It stores the server in ~/.codex/config.toml, which the Codex IDE extension and the ChatGPT desktop app share.
codex mcp add shortsintel --url https://www.shortsintel.com/api/mcp
If no browser tab opens, run codex mcp login shortsintel to start the sign-in.
Cursor
Settings → MCP → Add new global MCP server writes ~/.cursor/mcp.json; a .cursor/mcp.json in the project root does the same for one project. Both take the same shape.
{
"mcpServers": {
"shortsintel": {
"type": "http",
"url": "https://www.shortsintel.com/api/mcp",
"headers": {
"Authorization": "Bearer sk_live_YOUR_KEY"
}
}
}
}
Cursor has no prompted-secret input, so the key sits in the file in plain text. Use the global ~/.cursor/mcp.json where you can. If you do put one in a project, add .cursor/mcp.json to .gitignore — a committed key is a key you have to revoke.
VS Code (Copilot agent mode)
Add .vscode/mcp.json to the workspace. The inputs block is what keeps the key out of the file: VS Code prompts for it the first time the server starts and stores it in the OS keychain, so the file you commit contains only the reference ${input:shortsintel-key}.
{
"inputs": [
{
"type": "promptString",
"id": "shortsintel-key",
"description": "ShortsIntel API key (sk_live_YOUR_KEY)",
"password": true
}
],
"servers": {
"shortsintel": {
"type": "http",
"url": "https://www.shortsintel.com/api/mcp",
"headers": {
"Authorization": "Bearer ${input:shortsintel-key}"
}
}
}
}
Start the server from the Start lens above the server entry, then pick the tools from the Copilot chat tool picker.
Try it
Once the connector is on, say this to your assistant. The first half is free and the second costs a fraction of a cent, so it proves the connection without spending anything worth noticing:
Check my ShortsIntel balance, then look up this TikTok video and tell me how it performed: https://www.tiktok.com/@nasa/video/7302067372624057131
That is get_balance (free) and get_video (3 credits plain; with include=intelligence 23 credits instead; transcript only 10 credits instead; include=download 3 credits alone, else +3 credits). If both come back, you are connected. If the assistant says it cannot see the tools, the connector is off for that conversation rather than misconfigured.
Ask the price first
All 12 paid tools accept estimate. With it set, the tool answers with what the call would cost, from what is already stored, and does no work: nothing runs, nothing is charged, and no run is created. An assistant can quote you a number and wait for you to say yes.
Paid tools also accept an optional idempotency_key: retrying with the same key returns the original run and is not charged again.
{
"name": "research",
"arguments": {
"intent": "what is working for no-equipment home workouts this month",
"estimate": true
}
}
The reply is the price in Credits and whether a stored answer would serve it:
{
"estimate_credits": 1036,
"cached": false
}
In practice you rarely write that yourself — ask “how much would that research cost?” and the assistant calls the tool with estimate for you. cached says whether a stored answer can already reply; it costs the same as a fresh one.
The 27 tools
Tools wait up to 60 seconds inline and then hand back a run id to poll with get_run; re-reading a run is always free and never repeats the work. Failed work is never charged. Each tool says whether it is read-only, writes or is destructive: Claude can run read-only tools without asking, and asks before a destructive one.
| Tool | What it does | Price |
|---|---|---|
research Research a niche Writes Run it in the Playground | Run a Research: searches TikTok, Instagram Reels and YouTube Shorts (plus Facebook when platforms names it) for an intent, de-duplicates, analyses the top videos, ranks them and drops off-topic videos before analysing them, and returns a Digest (themes, verbatim hooks with templates, winning formulas, audience gaps from comments, sentiment, recommended angles, with lifts computed in code) plus the ranked videos, outlier creators, hashtags and sounds. Costs 1,036 credits for up to 50 enriched videos, then 20 credits each (at most 4,036 credits). Typically takes 1-3 minutes for 50 videos, depending on how busy the video analysis service is, longer toward 200: this tool waits up to 60 s, then returns a run id to poll with get_run (run.progress shows how far it has got). | 1,036 credits for up to 50 enriched videos, then 20 credits each, at most 4,036 credits |
get_research Read a research Read-only Run it in the Playground | Read a research you have already run, for free, as many times as you like. Give it the run id a previous research returned and an aspect: digest for the synthesis, videos for the shortlist, creators, hashtags or sounds for the evidence behind it. Filters depend on the aspect: every list takes platforms, order_by, sort, limit and offset; videos also take view bounds, dates, creator, hashtag and sound, for example TikTok only, over 100k views, best outlier first; creators also take follower bounds; digest takes only as_of. A filter the aspect does not take is refused, not ignored. This does NOT run a research and costs nothing: use research (which charges 1,036 credits and takes minutes) to collect a new one, and this to ask a narrower question of one you already have. Numbers are frozen as the research saw them; pass as_of=latest for the newest this API holds. | Free |
search_videos Search videos Writes Run it in the Playground | Keyword search across platforms. Returns up to 30 normalised videos per page with stats. Cheap (3 credits per platform searched, per page; 9 credits for all three). Add intelligence=true to analyse the top 20 (+20 credits each, async); a search that finds no videos still completes and is charged the page fee. A video over 10 minutes is not analysed or charged: its item fails with video_too_long. Instagram results are best-effort (coverage: partial). Facebook is opt-in: name it in platforms (best-effort, coverage: partial, views only where Facebook shows them, no other counts), and intelligence=true analyses its videos like the others. | 3 credits per platform searched, per page; +20 credits per enriched video with intelligence=true (top 20) |
get_video Get a video Writes Run it in the Playground | Look up one video by URL or by platform + id, on TikTok, Instagram (a post, Reel or carousel, by shortcode or /p/, /reel/ URL), YouTube (a Short or long-form video by 11-character id or watch, shorts or youtu.be URL) or Facebook (a video or reel, by numeric id or a /reel/, /watch?v= or /{page}/videos/ URL). Returns metadata, stats, the latest Snapshot and Scores when history exists (3 credits, any platform). include: ['intelligence'] adds the full analysis object (hook, CTA, tone, visual, safety) and is charged 23 credits instead of the lookup price, not on top of it. include: ['transcript'] alone adds the transcript for a flat 10 credits, also instead of the lookup price. include works on every platform (YouTube long-form too); a post that is gone, private or restricted fails with media_unavailable, uncharged. include: ['download'] adds download_url, a link to the video file that works until download_expires_at (7 days after our copy was made, at least a day away), for 3 credits: alone it is the whole price, with intelligence or transcript it is added to theirs; ask again for a fresh link, same price. A video over 10 minutes is refused for analysis and download with video_too_long, before any charge when its length is known, else uncharged. Each call is charged one price, the same whether the answer is stored or fresh. A video's comments are not read here: use get_comments. | 3 credits plain; with include=intelligence 23 credits instead; transcript only 10 credits instead; include=download 3 credits alone, else +3 credits |
get_comments Get a video's comments Writes Run it in the Playground | Read a page of a video's comments (by URL or platform + id) on TikTok, Instagram, YouTube or Facebook: text, likes, replies, parent id and posted and fetched times, never the author. limit sets the page size (1-100, default 25); next_cursor comes back: pass it as cursor for the next page. 3 credits per page. analyze=true adds a sentiment distribution and themes over the video's comments (+10 credits). Each call is charged the same whether the answer is stored or fresh. | 3 credits per page; +10 credits with analyze |
score_video Score a video Writes Run it in the Playground | Judge a video (by URL or platform + id) against its creator's baseline: outlier multiple (views vs the creator's median), velocity (views per hour since posting) and percentile. Fetches the creator's recent videos if no baseline exists (9 credits). | 9 credits |
get_creator Get a creator Writes Run it in the Playground | Creator profile with follower stats, baseline metrics (median views, engagement rate, posting cadence) and Scores, on TikTok, Instagram, YouTube or Facebook (a Page, linked to its Meta Advertiser when known); pass include: ['videos'] to add recent videos (6 credits). On Instagram and Facebook, videos_from picks the Reels (default) or all posts including carousels, and next_cursor comes back: pass it as cursor for the next page (3 credits). On YouTube the handle may be a channel id (UC…), the videos are the channel's Shorts, paged the same way. intelligence: true analyses the creator's stored videos instead, on every Platform, like search_videos with intelligence: up to 20 per page at +20 credits each, async, the page itself free; a video that cannot be analysed (including video_too_long past 10 minutes) comes back with intelligence: null and why, uncharged. | 6 credits; videos pages 3 credits; with intelligence=true the page is free, +20 credits per analysed video (top 20) |
get_hashtag_or_sound Get a hashtag or sound Writes Run it in the Playground | Look up a hashtag or a sound (TikTok music / Instagram audio): totals, trend direction, top videos and the latest Snapshot (hashtag 3 credits, sound 6 credits). videos: true pages its Videos instead, in the platform's order and always fresh, at the same price per page with no lookup on top; pass next_cursor back as cursor for the next page. | hashtag 3 credits, sound 6 credits |
search_ads Search ad libraries Writes Run it in the Playground | Search the Meta or TikTok ad library by keyword or advertiser (exactly one). Meta: 1 credit per Ad delivered; filters country (omit for all countries), status (active default, inactive, all), kind (commercial default, political, issue, all), media_type, placements, started_after, started_before; limit up to 500 (default 50), next_cursor for more; order_by relevance (default), winner, days_running or start_date sorts the page. Each Meta Ad comes back trimmed (copy, CTA, landing URL, media URLs, dates, placements, countries, variant count, days running, a 0-100 winner Score from days running and variants added relative to the Advertiser's other Ads, disclosed spend and reach) and is stored with a Snapshot. A library outage is source_unavailable and costs nothing; one part-way through is a partial run charged only for the Ads delivered. Meta analyze=true adds analysis to the first 50 Ads (video Ads: transcript, hook, CTA, format, safety; image and carousel Ads: copy angle, offer, CTA, visual format, topics, sentiment) at +20 credits per Ad, whether computed or already stored; an Ad whose analysis fails is not charged and the run is partial. TikTok: 3 credits per page of up to 30, EU/EEA, CH, UK and Turkey Ads only, no country or Meta filters, no analyze; advertiser: id, library URL or name; a name several carry is advertiser_ambiguous (409, free), candidates' url to pass back. get_ad tiktok_ad_id reads one Ad's targeting. | Meta 1 credit per Ad delivered, +20 credits per Ad analysed (computed or stored); TikTok 3 credits per page |
get_ad Get an Ad or Advertiser Writes Run it in the Playground | Look up one Meta Ad by its Ad Library id (library_id), one Advertiser by its Facebook Page id (page_id), one TikTok Advertiser (platform tiktok with advertiser_id), or one TikTok Ad by its ad library id (tiktok_ad_id); pass exactly one. Ad mode: copy, CTA, landing URL, media URLs, dates, running state, placements, countries, variant count, days running, disclosed spend and reach (3 credits, the same when served from our copy observed in the last 6 hours). An Ad Meta has removed is still returned from our stored copy with removed_from_library: true at 3 credits; an id never seen is not_found and costs nothing. analyze=true adds Ad analysis (+20 credits, computed or already stored). Snapshot history and stored analysis are free over REST at /v1/ads/meta/{library_id}/snapshots and /intelligence. Advertiser mode: the Advertiser's profile (name, Page URL, linked Instagram account and Creator when Meta shows one, running and total Ad counts) after reading all its Ads, at 15 credits (the same when served within 6 hours of the last complete read); its Ads are search_ads with advertiser=page_id. TikTok Advertiser mode (advertiser_id: the library's advertiser id, its library.tiktok.com URL or its name; several exact name matches are advertiser_ambiguous, none not_found, as is a bare id not seen before since the library needs the exact name, all free): name, TikTok account, registry location, paid by, running and total Ad counts, at 15 credits (6 h reuse). TikTok mode (3 credits, EU/EEA, CH, UK and Turkey Ads only): copy, media, dates, landing URL, CTA, objective, advertiser and its TikTok account, targeting with impressions per country by age and gender; or Creative Center engagement (CTR, likes, comments, shares) when only it answers. Stored like Meta's (6 h reuse, removed_from_library), with any analysis a Tracker stored, free. Unknown id is not_found, free. | Ad 3 credits, +20 credits with analyze (Meta); Advertiser 15 credits (Meta or TikTok); TikTok Ad 3 credits |
track Track a target Writes | Create a daily Tracker on a creator, a hashtag, a sound or a Meta or TikTok Advertiser (video is deprecated and returns kind_deprecated, and nothing is charged). Creator: platform tiktok, instagram or facebook (youtube returns unsupported_platform for now); target is the handle or profile URL (a numeric Page id also works on Facebook); 6 credits a cycle; a Change Report only when something notable happens (new videos, outliers, followers +/-10%, velocity spikes). Hashtag (kind=hashtag, platform tiktok or instagram): target is the tag, with or without '#'; 3 credits a cycle, which samples one page of the tag's videos and reports when the sample's median views move 25% or more or a video enters its top 10 (sample-based, not platform totals). Sound (kind=sound, platform tiktok): target is the sound id, the number at the end of a tiktok.com/music/ URL, or that URL; 6 credits a cycle, which reads the sound's platform video count and one page of its videos and reports when the video count rises 10% or more or the most viewed video changes. Advertiser (kind=advertiser, platform meta or omitted): target is the Facebook Page id or Page URL (a name works when only one Advertiser carries it, else advertiser_ambiguous with candidates, free); 30 credits a cycle, which reads all the Advertiser's Ads (running and stopped) and reports new Ads, stopped Ads, Ads whose variant count grew, and new countries or placements. TikTok Advertiser (kind=advertiser, platform tiktok; EU/EEA, CH, UK and Turkey Ads only): target is the ad library advertiser id, its library.tiktok.com URL or its name (several exact matches: advertiser_ambiguous with candidates; none, or a bare id not seen before since the library needs the exact name, not_found; both free); 30 credits a cycle, which reads the Advertiser's recent Ads and reports new Ads (each with targeting, landing page and CTA; 10 included, 3 credits each beyond), stopped Ads (ended, or not shown for 3 days) and Ads whose reach bucket grew; a read the library breaks off is partial, 3 credits per page read up to the cycle price; with intelligence each new Ad is analysed as on Meta and get_changes returns the analysis on the Ad. Creating runs the first cycle immediately and charges it; with too little balance nothing is created and you get insufficient_balance. You only ever have one Tracker per target: tracking something you already track returns that Tracker with created=false and charges nothing. Pass refresh=true with an existing tracker_id to run a cycle now, at the same price. Pass collection (an id or a name like 'Competitors') to also put the Tracker in that Collection; a name you have not used yet creates it. estimate=true quotes the base cycle price only: the +20 credits per new video or Ad with intelligence depends on what the cycle finds. idempotency_key applies to refresh only; create is already idempotent by target. | 6 credits per creator cycle, 3 credits per hashtag cycle, 6 credits per sound cycle, 30 credits per advertiser cycle, including the first one run on create; +20 credits per new video or Ad with intelligence; tracking a target you already track is free |
list_trackers List trackers Read-only | List this Customer's Trackers with state, kind and next cycle time. Free. | Free |
get_tracker Get a tracker Read-only | Look up one Tracker: its kind, platform, target, state (active or paused) and whether analysis is on. Refer to it by tracker_id, or by platform and target as you would pass them to track (e.g. tiktok and '@nike'; meta and a Page id for an Advertiser). A target you do not track is not_found: this never starts a Tracker. Free. | Free |
set_tracker_state Pause or resume a tracker Writes | Pause (state paused) or resume (state active) one Tracker, found as in get_tracker. A paused Tracker runs no cycles and is charged nothing; resuming brings back its daily cycles at the usual price. Free. | Free |
set_tracker_intelligence Switch tracker analysis on or off Writes | Switch analysis of new videos or Ads on (intelligence true) or off (false) for one Tracker, found as in get_tracker, from the next cycle. Switching it on spends Credits: +20 credits per new video or Ad each cycle analyses, on top of the cycle price. The switch itself is free. | Free |
delete_tracker Delete a tracker Destructive | Delete one Tracker, found as in get_tracker. Final: it stops its cycles, its Change Reports stay readable with get_changes, and tracking the target again starts a new Tracker. Free. | Free |
get_changes Get change reports Read-only | Change Reports for a Tracker, or for a whole Collection (by id or name, e.g. 'Competitors'), merged newest first: new videos, outliers, follower moves and velocity spikes, a hashtag's median-view moves and new top videos, a sound's video-count rises and new top video, with before/after numbers. Pass since to see only what changed after a time. Free. | Free |
list_collections List collections Read-only | List this Customer's Collections: named sets of Trackers such as 'Competitors', 'Our accounts' or 'Influencers', each holding one kind (creator, hashtag, sound or advertiser; older ones may hold the deprecated video kind), with how many Trackers are in each. Free. | Free |
create_collection Create a collection Writes | Create an empty Collection, a named set of Trackers such as 'Competitors'. kind (creator, hashtag, sound or advertiser) is fixed once created. A Collection is only a named set: pausing, analysis and cycles belong to each Tracker, and one Tracker can sit in several Collections while being charged once per cycle. You rarely need this first: add_to_collection and track create a Collection from a name you have not used yet. Free. | Free |
rename_collection Rename a collection Writes | Rename a Collection, referred to by id or by its current name. Its Trackers are untouched. Free. | Free |
delete_collection Delete a collection Destructive | Delete a Collection, by id or name. Its Trackers keep running unless delete_trackers=true, which also deletes the member Trackers that are in no other Collection (their Change Reports stay readable with get_changes). The answer always lists the Trackers still being charged. Free. | Free |
add_to_collection Add to a collection Writes | Add a Tracker to a Collection (by id or name). Pass tracker_id, or a platform and target: a target you already track is attached as it is (a paused Tracker stays paused), and one you do not track yet starts a Tracker whose first cycle runs now (6 credits for a TikTok, Instagram or Facebook creator, 3 credits for a TikTok or Instagram hashtag, 6 credits for a TikTok sound, 30 credits for a Meta Advertiser by Page id, Page URL or name, or for a TikTok Advertiser (platform tiktok) by ad library advertiser id, library.tiktok.com URL or name; only those can be tracked today). One advertiser Collection holds Meta and TikTok Advertisers. A name you have not used yet creates that Collection, with the Tracker's kind (pass kind when adding by target), once the Tracker exists. A Tracker of a different kind than the Collection is refused with collection_kind_mismatch. Pass estimate to get the price first. Adding a Tracker you already have is free. | Free for a Tracker you already have; a target not tracked yet runs its first cycle: 6 credits per creator, 3 credits per hashtag, 6 credits per sound, 30 credits per advertiser, +20 credits per new video with analysis |
remove_from_collection Remove from a collection Writes | Take a Tracker (tracker_id) out of a Collection (by id or name). The Tracker itself keeps running, and stays in its other Collections. Free. | Free |
act_on_collection Act on every member Writes | Pause, resume, refresh or switch analysis for every Tracker in a Collection (by id or name) at once (action intelligence takes intelligence true or false). pause, resume and intelligence write through to each member Tracker and are free, but switching intelligence on adds +20 credits per new video or Ad analysed in later cycles. refresh runs every member's cycle now as one Run and spends Credits: 6 credits per creator, 3 credits per hashtag, 6 credits per sound, 30 credits per advertiser; pass estimate to get the price first. A Tracker in several Collections is changed for all of them, so pausing one Collection pauses shared members in the others: every answer lists those in trackers_in_other_collections. | Free for pause, resume and intelligence; refresh is one cycle per member: 6 credits per creator, 3 credits per hashtag, 6 credits per sound, 30 credits per advertiser, +20 credits per new video with analysis |
get_run Get a run Read-only | Poll a Run by id. Returns status and, once completed or partial, the full result. Free, and never re-runs the work. Poll every 5 to 15 s for research, 2 to 5 s for enrichment. | Free |
get_usage Get usage Read-only | Recent charges, one per charged Run, with the Run behind each one: kind, status, charge and list price in Credits, and when, plus the total charged. Use it to see what has already been paid for before repeating work. Free. | Free |
get_balance Get balance Read-only | Prepaid balance in Credits, plus each Grant (such as the Starter Grant) with the Credits it has left and when they expire. Grants are spent first. Free. | Free |
Every price on this page is the one the server charges. The pricing page has the same numbers with the balance rules and worked examples.
Not available as tools
These operations are on the REST API only. Call them over HTTP with an API Key when you need them; everything else in the API reference is reached by one of the tools above.
| Operation | Why it is REST-only |
|---|---|
| POST /v1/research/{id}/refresh Refresh a research's videos | A paid sweep of fresh metrics for a Research's Videos, for tracking growth over time; get_research reads the Research, and research runs a new one. |
| GET /v1/creators/{platform}/{handle}/snapshots List a creator's snapshots | Free history, read over REST: an agent rarely needs every past Snapshot in a conversation. |
| GET /v1/ads/meta/{library_id}/intelligence Get a Meta Ad's analysis | Stored Ad analysis is a free read over REST; get_ad with analyze returns it with the Ad. |
| GET /v1/ads/meta/{library_id}/snapshots List a Meta Ad's snapshots | Free history, read over REST: an agent rarely needs every past Snapshot in a conversation. |
| GET /v1/ads/tiktok/{ad_id}/snapshots List a TikTok Ad's snapshots | Free history, read over REST: an agent rarely needs every past Snapshot in a conversation. |
| GET /v1/trackers/{id}/snapshots List a tracker's snapshots | Free history, read over REST: an agent rarely needs every past Snapshot in a conversation. |
| GET /v1/runs List runs | Run history is for the Console and audits; get_run polls the Run a tool returned and get_usage lists charges. |
| GET /v1/runs/{id}/items List run items | Run history is for the Console and audits; get_run polls the Run a tool returned and get_usage lists charges. |
| POST /v1/webhooks Register a webhook endpoint | Webhooks need a receiving endpoint, and an agent in a chat does not host one. |
| GET /v1/webhooks List webhook endpoints | Webhooks need a receiving endpoint, and an agent in a chat does not host one. |
| GET /v1/webhooks/{id} Get a webhook endpoint | Webhooks need a receiving endpoint, and an agent in a chat does not host one. |
| DELETE /v1/webhooks/{id} Delete a webhook endpoint | Webhooks need a receiving endpoint, and an agent in a chat does not host one. |
| POST /v1/webhooks/{id}/rotate Rotate a signing secret | Webhooks need a receiving endpoint, and an agent in a chat does not host one. |
| GET /v1/webhooks/{id}/deliveries List deliveries | Webhooks need a receiving endpoint, and an agent in a chat does not host one. |
| POST /v1/webhooks/{id}/deliveries/{deliveryId}/replay Replay a delivery | Webhooks need a receiving endpoint, and an agent in a chat does not host one. |
Also worth knowing
- Limits are 60 requests per minute and 10 concurrent running operations.
- Before any work starts, the Balance is checked against the operation's quoted price (for Research and enriched searches, the worst-case quote). If it cannot cover that, the call is a `402 insufficient_balance` and no Run is created or charged. A multi-item Run (Research, enriched search) settles per item when it finishes. If the Balance no longer covers every completed item, the completed items are charged in order up to the Balance, the rest fail with `insufficient_balance`, and the Run ends `partial`. A Run that cannot afford any of its work ends `failed` and is not charged.
- Instagram coverage is best-effort and is reported as
coverage: "partial"rather than silently returning less. - The same operations are available over REST — see the API reference, or /llms-full.txt if you would rather hand your agent one file.
Where to go next
- Authentication and limits — keys, the OAuth consent flow, what a connection may spend, and the rate limits.
- Pricing — every price, the balance rules, and what a typical week costs.
- API reference — the same operations over REST, with parameters and responses.
Something not connecting? Email support@shortsintel.com.