Data model
Entities
Benchmark returns one kind of thing at a time. It is called an entity. An
entity is a profile, a post, or a link. A profile is a public publishing
account or channel.
Profiles and posts belong to a platform: instagram, tiktok, youtube, or x.
A link is a web page. It does not belong to a platform.
You point at an entity with a target. A target is a supported URL, a handle, or a platform ID.
Basic and Enriched
Profiles have a Basic view. Posts and links have Basic and Enriched views.
| Basic | Enriched | |
|---|---|---|
| Contains | Core identity, text, state, and metrics | Everything in Basic, plus the post structure and an analysis, where supported |
| Available for | Profiles, posts, and links | Posts and links |
| Use it for | Normal reads and current source data | Understanding how supported content works |
A refresh requests the latest available public source state for the selected view. It is not a third view.
Read a stored result first when you can. A refresh performs a new source update, so it costs more.
- Posts get one Enriched analysis. After a post has a completed analysis, another
Enriched refresh returns
409 CONFLICTand costs no credits. Reads keep returning the existing analysis. - Links are analyzed again when the page changes. Until then, a read can return
the older analysis with an
outdatednotice.
Public analysis sits under the post, post item, media item, or link that it describes. Customer responses contain only the structured fields shown in this schema. They do not include source media or transcript content.
Analysis hierarchy
Post analysis follows the same structure as post data:
analysishas facts about the whole post, plus reusable templates.items[].analysishas facts about one carousel slide, thread entry, quote, or root item.items[].media[].analysishas facts about one supported image, video, thumbnail, or other media item.
Link analysis is under analysis. Its analysisFreshness is current when the
analysis matches the current page. It is outdated when the page changed after the
analysis.
Freshness
Every stored response has a freshness value.
current: this is the newest data Benchmark has.stale: Benchmark has newer data than this result.
Coverage
Every result has coverage. Coverage reports whether Benchmark filled the supported fields for this result.
| Status | Meaning | Reasons |
|---|---|---|
complete | All supported fields available for this request were returned. | None |
partial | Some supported fields were unavailable. | age_restricted, transcript_unavailable |
unavailable | No public result was available. | private, not_found |
For private, the source indicates that the content is not public. Benchmark
does not retrieve it.
Stored reads return complete or partial coverage.
Collections
A refresh starts a research job. The API calls this job a collection. It runs
in the background. Poll it until its status is one of these:
complete: The job ended. The poll returns the result one time. If no public result was available, it returnsresult: nullwithcoverage.failed: Benchmark could not produce the requested result. Check itserror.
The first poll that succeeds returns the data and uses up the collection. Later
polls return 409 COLLECTION_ALREADY_DELIVERED.
Each collection has an expiresAt time, 72 hours after you create it.
A profile-history refresh returns the first ten stored posts. Use the paid stored read to get later pages.
A history refresh accepts maxPosts (default 50, maximum 1,000). There is no date
cutoff input. Pinned posts count toward the limit. YouTube history includes videos
and Shorts together.