YBOT · Partner Data API · v1

ES

The Video Social Listening API

Query YBOT's own analysis of public video across YouTube, TikTok and Instagram as read-only JSON — competitive share of voice, reach, sentiment, topics and creator insights. YBOT's proprietary, derived data; the same numbers the YBOT dashboard shows. EU-hosted, built for partners and their agents.

BASE https://partners.yourbrandontime.com AUTH X-API-Key FORMAT JSON · read-only HOSTED EU · Scaleway

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.

What this API is — and isn't. Every figure is YBOT's own proprietary analysis of publicly available video. This API does not resell, redistribute or provide access to YouTube, TikTok or Instagram data, content or APIs — platform names identify only where public content was observed. Metrics are YBOT-measured signals and derived aggregates, provided under YBOT's terms of service. YBOT is an independent service, not affiliated with, endorsed by or sponsored by those platforms.

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 · your first request
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 · authenticated request
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.

POST/v1/aggregatescope: data:search
FieldTypeDescription
indexstringrequiredOne of the three indices.
group_bystringrequiredA declared group-by dimension for the index.
metricobjectoptional{ "type": "count" } (default) or { "type":"avg|sum|min|max", "field":"<metric_field>" }.
filtersobjectoptionalField → value (term), {gte,lte} (range/date).
sizenumberoptionalBucket count. Default 10.
order"asc"|"desc"optionalDefault desc.
curl · top creators on retinol, by sentiment
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" } ] }

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.

POST/v1/creatorsscope: data:search
FieldTypeDescription
filtersobjectoptionale.g. { "categories":"beauty", "subscriber_count":{"gte":100000} }.
sort_fieldstringoptionalDefault subscriber_count. Any creator metric.
sort_order"asc"|"desc"optionalDefault desc.
sizenumberoptionalDefault 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.

POST/v1/co-mentionsscope: data:search
FieldTypeDescription
valuesstring[]required2 to 5 values that must all co-occur.
indexstringoptionalDefault siv_business_ideas.
fieldstringoptionalField the values live in. Default brand_name.
group_bystringoptionalBucket by. Default channel_name (use video_id for videos).
sizenumberoptionalDefault 10.
curl · videos mentioning both brands
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.

POST/v1/sectorscope: data:search
FieldTypeDescription
brandsarrayrequiredThe competitive set — 1 to 30 brands.
brands[].labelstringrequiredDisplay name in the output.
brands[].termsstring[]requiredPhrases that count as a mention of this brand.
brands[].must_contextstring[]optionalDisambiguate a noisy term (e.g. ["energy","fuel"] for "BP").
brands[].exactbooleanoptionalRequire an exact phrase match.
from_date / to_datestringrequiredYYYY-MM-DD. Window span ≤ 24 months.
200 · application/json (trimmed)
{ "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 } } }
Shares need not sum to 100%. The denominator is the sum over the tracked set, and a video co-mentioning two brands counts for both. Watch 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.

GET/v1/schemascope: data:search

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.

example · tool definition an agent can derive from the schema
{
  "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
Operational hints for agent builders. Every operation is read-only and idempotent — safe to retry on 503 with backoff. On 429 stop and surface the quota, don't loop. Cache /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_date

Top creators for a topic /v1/aggregate

Group siv_business_ideas by channel_name, filter by components or topics, rank by count or avg sentiment.

group_by: channel_namefilters: {topics}

Creators by niche & audience /v1/creators

Filter siv_content_creator by category, country or size; get aggregate age/gender/country distributions for targeting.

filters: {categories, subscriber_count}

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.

filters: {brand_name, upload_date}

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_id

Drill into one video's brands /v1/aggregate

Group by brand_name with a video_id filter to see every brand a specific video mentions.

group_by: brand_namefilters: {video_id}

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 mention counts every occurrence (100 in one video = 100); a unique_video counts 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
low when 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?
No. Everything the API returns is YBOT's own derived analysis of publicly available video — aggregated insights, not the platforms' data, content or API access. Platform names identify only where public content was observed. YBOT is not affiliated with, endorsed by or sponsored by those platforms.
What is the YBOT Video Social Listening API?
A read-only JSON API that exposes brand and product mentions detected in video across YouTube, TikTok and Instagram — with share of voice, reach, sentiment, topics and creator data — so partners can query the data programmatically instead of using a dashboard.
Which platforms does it cover?
YouTube, TikTok and Instagram. Mentions are extracted from spoken video transcripts by an LLM and aggregated per brand, creator and video.
How is share of voice calculated?
For each month the API divides a brand's presence by the sum across the tracked set. Volume share of voice uses unique videos (one video counts once); reach share of voice uses views. Because a video co-mentioning two brands counts for both, shares need not sum to 100%.
Where is the data hosted and is it GDPR-compliant?
All data is computed and stored in the EU on Scaleway — no US cloud in the path. The API returns aggregates and allowlisted fields only; raw personal data such as names, verbatim quotes and birth dates is never returned.
Can I get raw video transcripts or personal data?
No. Output is aggregated and passes an allowlist. You get counts, shares, sentiment, topics, allowlisted document fields and a paraphrased mention context — never verbatim transcripts or individual-level PII.
How do I get an API key?
Keys are provisioned per partner with the data:search scope. Ask your YBOT contact to issue one for your plan; the plan sets your rate limit and monthly quota.
Can I use it with an AI agent?
Yes. GET /v1/schema returns a machine-readable description of every operation and field, so an agent can use the operations as tools without hard-coding the contract.

15 Errors

Errors are JSON with a human-readable message. Guardrail violations name the exact field to fix.

StatusWhenFix
400A guardrail failed — bad index/field, >30 brands, window >24 months, missing terms.Read message; correct the named field.
401Missing X-API-Key header.Send the header.
403Key lacks the data:search scope.Use a data-scoped key.
429Rate limit or monthly quota exceeded.Back off; upgrade the plan.
503Data backend temporarily unavailable.Retry with backoff.

16 Limits & quota

LimitValue
Brands per sector request≤ 30
Sector date window≤ 24 months
Buckets / result sizeper-plan cap (search ≤ 10 for non-raw keys)
Rate limit & monthly quotaPer 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.