Reference
The unified schema
The objects below cover every platform. A Post from TikTok and a Post from YouTube have the same field names and the same types, so the code that reads one reads the other unchanged.
Two rules that shape everything
Null is not zero. A field is null when the platform does not publish it and zero when the platform publishes a zero. Averaging across a set where those were conflated gives a wrong answer that looks plausible, which is the worst kind.
Nothing is discarded. Normalising is additive. Pass include_raw=true and the original upstream payload comes back beside the normalised one, so a field we have not modelled yet is still reachable.
The envelope
Every successful response has the same outer shape. data is the object, meta is the accounting, and pagination appears only where a list can continue.
{
"success": true,
"data": { /* the unified object */ },
"pagination": { "cursor": null, "hasMore": false, "count": 1 },
"meta": {
"platform": "youtube",
"endpoint": "youtube.channel",
"creditsCharged": 1,
"cached": false,
"cacheAgeSeconds": null,
"durationMs": 412,
"requestId": "req_01JB8Z..."
},
"raw": { /* only when include_raw=true */ }
}Creator
21 fieldsA channel, profile, or page. Follower counts mean subscribers on YouTube and followers everywhere else: the nearest equivalent, always in the same field.
| Field | Type | Notes |
|---|---|---|
| platform | enum | youtube · instagram · facebook · twitter · tiktok · linkedin · reddit · threads · bluesky · truthsocial · snapchat · kwai · pinterest · rumble · twitch · kick · spotify · apple-music · soundcloud · github · google · amazon · walmart · ebay · redfin · zillow · linktree · komi · pillar · linkbio · linkme · telegram |
| id | string | The platform-native id: channel id, user id, numeric id. |
| handle | string | null | Without the @. Null where the platform has no handle. |
| displayName | string | null | — |
| bio | string | null | — |
| avatarUrl | string | null | Highest resolution the platform exposes. |
| bannerUrl | string | null | — |
| url | string | null | Canonical public URL. |
| verified | boolean | null | A verification badge the platform shows on the account. Null where the platform has no public badge or does not expose it. |
| followerCount | number | null | Subscribers, followers, or the platform equivalent. |
| followingCount | number | null | — |
| likeCount | number | null | Total likes where the platform exposes one. Null means not exposed. |
| postCount | number | null | Videos, posts, or reels, depending on what the platform counts. |
| viewCount | number | null | Lifetime views where exposed (YouTube, TikTok). |
| isPrivate | boolean | null | — |
| isBusiness | boolean | null | The platform classifies the account as a business or organisation, not a person or creator. Null where it draws no such line. Every Facebook Page counts, including Pages for public figures. |
| category | string | null | — |
| location | string | null | Self-declared, not verified. |
| externalLinks | string[] | Empty array, never null. |
| createdAt | string | null | Some platforms publish only a coarse join date. |
| fetchedAt | string | ISO 8601. When we read it, not when it changed. |
Post
22 fieldsA video, Short, reel, image, carousel, or text post. Engagement fields are null when the platform does not expose them, which is not the same as zero.
| Field | Type | Notes |
|---|---|---|
| platform | enum | youtube · instagram · facebook · twitter · tiktok · linkedin · reddit · threads · bluesky · truthsocial · snapchat · kwai · pinterest · rumble · twitch · kick · spotify · apple-music · soundcloud · github · google · amazon · walmart · ebay · redfin · zillow · linktree · komi · pillar · linkbio · linkme · telegram |
| id | string | The platform-native id: channel id, user id, numeric id. |
| type | enum | video · short · image · carousel · text · live · story · reel · unknown |
| url | string | null | — |
| title | string | null | Null on platforms without titles. |
| text | string | null | Caption or description. |
| authorId | string | null | — |
| authorHandle | string | null | — |
| authorName | string | null | — |
| thumbnailUrl | string | null | — |
| mediaUrls | string[] | — |
| durationSeconds | number | null | Null for anything that is not timed media. |
| viewCount | number | null | Null means not exposed. Zero means zero. |
| likeCount | number | null | Null when the creator has hidden it. |
| commentCount | number | null | — |
| shareCount | number | null | Null on platforms with no share metric. |
| hashtags | string[] | Parsed from the text, without the #. |
| mentions | string[] | Parsed from the text, without the @. |
| taggedUsers | string[]? | Accounts tagged in the media itself, which is not the same list as mentions. A tag can name an account the caption never does. Absent means the platform does not report tags; [] means it reports none. |
| isSponsored | boolean | null | Only where the platform discloses it. |
| publishedAt | string | null | ISO 8601 where exact, otherwise the platform’s own relative text. |
| fetchedAt | string | ISO 8601. |
Transcript
10 fieldsCaptions as one text block plus timed cues. The text block is what most pipelines want; the cues are there when you need to seek.
| Field | Type | Notes |
|---|---|---|
| platform | enum | — |
| postId | string | The video this transcript belongs to. |
| url | string | null | — |
| language | string | null | BCP-47 code of the track that was returned. |
| isAutoGenerated | boolean | null | True for machine captions, which are measurably less accurate. |
| text | string | The whole transcript, cues joined. |
| cues | TranscriptCue[] | { start, end, text }, where end is null when the platform omits a duration. |
| durationSeconds | number | null | — |
| source | 'captions' | 'asr' | null | The platform's own caption track, or audio we transcribed ourselves. Null when a producer cannot tell which. |
| fetchedAt | string | — |
Comment
14 fieldsA comment or a reply. Replies carry a parentId; top-level comments do not.
| Field | Type | Notes |
|---|---|---|
| platform | enum | youtube · instagram · facebook · twitter · tiktok · linkedin · reddit · threads · bluesky · truthsocial · snapchat · kwai · pinterest · rumble · twitch · kick · spotify · apple-music · soundcloud · github · google · amazon · walmart · ebay · redfin · zillow · linktree · komi · pillar · linkbio · linkme · telegram |
| id | string | The platform-native id: channel id, user id, numeric id. |
| postId | string | null | — |
| parentId | string | null | Null for a top-level comment. |
| text | string | — |
| authorId | string | null | — |
| authorHandle | string | null | — |
| authorName | string | null | — |
| authorAvatarUrl | string | null | — |
| likeCount | number | null | — |
| replyCount | number | null | — |
| isPinned | boolean | null | — |
| isAuthorReply | boolean | null | True when the post’s author wrote it. |
| publishedAt | string | null | — |
Ad
24 fieldsA creative from a public ad library. These are published by regulatory mandate, which makes them the lowest-risk and most reliably available data in the category.
| Field | Type | Notes |
|---|---|---|
| platform | enum | youtube · instagram · facebook · twitter · tiktok · linkedin · reddit · threads · bluesky · truthsocial · snapchat · kwai · pinterest · rumble · twitch · kick · spotify · apple-music · soundcloud · github · google · amazon · walmart · ebay · redfin · zillow · linktree · komi · pillar · linkbio · linkme · telegram |
| id | string | The platform-native id: channel id, user id, numeric id. |
| advertiserId | string | null | — |
| advertiserName | string | null | — |
| url | string | null | — |
| headline | string | null | — |
| body | string | null | — |
| ctaText | string | null | — |
| linkUrl | string | null | — |
| creativeType | string | null | — |
| imageUrls | string[] | — |
| videoUrls | string[] | — |
| platforms | string[] | Surfaces the creative runs on. |
| countries | string[] | — |
| languages | string[] | — |
| startedAt | string | null | — |
| endedAt | string | null | Null while the ad is still running. |
| isActive | boolean | null | — |
| impressionsLower | number | null | Libraries publish ranges, not exact figures. |
| impressionsUpper | number | null | — |
| spendLower | number | null | — |
| spendUpper | number | null | — |
| currency | string | null | — |
| fetchedAt | string | — |
Product
21 fieldsA listing on a marketplace. Price is a number beside its currency, never a formatted string: a price you cannot compare or sort is not a price. Null means the marketplace did not say, which is different from zero: an out-of-stock item has no price, it does not cost nothing.
| Field | Type | Notes |
|---|---|---|
| platform | enum | youtube · instagram · facebook · twitter · tiktok · linkedin · reddit · threads · bluesky · truthsocial · snapchat · kwai · pinterest · rumble · twitch · kick · spotify · apple-music · soundcloud · github · google · amazon · walmart · ebay · redfin · zillow · linktree · komi · pillar · linkbio · linkme · telegram |
| id | string | The platform-native id: channel id, user id, numeric id. |
| title | string | null | — |
| brand | string | null | — |
| description | string | null | — |
| url | string | null | — |
| imageUrls | string[] | — |
| price | number | null | What a buyer pays now. |
| currency | string | null | ISO 4217, as the marketplace stated it. |
| listPrice | number | null | The struck-through reference price. Both are kept, so a discount is measurable. |
| availability | enum | null | in_stock · out_of_stock · preorder · discontinued · unknown |
| rating | number | null | — |
| reviewCount | number | null | — |
| sellerName | string | null | — |
| shipsFrom | string | null | — |
| marketplace | string | null | The storefront this was read from, e.g. amazon.co.uk. The same id is a different product, price and currency per country. |
| categories | string[] | — |
| featureBullets | string[] | — |
| attributes | Record<string, string> | Open key/value specifications. Marketplaces publish a different set per category, so a fixed shape would discard most of it. |
| reviews | ProductReview[] | The sample a product page carries inline, not a full review list. |
| fetchedAt | string | — |
PropertyListing
33 fieldsA home for sale or to let. Written to serve US, European and Indian portals from one shape, which is why area carries its unit and a price carries its qualifier. A number without either is a misquote on half the world’s listings.
| Field | Type | Notes |
|---|---|---|
| platform | enum | youtube · instagram · facebook · twitter · tiktok · linkedin · reddit · threads · bluesky · truthsocial · snapchat · kwai · pinterest · rumble · twitch · kick · spotify · apple-music · soundcloud · github · google · amazon · walmart · ebay · redfin · zillow · linktree · komi · pillar · linkbio · linkme · telegram |
| id | string | The platform-native id: channel id, user id, numeric id. |
| url | string | null | — |
| listingType | enum | null | sale · rent |
| status | enum | null | active · pending · under_offer · sold · rented · off_market · unknown. Sold and off_market are distinct: a withdrawn listing may return, a sold one will not. |
| price | number | null | — |
| currency | string | null | — |
| priceQualifier | string | null | “Offers over”, “guide price”, “per month”. These change what the number means. |
| pricePerArea | number | null | In the same unit as areaUnit. |
| address | Address | Split into street, locality, region and postcode, with the portal’s own single line kept alongside. |
| latitude | number | null | — |
| longitude | number | null | — |
| beds | number | null | — |
| baths | number | null | — |
| receptions | number | null | UK and European listings lead with reception rooms; US ones have no equivalent. |
| area | number | null | — |
| areaUnit | enum | null | sqft · sqm. Never assumed, because assuming feet mis-scales a European listing by 10.76×. |
| lotArea | number | null | The plot, where the portal separates it from the floor area. |
| lotAreaUnit | enum | null | sqft · sqm. Carried separately, because a portal can state the two in different units. |
| propertyType | string | null | — |
| yearBuilt | number | null | — |
| description | string | null | — |
| imageUrls | string[] | — |
| floorPlanUrls | string[] | — |
| agentName | string | null | — |
| agentPhone | string | null | Only where the portal publishes it to a logged-out visitor. |
| brokerageName | string | null | — |
| amenities | Record<string, string> | Open record: HOA dues, council tax band, EPC rating, carpet area. |
| schools | School[] | — |
| priceHistory | PriceEvent[] | Empty where a portal serves it only after the page loads. |
| listedAt | string | null | — |
| updatedAt | string | null | When the portal last changed the listing, where it says. |
| fetchedAt | string | — |
Address
6 fields| Field | Type | Present | Description |
|---|---|---|---|
| formatted | string | null | always | The whole address as one line, as the source published it. Some sources publish only this line, so the other address fields can be null while this is set. |
| street | string | null | always | |
| locality | string | null | always | City or town. |
| region | string | null | always | State, province or region. |
| postalCode | string | null | always | |
| country | string | null | always | Country as the source gives it, which may be a code such as US or a name. |
AgentStat
3 fields| Field | Type | Present | Description |
|---|---|---|---|
| label | string | null | always | What the figure measures, such as total sales volume. |
| value | string | null | always | The figure as the source displays it. |
| numericValue | number | null | always | `value` as a number, where it can be read as one. |
JobPosting
11 fields| Field | Type | Present | Description |
|---|---|---|---|
| platform | one of 32 strings | always | |
| id | string | null | always | Identifier for the posting. Where the source shows none, this is the posting URL. |
| title | string | null | always | |
| company | string | null | always | |
| location | string | null | always | |
| via | string | null | always | The job board the posting was listed through, as in "via LinkedIn". |
| description | string | null | always | Snippet of the job description shown with the result. |
| url | string | null | always | |
| tags | string[] | always | |
| postedAt | string | null | always | |
| fetchedAt | string | always | When this record was retrieved, as an ISO 8601 timestamp. |
NewsArticle
9 fields| Field | Type | Present | Description |
|---|---|---|---|
| platform | one of 32 strings | always | |
| position | number | null | always | Rank of the article in the results, starting at 1. |
| title | string | null | always | |
| source | string | null | always | Name of the outlet that published the article. |
| description | string | null | always | Snippet of the article shown with the result. |
| link | string | null | always | |
| thumbnailUrl | string | null | always | |
| publishedAt | string | null | always | When the article was published, as the result displays it. Often relative, such as "2 hours ago", and not converted to a date. |
| fetchedAt | string | always | When this record was retrieved, as an ISO 8601 timestamp. |
Offer
10 fields| Field | Type | Present | Description |
|---|---|---|---|
| sellerName | string | null | always | |
| sellerId | string | null | always | |
| price | number | null | always | Price of the item in this offer, in `currency`. Shipping is separate, in `shippingPrice`. |
| currency | string | null | always | ISO 4217 currency code for the amounts in this record, such as USD or EUR. |
| shippingPrice | number | null | always | Shipping cost in `currency`. 0 when shipping is free. |
| condition | string | null | always | Item condition as the offer states it, such as New or Used - Like New. |
| isPrime | boolean | null | always | True when the offer shows a Prime badge. An offer without the badge is null, not false. |
| fulfilledByPlatform | boolean | null | always | Whether the marketplace itself fulfils the order, as with Fulfilled by Amazon. |
| isBuyBox | boolean | null | always | Whether this is the featured offer the product page sells by default. Null where the marketplace has no featured offer or did not say. |
| shipsFrom | string | null | always | The party the item ships from, as the offer names it. |
Place
16 fields| Field | Type | Present | Description |
|---|---|---|---|
| platform | one of 32 strings | always | |
| id | string | null | always | |
| name | string | null | always | |
| address | Address | always | |
| latitude | number | null | always | |
| longitude | number | null | always | |
| phone | string | null | always | |
| website | string | null | always | The business's own website. |
| url | string | null | always | Link to the place's listing on the map service. |
| rating | number | null | always | Average star rating, out of 5. |
| reviewCount | number | null | always | |
| priceLevel | string | null | always | Price band as the listing shows it, such as `$` or `$$`. The scale varies by locale. |
| categories | string[] | always | |
| hours | Record<string, string[]> | always | Opening hours keyed by lowercase weekday, such as `monday`. Each value is the hours text as the listing published it. |
| imageUrls | string[] | always | |
| fetchedAt | string | always | When this record was retrieved, as an ISO 8601 timestamp. |
PriceEvent
5 fields| Field | Type | Present | Description |
|---|---|---|---|
| date | string | null | always | When the event happened, in ISO 8601 format. |
| price | number | null | always | Price at this event, in `currency`. |
| currency | string | null | always | ISO 4217 currency code for the amounts in this record, such as USD or EUR. |
| event | string | null | always | What happened, as the source words it, such as Listed, Price Changed or Sold. |
| source | string | null | always | Where the event was recorded, such as a listing service or public records. |
ProductReview
10 fields| Field | Type | Present | Description |
|---|---|---|---|
| id | string | null | always | |
| rating | number | null | always | Star rating the reviewer gave, out of 5. |
| title | string | null | always | |
| text | string | null | always | |
| author | string | null | always | |
| publishedAt | string | null | always | When the review was posted: an ISO 8601 timestamp where the date could be read, otherwise the date text as the marketplace shows it. |
| helpfulCount | number | null | always | Number of people who marked the review helpful. |
| negativeCount | number | null | always | Number of people who marked the review unhelpful. |
| verifiedPurchase | boolean | null | always | |
| badges | string[] | always | Labels the marketplace shows on the review, such as Verified Purchase. |
RealEstateAgent
16 fields| Field | Type | Present | Description |
|---|---|---|---|
| platform | one of 32 strings | always | |
| id | string | null | always | |
| name | string | null | always | |
| url | string | null | always | |
| photoUrl | string | null | always | |
| brokerageName | string | null | always | |
| licenseNumber | string | null | always | |
| phone | string | null | always | |
| bio | string | null | always | |
| languages | string[] | always | |
| serviceAreas | string[] | always | |
| rating | number | null | always | |
| reviewCount | number | null | always | |
| salesStats | AgentStat[] | always | Sales figures the source publishes for the agent, such as deals closed or average days on market. Which figures appear varies by source. |
| listings | PropertyListing[] | always | Property listings shown on the agent's profile. |
| fetchedAt | string | always | When this record was retrieved, as an ISO 8601 timestamp. |
School
5 fields| Field | Type | Present | Description |
|---|---|---|---|
| name | string | null | always | |
| rating | number | null | always | School rating on a scale of 1 to 10. |
| gradeRange | string | null | always | |
| distanceKm | number | null | always | |
| institutionType | string | null | always |
SearchResultItem
16 fields| Field | Type | Present | Description |
|---|---|---|---|
| platform | one of 32 strings | always | |
| position | number | null | always | Rank of the result on the page it was read from, starting at 1, in the order the source served it. |
| id | string | null | always | The listing id on its platform, such as an Amazon ASIN. Where the source shows no id, this is the result URL, or the title when there is no URL. |
| title | string | null | always | |
| url | string | null | always | |
| thumbnailUrl | string | null | always | |
| price | number | null | always | Price shown on the result, in `currency`. Where a price range is shown, the lowest price. |
| currency | string | null | always | ISO 4217 currency code for the amounts in this record, such as USD or EUR. |
| listPrice | number | null | always | The struck-through reference price shown on the result, when there is one. |
| rating | number | null | always | Average customer rating, out of 5. |
| reviewCount | number | null | always | |
| sellerName | string | null | always | |
| availability | in_stock | out_of_stock | preorder | discontinued | unknown | null | always | Stock status. `unknown` means the listing showed a status that could not be read as one of the other values. |
| badges | string[] | always | Labels shown on the result, such as Best Seller or Amazon's Choice. |
| isSponsored | boolean | null | always | True for a paid placement. False only where the source marks a result as not sponsored; a result with no sponsored label is null. |
| fetchedAt | string | always | When this record was retrieved, as an ISO 8601 timestamp. |