# TikTok profile region

Read a profile, then request its source-reported region only when the profile omits it. Each component keeps its normal price.

## Preview, then retrieve

Download the [Node.js profile-region workflow](https://www.monocrawl.com/examples/tiktok-profile-region.mjs). With Node.js 22 or newer, set `MONOCRAWL_API_KEY` and preview its maximum price:

```
node tiktok-profile-region.mjs '{"handle":"mrbeast","maxCredits":2,"estimateOnly":true}'
```

Remove `estimateOnly` to run. The workflow acquires one [profile](https://www.monocrawl.com/docs/endpoints/tiktok/profile) and at most one [region lookup](https://www.monocrawl.com/docs/endpoints/tiktok/user-region). A supplied profile region skips the second acquisition. The initial estimate covers both calls, since the profile's fields are unknown before it answers.

## Region and identity

The returned `profile.region` is a source-reported account region. It does not establish residence, nationality, travel location or audience country. A source request location is never used to fill this field.

The workflow checks for a valid string profile ID and matches the returned handle and public profile URL to the requested account before the second call. A region response must match the same handle and public URL; this endpoint does not supply a numeric account ID to compare. It fills only `region`; other profile fields, including missing `business_category`, are preserved.

`region_lookup_status` distinguishes an existing region, a matched lookup, missing data, identity mismatch and failed or unattempted retrieval. A region failure retains the acquired profile. Available categories and inline regions remain source-dependent.

## Bound spending

| Component | Current base price |
| --- | --- |
| [`tiktok/profile`](https://www.monocrawl.com/docs/endpoints/tiktok/profile) | 1 credits |
| [`tiktok/user-region`](https://www.monocrawl.com/docs/endpoints/tiktok/user-region) | Unavailable |

An insufficient `maxCredits` budget spends nothing. Every acquisition receives a fresh free price preview and an `X-Max-Credits` ceiling. Cache hits can reduce the actual charge. `maxDurationSeconds` defaults to 120 and accepts 1–180.

The ledger separates confirmed credits from `credits_reserved_unknown`. A lost paid response stops the workflow without a retry. Check account usage before another run. The profile remains charged if the separate region lookup fails.
