---
title: "Concepts"
description: "Earned and owned, AI-checked relevance, footage matching, as-of dates, and the post shape every platform shares."
url: https://docs.sonderlabs.co.uk/concepts
---

# Concepts

Earned and owned, AI-checked relevance, footage matching, as-of dates, and the post shape every platform shares.

## Earned and owned

A campaign starts with the accounts that are yours. Posts from those accounts are **owned**; posts from everyone else (fans, clip pages, creators, media) are **earned**. Sonder keeps the two apart in every total, so you can see how far a launch travelled beyond your own channels. In Sonder's dashboards, earned is always orange and owned always slate-blue.

Some accounts sit in between: talent you pay, clippers you brief. Campaign posts carry a `category` (`owned`, `talent`, `clipper` or `ugc`) so you can count them the way you report them.

## AI-checked relevance

Keyword search finds candidates; it doesn't decide what counts. Each candidate post is read (its caption, what is said in it, the text on screen, the comments under it) and judged against the campaign's description. A fan edit that never names the show still counts; a post that uses the word for something else doesn't.

- `accepted`: checked and about the campaign. Totals count these.
- `pending`: not sure either way. A person decides, one by one or in bulk.
- `rejected`: checked and not about the campaign. Kept, with a reason, in case you disagree.
- Every decision carries a one-line reason (`decisionShort`), so you can audit it.

## Footage matching

For shows and long-form video, Sonder matches clips back to the source: which of your videos a TikTok, Reel or Short was cut from, and which moment. Matching uses the clip's audio, its frames and what is said in it, against your own long-form YouTube videos. Matched moments add up to a clip heatmap: the parts of an episode people re-post most.

Footage matching runs on TikTok, Instagram and YouTube clips; Snapchat Spotlights match on speech only. See [coverage](https://docs.sonderlabs.co.uk/coverage).

## As-of dates

Social numbers move. Every post carries `asOf`, the time its stats were read; campaign totals carry `lastRefreshedAt`. When you quote a number, quote its date. Datasets on [sonderlabs.co.uk/data](https://sonderlabs.co.uk/data) are frozen at an as-of date and say so.

## Missing is not zero

Threads and Reddit don't publish views; Facebook only publishes them on videos; some Instagram posts hide them. In those cases `views` is `null` and `viewsEstimated` is `true`. Add them up as unknown, not as 0. Where a report estimates them (Reddit views from votes, for example), the estimate is labelled.

## The post

One shape for every platform. Platform pages list what each field means there.

| Field | Type | Description |
| --- | --- | --- |
| `id` | string | Sonder's id for the post. |
| `platform` | string | `tiktok`, `instagram`, `youtube`, `facebook`, `x`, `threads`, `reddit` or `snapchat`. |
| `externalId` | string | The platform's own id for the post. |
| `url` | string | The public link to the post. |
| `creator` | object | `handle`, `name` and `followers` of the account that posted it. `followers` is `null` when the platform does not show it. |
| `caption` | string | The post's text. |
| `hashtags` | string[] | Hashtags in the caption, lowercase, without the #. |
| `postedAt` | string | When it was posted (ISO 8601, UTC). |
| `durationSec` | number | Video length in seconds; 0 for text and photo posts. |
| `views` | number \| null | Views as the platform shows them. `null` means the platform does not publish a count for this post: never read it as 0. |
| `viewsEstimated` | boolean | True when `views` is missing or not the platform's own count. |
| `likes` | number | Likes, or the platform's equivalent (reactions, score, boosts: see each platform page). |
| `comments` | number | Comment or reply count. |
| `shares` | number | Shares, reshares or reposts, where the platform publishes them. |
| `transcriptExcerpt` | string \| null | The start of what is said in the video, where available. |
| `onscreenText` | string \| null | Text read from the video or its cover, pieces separated by ` \| `. |
| `asOf` | string | When these numbers were last read (ISO 8601, UTC). Every number is as of this time. |

### Campaign posts

A post inside a campaign adds what Sonder decided about it:

| Field | Type | Description |
| --- | --- | --- |
| `ownership` | string | `owned` (one of your accounts) or `earned` (anyone else). |
| `status` | string | `accepted` (checked and about your campaign), `pending` (waiting for a person to decide), `screening` or `rejected`. |
| `category` | string \| null | For accounts you work with: `owned`, `talent`, `clipper` or `ugc`. |
| `sentiment` | string \| null | `positive`, `neutral` or `negative`. |
| `decisionShort` | string | One line on why the post was accepted or rejected. |

## Public data only

Sonder APIs return public posts, public accounts and public comments: what anyone can see without signing in. Nothing needs access to anyone's account, and nothing private is returned. Audience figures are estimates about groups, never about a named person.
