Resolve a TikTok, Instagram or YouTube Post URL to Its Data API

Takes a public post URL (TikTok video/photo, Instagram post/reel, YouTube video/short) and resolves it to the tracked post: the entry point when your input is a link. found:true returns the postId for get_post, request_transcript, download_post_media and remix_post. found:false tells you whether the whole profile is untracked (call crawl_profile) or just this post. TikTok/Instagram short links (vm.tiktok.com, /share/) must be expanded to the canonical URL first.

Turn a public TikTok, Instagram or YouTube post link into the internal post id every other skill uses. It is the entry point whenever your input is a URL a user pasted: resolve the link, get the post id, then transcribe, download, or remix it. When the post is not in the database, the response tells you exactly why (whole profile untracked, or just this post), so you know whether to crawl. Each call costs 1 credit (1 credit = $0.01).

1 credit ($0.01) per callRead-only

How to call it

POST /api/v1/posts/resolve. Authenticate with your API key. Same call in three languages:

cURL

curl -X POST "https://viraloutliers.com/api/v1/posts/resolve" \
  -H "Authorization: Bearer so_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"example"}'

Python (requests)

import requests

r = requests.post(
"https://viraloutliers.com/api/v1/posts/resolve",
    headers={"Authorization": "Bearer so_live_YOUR_KEY"},
    json={"url":"example"},
)
print(r.json())

JavaScript (fetch)

const res = await fetch("https://viraloutliers.com/api/v1/posts/resolve", {
  method: "POST",
  headers: { "Authorization": "Bearer so_live_YOUR_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({"url":"example"}),
});
const data = await res.json();
console.log(data);

Parameters

NameTypeDescription
url*stringPublic post URL (canonical form, not a short link).

What it returns

On a hit, found:true with the internal postId: the same id that get_post, request_transcript, download_post_media and remix_post all take. On a miss, found:false plus a reason that distinguishes the two cases that matter: profile_not_tracked (the whole account is unknown, so crawl_profile it) versus post_not_tracked (the profile is tracked but this specific post fell outside the crawl window).

That distinction is the point of the skill: it turns a dead-end "not found" into an actionable next step, so an agent never has to guess whether to crawl an account or just accept that one post is missing.

How it works

You pass a single canonical post URL: a TikTok video/photo link, an Instagram post/reel link, or a YouTube video/short link. The service matches it against tracked posts and returns the id or the not-found reason. It is a synchronous database lookup priced at the read tier.

One requirement: short links must be expanded first. TikTok's vm.tiktok.com and /share/ links and other shorteners are not canonical, so resolve them to the full URL before calling. From a successful resolve you branch straight into the id-based skills; from profile_not_tracked you call crawl_profile with the handle and the post arrives with the crawl.

Common use cases

Link-first flows are the whole reason it exists: a user pastes a URL into a chat, the agent resolves it, and then transcribes, pulls the media, or remixes it, with crawl_profile as the automatic fallback when the account is untracked. Bulk-import tools resolve a list of saved links into post ids before enriching them. Routing logic uses the not-found reason to decide, per link, whether a crawl is worth the credits.

Because remix_post and request_transcript also accept a url directly, resolve_post_url is most valuable when you specifically need the id up front: for caching, deduping, or deciding whether to crawl before spending on heavier skills.

vs. parsing URLs and matching posts yourself

Doing this by hand means writing a parser for each platform's several URL shapes, expanding shorteners, and then querying for a matching post and interpreting the absence, all of which drift as platforms change their link formats. And a naive "not found" tells you nothing about whether crawling would help.

resolve_post_url gives you one call that returns either the id or a precise, actionable reason, at a single credit. Compared with rolling your own URL-to-id layer, you skip the parser maintenance entirely and get the crawl-or-not decision made for you, which is the part that actually saves credits downstream.

Pricing

1 credit ($0.01) per call in prepaid credits (1 credit = $0.01). For example, 100 calls per dollar. Subscriptions include monthly credits; top-up packs start at $15. Failed asynchronous jobs are refunded automatically, and calls stop at a zero balance, never a surprise bill. See the full pricing table.

Agent workflows

  • Link-first flows: user pastes a URL → resolve → transcript/media/remix, with crawl_profile as the fallback when untracked.

Frequently asked questions

How do I get a transcript from a TikTok or Instagram URL?

Two calls: resolve_post_url with the link gives you the internal post id (and tells you if the profile needs crawling first), then request_transcript with that id queues the transcription. The finished transcript comes back on get_post.

What if the post is not in the database yet?

The response tells you which case you are in: profile_not_tracked means call crawl_profile with the handle (the post arrives with the crawl); post_not_tracked means the profile is tracked but this post fell outside the crawl window.