01 Overview
The YBOT Partner Data API serves YBOT's own video social-listening dataset — brand and product mentions that YBOT detects and analyses in publicly available video on YouTube, TikTok and Instagram — as a small set of read-only JSON operations. You receive YBOT's derived insights, not the platforms' data. Your own systems, or an AI agent using the operations as tools, call it directly; nobody has to open a dashboard.
Everything lives under /v1, takes and returns JSON, and is gated by an API key with the data:search scope. Output is always aggregated and allowlisted: personal data — names, verbatim quotes, birth dates — is never returned.
POST /v1/aggregate
Group by a dimension, rank by a metric.
POST /v1/search
Example documents, allowlisted & capped.
POST /v1/creators
Rank creators with aggregate demographics.
POST /v1/co-mentions
Videos/creators mentioning N brands together.
POST /v1/sector
Competitive share of voice over time.
GET /v1/schema
Self-describing schema of every operation.
02 Quickstart
Three steps to your first competitive share-of-voice result.
Get an API key
Ask your YBOT contact for a data:search key. It carries your plan's rate limit and monthly quota.
Call an operation
POST JSON to any /v1 endpoint with your key in the X-API-Key header.
Read the JSON
Every response is aggregated, allowlisted JSON — drop it straight into your model, dashboard or agent.
curl -X POST https://partners.yourbrandontime.com/v1/sector \
-H "X-API-Key: pk_live_your_key_here" -H "Content-Type: application/json" \
-d '{ "brands": [ {"label":"Repsol","terms":["Repsol"]},
{"label":"Iberdrola","terms":["Iberdrola"]} ],
"from_date":"2026-01-01", "to_date":"2026-06-30" }'
03 Authentication
Send your key in the X-API-Key header on every request. Keys carry a scope and a plan; the plan sets a fixed-window rate limit and a monthly request quota. A missing or unscoped key is rejected before any query runs.
curl https://partners.yourbrandontime.com/v1/schema \
-H "X-API-Key: pk_live_your_key_here"
Some keys are access_level: "raw" (larger search result sets); most are aggregate (examples capped at 10).
04 Data model
Three indices back every operation. You filter, group and rank over their declared fields; a query naming a field outside the allowlist is rejected. Output is always a redacted subset.
siv_business_ideas
Brand & product mentions YBOT extracts with an LLM from publicly available video — YBOT's primary analytics dataset (sentiment, brands, components, topics, opportunities).
- Filter
- brand_namecomponentstopicscategoryplatformsentimentchannel_nameupload_date
- Group by
- brand_namecategorycomponentschannel_nameplatformsentimentvideo_id
- Metrics
- sentiment_scoreestimated_value_usd
siv_content_creator
Creator/channel profiles: audience size, engagement, niches and aggregate audience demographics (gender/age/country/language). No individual-level PII.
- Filter
- platformcountrycategoriesdominant_genderdominant_age_rangesubscriber_countengagement_rate_viewers
- Group by
- platformcountrycategoriesdominant_genderdominant_age_range
- Metrics
- subscriber_countview_countengagement_rate_viewersaudience_sentiment
siv_info
YBOT's video reference catalog — the reach & engagement signals YBOT records per video (views, likes, comments, duration, tags), used to weight reach. Brand & sentiment live in siv_business_ideas.
- Filter
- channel_nameplatformcategorytagsvideo_idupload_date
- Group by
- channel_nameplatformcategorytags
- Metrics
- viewslikescommentsduration
Filter kinds: term (exact), range (numeric {gte,lte}), date_range ({gte,lte} ISO dates). Metrics combine a type — count · sum · avg · min · max — with a metric field.
05 aggregate
The core "open question" primitive: group an index by a dimension and rank the buckets by a metric. "Which creators talk most about retinol?" → group siv_business_ideas by channel_name, filter components: "retinol", count.
| Field | Type | Description | |
|---|---|---|---|
| index | string | required | One of the three indices. |
| group_by | string | required | A declared group-by dimension for the index. |
| metric | object | optional | { "type": "count" } (default) or { "type":"avg|sum|min|max", "field":"<metric_field>" }. |
| filters | object | optional | Field → value (term), {gte,lte} (range/date). |
| size | number | optional | Bucket count. Default 10. |
| order | "asc"|"desc" | optional | Default desc. |
curl -X POST https://partners.yourbrandontime.com/v1/aggregate \
-H "X-API-Key: pk_live_your_key_here" -H "Content-Type: application/json" \
-d '{ "index":"siv_business_ideas", "group_by":"channel_name",
"filters":{ "components":"retinol" },
"metric":{ "type":"avg", "field":"sentiment_score" }, "size":10 }'
→ { "matched_documents":1284, "buckets":[
{ "key":"Hyram", "count":61, "metric":0.42, "metric_type":"avg:sentiment_score" } ] }
06 search
Example documents — allowlisted fields only, capped at 10 unless your key is access_level: "raw". q is full-text over the index's free-text fields (e.g. siv_info title/description).
| Field | Type | Description | |
|---|---|---|---|
| index | string | required | One of the three indices. |
| filters | object | optional | Same filter grammar as aggregate. |
| q | string | optional | Full-text query over the index's free-text fields. |
| sort_field | string | optional | A numeric metric field or a date field of the index. |
| sort_order | "asc"|"desc" | optional | Default desc. |
| size | number | optional | Default 10. Capped at 10 for non-raw keys. |
context — never the verbatim transcript or any personal identifier.07 creators
A convenience wrapper over search on siv_content_creator: ranked creators with aggregate audience demographics. Filter by niche, geography or size; sort by any creator metric.
| Field | Type | Description | |
|---|---|---|---|
| filters | object | optional | e.g. { "categories":"beauty", "subscriber_count":{"gte":100000} }. |
| sort_field | string | optional | Default subscriber_count. Any creator metric. |
| sort_order | "asc"|"desc" | optional | Default desc. |
| size | number | optional | Default 10 (capped like search). |
Returns creator profiles with subscriber_count, engagement_rate_viewers and aggregate viewer_age_distribution / viewer_gender_distribution / viewer_country_distribution.
08 co-mentions
Find videos or channels that mention all of the given brands together — the co-occurrence primitive behind "who talks about A and B". Returns IDs + counts only (an aggregation), never raw documents.
| Field | Type | Description | |
|---|---|---|---|
| values | string[] | required | 2 to 5 values that must all co-occur. |
| index | string | optional | Default siv_business_ideas. |
| field | string | optional | Field the values live in. Default brand_name. |
| group_by | string | optional | Bucket by. Default channel_name (use video_id for videos). |
| size | number | optional | Default 10. |
curl -X POST https://partners.yourbrandontime.com/v1/co-mentions \
-H "X-API-Key: pk_live_your_key_here" -H "Content-Type: application/json" \
-d '{ "values":["Nike","IKEA"], "group_by":"video_id" }'
→ { "results":[ { "key":"vid_88", "total_mentions":7, "matched_values":2 } ] }
09 sector · Share of Voice
Rank a competitive set of brands by how present each is in video against the rest, month by month — volume, reach, sentiment and topics. This is the endpoint behind the sector Share-of-Voice report.
| Field | Type | Description | |
|---|---|---|---|
| brands | array | required | The competitive set — 1 to 30 brands. |
| brands[].label | string | required | Display name in the output. |
| brands[].terms | string[] | required | Phrases that count as a mention of this brand. |
| brands[].must_context | string[] | optional | Disambiguate a noisy term (e.g. ["energy","fuel"] for "BP"). |
| brands[].exact | boolean | optional | Require an exact phrase match. |
| from_date / to_date | string | required | YYYY-MM-DD. Window span ≤ 24 months. |
{ "brands":[ {
"label":"Repsol", "coverage":"ok", "low_confidence":false,
"totals":{ "unique_videos":760, "views":26900000 },
"series":[ { "month":"2026-01",
"unique_videos":152, // 1 per video
"mentions":158, // every mention (100 in one video = 100)
"views":8673694, "sentiment":0.061,
"volume_sov":76.38, // % share by unique videos
"reach_sov":97.27, // % share by views
"top_topics":[ { "topic":"energy", "count":50 } ] } ] } ],
"meta":{ "from":"2026-01-01", "to":"2026-06-30",
"caps":{ "max_brands":30, "video_cap":3000, "low_coverage":20 } } }
coverage: "low" (fewer than caps.low_coverage videos) before quoting a small brand.10 schema
A machine-readable description of every operation, the queryable indices, their fields and allowed values — so the API is self-documenting at runtime and an agent can use the operations as tools without hard-coding the contract.
11 Using the API from an AI agent
The API is deliberately agent-friendly: a handful of typed, read-only operations with strict guardrails and a machine-readable contract. The intended wiring — the same pattern Epsilon's DAI uses — is:
Bootstrap from /v1/schema
At session start, GET /v1/schema and generate one tool per operation from it. The schema lists every index, filterable field, group-by dimension and metric — no hard-coded contract to drift out of date.
Expose the operations as tools
Five tools cover the surface: aggregate (open questions), search (examples), creators, co_mentions and sector (competitive share of voice). Responses are compact aggregates, so they fit comfortably in an LLM context window.
Let errors steer self-correction
Guardrail rejections come back as 400 with a message that names the exact field and the allowed values (e.g. "index 'x' is not allowed. Allowed: […]"). Feed the message back to the model and retry — the loop converges without human help.
{
"name": "sector_share_of_voice",
"description": "Rank a set of brands by share of voice in video (volume, reach, sentiment, topics) over a date window.",
"input_schema": {
"type": "object",
"properties": {
"brands": { "type": "array", "maxItems": 30,
"items": { "type": "object", "required": ["label","terms"] } },
"from_date": { "type": "string", "format": "date" },
"to_date": { "type": "string", "format": "date" }
},
"required": ["brands","from_date","to_date"]
}
} // tool handler = POST /v1/sector with the tool input as the JSON body
/v1/schema per session, not per call. One request per question beats many small probes: aggregate with the right group_by usually answers in a single call, and sector returns the whole competitive picture at once.
12 Recipes
Common questions and the call that answers each.
Sector share of voice /v1/sector
Rank a competitive set by presence in video over time — the video answer to "who owns the conversation in our category?"
brands[]from_dateto_dateTop creators for a topic /v1/aggregate
Group siv_business_ideas by channel_name, filter by components or topics, rank by count or avg sentiment.
Creators by niche & audience /v1/creators
Filter siv_content_creator by category, country or size; get aggregate age/gender/country distributions for targeting.
Sentiment over time /v1/aggregate
Filter one brand, group by sentiment (or use /v1/sector's monthly series[].sentiment) to trend perception across the window.
Partnership & co-mention patterns /v1/co-mentions
Find the videos or channels that mention two or more brands together — collabs, comparisons, competitive framing.
values: [A, B]group_by: video_idDrill into one video's brands /v1/aggregate
Group by brand_name with a video_id filter to see every brand a specific video mentions.
13 Glossary
- Share of Voice (SoV)
- A brand's presence as a percentage of the tracked set over a period. Reported two ways: by volume and by reach.
- Volume SoV
- Share measured by unique videos — one video counts once, however many times the brand appears in it.
- Reach SoV
- Share measured by views — weights each mention by how many people could have seen it.
- Mention vs. unique video
- A
mentioncounts every occurrence (100 in one video = 100); aunique_videocounts the video once. - Sentiment score
- Average tone of the mentions, from −1 (negative) to +1 (positive).
- Co-mention
- Two or more brands appearing together in the same video or channel — a signal of comparison, collab or competitive framing.
- Coverage
lowwhen a brand has too few videos for its percentages to be statistically reliable.- Topic
- An LLM-extracted theme attached to a mention (e.g.
energy,oil-and-gas), with a frequency count.
14 Frequently asked questions
Is this YouTube, TikTok or Instagram data?
What is the YBOT Video Social Listening API?
Which platforms does it cover?
How is share of voice calculated?
Where is the data hosted and is it GDPR-compliant?
Can I get raw video transcripts or personal data?
How do I get an API key?
Can I use it with an AI agent?
15 Errors
Errors are JSON with a human-readable message. Guardrail violations name the exact field to fix.
| Status | When | Fix |
|---|---|---|
| 400 | A guardrail failed — bad index/field, >30 brands, window >24 months, missing terms. | Read message; correct the named field. |
| 401 | Missing X-API-Key header. | Send the header. |
| 403 | Key lacks the data:search scope. | Use a data-scoped key. |
| 429 | Rate limit or monthly quota exceeded. | Back off; upgrade the plan. |
| 503 | Data backend temporarily unavailable. | Retry with backoff. |
16 Limits & quota
| Limit | Value |
|---|---|
| Brands per sector request | ≤ 30 |
| Sector date window | ≤ 24 months |
| Buckets / result size | per-plan cap (search ≤ 10 for non-raw keys) |
| Rate limit & monthly quota | Per plan (fixed-window + monthly cap) |
| Sector request timeout | ~20 s |
Data is computed and stored in the EU (Scaleway) — no US cloud in the path. The API returns aggregates and allowlisted fields only; raw personal data never leaves.