> ## Documentation Index
> Fetch the complete documentation index at: https://unif.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Introduction

> What Unif is, what it returns, and when to reach for it.

Unif is a commerce data API. You ask for a storefront, a product or a creator; Unif runs a
cascade across its data sources in cost order, stops at the first result that verifies, and hands
back a normalized record — the same field names, the same metric definitions and the same
currency, whichever source answered.

<Note>
  Unif is in preview. The schema described here is stable enough to build against, and any
  breaking change ships behind a new API version. See [Versioning](/docs/platform/versioning).
</Note>

## The problem it solves

Commerce data is fragmented in three directions at once, and each one costs you separately.
No single source covers everything, and the ones that cover most of it disagree about the rest.

<CardGroup cols={3}>
  <Card title="Different shapes" icon="shapes">
    One channel calls it `gmv`, another `sales_amount`, a third reports units only. Every
    integration needs its own parser.
  </Card>

  <Card title="Different definitions" icon="ruler">
    "Revenue last 30 days" can mean orders placed, orders shipped or orders net of returns.
    Numbers that look comparable are not.
  </Card>

  <Card title="Different lifespans" icon="arrows-rotate">
    Sources change their formats, throttle you, or disappear. Your pipeline breaks on their
    schedule, not yours.
  </Card>
</CardGroup>

Unif absorbs all three. You integrate once, against one schema; the cascade behind it is tuned,
re-ordered and extended without your code noticing, and adding a channel becomes a configuration
change rather than a migration.

<Card title="The waterfall" icon="layer-group" href="/docs/concepts/waterfall">
  Sources tried cheapest first, verified before they are returned, and charged only when one
  hits. This is the mechanism everything else here rests on — start there.
</Card>

## What you get back

Every response is built from six entities. They are the same six on every channel.

| Entity                                           | What it represents             | Typical use                            |
| ------------------------------------------------ | ------------------------------ | -------------------------------------- |
| [Shop](/docs/concepts/entities#shop)             | A storefront or seller         | Competitor tracking, partner vetting   |
| [Product](/docs/concepts/entities#product)       | A listing with price and sales | Assortment planning, product discovery |
| [Creator](/docs/concepts/entities#creator)       | An affiliate who drives sales  | Influencer sourcing, payout modeling   |
| [Video](/docs/concepts/entities#video)           | Shoppable short-form content   | Creative analysis, attribution         |
| [Livestream](/docs/concepts/entities#livestream) | A live selling session         | Live commerce benchmarking             |
| [Category](/docs/concepts/entities#category)     | A node in the category tree    | Market sizing, whitespace analysis     |

Each record carries the period it was measured over, the currency it is denominated in, and a
`meta` block telling you how fresh and how complete it is. Nothing is implied.

## Channels and sources

Unif exposes **channels** — `tiktok_shop` today, more later. Behind each one is a cascade of
sources, and that roster is published rather than hidden; the first TikTok Shop source is
[Kalodata](https://www.kalodata.com).

<Tip>
  Omit `channel` and your query spans every channel your workspace has enabled. Each returned
  object names its own `channel`, so you can still tell results apart.
</Tip>

What a response does not carry is which source answered that particular row. The cascade is
re-tuned as sources change, and pinning your code to one of them would turn every re-tune into a
breaking change.

What you get instead is honesty about the result. [`GET /coverage`](/docs/concepts/coverage)
reports which fields are populated for a given channel and market, how filterable they are and
how far behind they typically run — so you find out before you ship a filter, not after.

## The three things you can do

<Steps>
  <Step title="Search" icon="magnifying-glass">
    Start from filters rather than identifiers. "US beauty shops above \$100k that grew 25% this
    month" is a single [search](/docs/workflows/search) request.
  </Step>

  <Step title="Enrich" icon="wand-magic-sparkles">
    Start from rows you already have. [Resolve](/docs/workflows/enrich) URLs and handles into
    stable IDs, then pull the fields you need onto them.
  </Step>

  <Step title="Monitor" icon="bell">
    Put a set behind a [tracker](/docs/workflows/trackers). Unif re-checks on a schedule and
    posts a signed webhook when a metric crosses your threshold.
  </Step>
</Steps>

## Where to go next

<CardGroup cols={2}>
  <Card title="Quickstart" icon="rocket" href="/docs/quickstart">
    From an API key to your first enriched row, in four steps.
  </Card>

  <Card title="The waterfall" icon="layer-group" href="/docs/concepts/waterfall">
    The cascade, verification and early exit — the mechanism, in one page.
  </Card>

  <Card title="API reference" icon="code" href="/api-reference/introduction">
    All 47 endpoints, with a request playground.
  </Card>

  <Card title="Credits" icon="coins" href="/docs/platform/credits">
    What each call costs and how to spend less.
  </Card>
</CardGroup>
