metrix / docs TikTok · Instagram

API · run-based · TikTok + Instagram

Hand us creators you like.
Get back creators like them.

Seed a model with 10–30 creators — TikTok or Instagram. We read what they post, find others posting the same kind of thing, and hand back a ranked list — plus the niche we inferred from your seeds.

01 How it works

You hand us a list of creators you like. We look at what they post, find creators who post the same kind of thing, and rank them. That's the whole idea.

Every request needs Authorization: Bearer <API_KEY> — any authenticated client key, not admin-only. Each route is scoped to your client and the model_id; another client's model or run returns 404, never leaks.

Platform

TikTok or Instagram. Set platform on the run — it defaults to tiktok. TikTok and Instagram runs never mix seeds or results. Instagram has one important caveat — see Instagram notes.

02 What "seeds" are

seed creators — the creators you submit. The recommendation grows out of them like seeds, so they define the taste you're targeting.

You give 10–30 of them. Ten is the floor, so there's enough signal to spot a pattern; thirty is the ceiling, so the taste stays focused instead of muddy. In the request body this list is the seed_creators field.

Better seeds mean better suggestions: pick creators that genuinely represent the lane you want more of. Your seeds themselves — and creators the model already follows — never appear in the results.

03 The run lifecycle

A run is a background job, so you don't get results instantly. POST hands you a run_id right away — a ticket. Then you poll until it's done.

ingesting_seeds
Seeds saved, validated, and queued for crawling.
waiting_for_crawls
Fetching videos for seeds we don't already hold.
scoring
Analyzing your seeds and ranking similar creators.
ready
Done — recommendations and inferred_niche are filled in.

Poll GET until status is terminal:

ready partial_ready — some seeds unusable, list still good failed — no usable seeds expired

04 Create a run

POST /api/v1/models/{model_id}/recommendations Returns 202 with a run_id and poll_url. Rate limit: 10 / minute.
# create a run from 10–30 seed handles
curl -s -X POST "https://api.metrix.ac/api/v1/models/{model_id}/recommendations" \
  -H "Authorization: Bearer $TM_API_KEY" -H "Content-Type: application/json" \
  -d '{"platform":"instagram","seed_creators":["chef.reactions","...10 to 30 handles..."],"limit":50}'
FieldTypeNotes
seed_creatorsstring[]Required. 10–30 handles. With or without leading @; case-insensitive. Duplicate spellings collapse. Invalid handles are kept and echoed as status: "invalid", never silently dropped.
platformenumOptional, default tiktok. One of tiktok, instagram. Instagram seeds are scored against Instagram data only — read the Instagram notes first.
limitintOptional, default 50, range 1–100. Max ranked results.

05 Poll a run

GET /api/v1/models/{model_id}/recommendations/{run_id} Status, seed buckets, ranked results, and the inferred niche.
curl -s "https://api.metrix.ac/api/v1/models/{model_id}/recommendations/{run_id}" \
  -H "Authorization: Bearer $TM_API_KEY"
{
  "status": "ready",
  "seed_status": { "valid": 10, "usable": 8, "empty": 1, "error": 1 },
  "inferred_niche": { "hashtags": ["cooking","recipes"], "sounds": ["7123…"] },
  "recommendations": [
    { "creator_id": "homecookhannah", "rank": 1, "score": 12.34 },
    { "creator_id": "onepanwonders",  "rank": 2, "score": 9.80 }
  ]
}

empty means the seed genuinely has no videos we can see; error means it couldn't be fetched this time and is retryable — they're kept distinct on purpose. inferred_niche is null until the run is terminal.

06 Feedback — teach the next run

Thumbs-up the good matches and thumbs-down the bad ones. This doesn't change the list you're looking at — it's memory that makes your next run smarter.

POST /api/v1/models/{model_id}/recommendations/{run_id}/feedback Returns 201. Append-only — the latest action per creator wins. No rate limit.
curl -s -X POST "https://api.metrix.ac/api/v1/models/{model_id}/recommendations/{run_id}/feedback" \
  -H "Authorization: Bearer $TM_API_KEY" -H "Content-Type: application/json" \
  -d '{"entity_id":"homecookhannah","value":"up"}'
valueEffect on your next run
upStrong boost — pushes this creator (and similar) higher.
saveMild boost.
downExcluded from ranking entirely.
hideSame — banned from future results.

An up later flipped to down resolves to down — latest wins. Feedback is remembered per model, across every future run.

07 Instagram notes

Set "platform": "instagram" on the run to seed and rank Instagram creators instead of TikTok. The flow — create → poll → feedback — and every response shape are identical; only the data source changes. Two things differ in kind:

Signal

Instagram matching is hashtag-graph similarity only. Creators are matched on the hashtags in their recent captions. On TikTok we also use shared trending sounds — the single tightest niche signal there — but cross-creator audio reuse is far rarer on Instagram, so sound overlap contributes ~nothing. Results are credible for niche placement, weaker on fine content-style affinity. (inferred_niche.sounds is usually empty for Instagram.)

Latency

Instagram seeds are crawled on demand. We don't hold a broad standing corpus of Instagram posts the way we do for TikTok, so a fresh seed's first run spends longer in waiting_for_crawls while we fetch its posts — and, for a niche no one has seeded before, briefly harvest that niche so there are creators to rank against. Poll a little longer than you would for TikTok.

Everything else is the same: the same seed_status buckets, partial_ready semantics, and feedback values all carry over unchanged.

08 What's next

Today a run starts from creator handles only — that's all the POST body accepts. Hashtags and search terms aren't seed inputs yet.

They're a natural next step — a future version could accept seed_hashtags and seed_keywords to sharpen the niche. Until then, seed with creators and lean on feedback to refine.