curl --request POST \
--url https://api.unif.dev/v1/resolve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"inputs": [
{
"type": "shop",
"url": "https://www.tiktok.com/shop/glowlab"
},
{
"type": "creator",
"handle": "@glowbyjune",
"market": "US"
},
{
"type": "product",
"channel": "tiktok_shop",
"external_id": "1729384756102938"
}
]
}
'import requests
url = "https://api.unif.dev/v1/resolve"
payload = { "inputs": [
{
"type": "shop",
"url": "https://www.tiktok.com/shop/glowlab"
},
{
"type": "creator",
"handle": "@glowbyjune",
"market": "US"
},
{
"type": "product",
"channel": "tiktok_shop",
"external_id": "1729384756102938"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
inputs: [
{type: 'shop', url: 'https://www.tiktok.com/shop/glowlab'},
{type: 'creator', handle: '@glowbyjune', market: 'US'},
{type: 'product', channel: 'tiktok_shop', external_id: '1729384756102938'}
]
})
};
fetch('https://api.unif.dev/v1/resolve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.unif.dev/v1/resolve",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'inputs' => [
[
'type' => 'shop',
'url' => 'https://www.tiktok.com/shop/glowlab'
],
[
'type' => 'creator',
'handle' => '@glowbyjune',
'market' => 'US'
],
[
'type' => 'product',
'channel' => 'tiktok_shop',
'external_id' => '1729384756102938'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.unif.dev/v1/resolve"
payload := strings.NewReader("{\n \"inputs\": [\n {\n \"type\": \"shop\",\n \"url\": \"https://www.tiktok.com/shop/glowlab\"\n },\n {\n \"type\": \"creator\",\n \"handle\": \"@glowbyjune\",\n \"market\": \"US\"\n },\n {\n \"type\": \"product\",\n \"channel\": \"tiktok_shop\",\n \"external_id\": \"1729384756102938\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.unif.dev/v1/resolve")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"inputs\": [\n {\n \"type\": \"shop\",\n \"url\": \"https://www.tiktok.com/shop/glowlab\"\n },\n {\n \"type\": \"creator\",\n \"handle\": \"@glowbyjune\",\n \"market\": \"US\"\n },\n {\n \"type\": \"product\",\n \"channel\": \"tiktok_shop\",\n \"external_id\": \"1729384756102938\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.unif.dev/v1/resolve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"inputs\": [\n {\n \"type\": \"shop\",\n \"url\": \"https://www.tiktok.com/shop/glowlab\"\n },\n {\n \"type\": \"creator\",\n \"handle\": \"@glowbyjune\",\n \"market\": \"US\"\n },\n {\n \"type\": \"product\",\n \"channel\": \"tiktok_shop\",\n \"external_id\": \"1729384756102938\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "resolve_response",
"data": [
{
"ref": "<string>",
"status": "resolved",
"id": "<string>",
"type": "shop",
"channel": "tiktok_shop",
"market": "US",
"candidates": [
{
"id": "<string>",
"name": "<string>",
"url": "<string>"
}
]
}
],
"credits_charged": 123
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "filters.revenue.gte must be a non-negative number.",
"param": "filters.revenue.gte",
"doc_url": "https://unif.dev/docs/platform/errors#parameter_invalid",
"request_id": "req_01k3m9x7v2q8r4t6y0b1n5d7fa"
}
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Resolve identifiers to entities
Turns the identifiers you already have — a storefront URL, an @handle, a product
link, a channel-native ID — into stable Unif IDs. Resolution is the step that lets
you join Unif data onto rows you already own.
Send up to 100 inputs per request. Each input resolves independently; a failure on one does not fail the request.
curl --request POST \
--url https://api.unif.dev/v1/resolve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"inputs": [
{
"type": "shop",
"url": "https://www.tiktok.com/shop/glowlab"
},
{
"type": "creator",
"handle": "@glowbyjune",
"market": "US"
},
{
"type": "product",
"channel": "tiktok_shop",
"external_id": "1729384756102938"
}
]
}
'import requests
url = "https://api.unif.dev/v1/resolve"
payload = { "inputs": [
{
"type": "shop",
"url": "https://www.tiktok.com/shop/glowlab"
},
{
"type": "creator",
"handle": "@glowbyjune",
"market": "US"
},
{
"type": "product",
"channel": "tiktok_shop",
"external_id": "1729384756102938"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
inputs: [
{type: 'shop', url: 'https://www.tiktok.com/shop/glowlab'},
{type: 'creator', handle: '@glowbyjune', market: 'US'},
{type: 'product', channel: 'tiktok_shop', external_id: '1729384756102938'}
]
})
};
fetch('https://api.unif.dev/v1/resolve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.unif.dev/v1/resolve",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'inputs' => [
[
'type' => 'shop',
'url' => 'https://www.tiktok.com/shop/glowlab'
],
[
'type' => 'creator',
'handle' => '@glowbyjune',
'market' => 'US'
],
[
'type' => 'product',
'channel' => 'tiktok_shop',
'external_id' => '1729384756102938'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.unif.dev/v1/resolve"
payload := strings.NewReader("{\n \"inputs\": [\n {\n \"type\": \"shop\",\n \"url\": \"https://www.tiktok.com/shop/glowlab\"\n },\n {\n \"type\": \"creator\",\n \"handle\": \"@glowbyjune\",\n \"market\": \"US\"\n },\n {\n \"type\": \"product\",\n \"channel\": \"tiktok_shop\",\n \"external_id\": \"1729384756102938\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.unif.dev/v1/resolve")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"inputs\": [\n {\n \"type\": \"shop\",\n \"url\": \"https://www.tiktok.com/shop/glowlab\"\n },\n {\n \"type\": \"creator\",\n \"handle\": \"@glowbyjune\",\n \"market\": \"US\"\n },\n {\n \"type\": \"product\",\n \"channel\": \"tiktok_shop\",\n \"external_id\": \"1729384756102938\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.unif.dev/v1/resolve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"inputs\": [\n {\n \"type\": \"shop\",\n \"url\": \"https://www.tiktok.com/shop/glowlab\"\n },\n {\n \"type\": \"creator\",\n \"handle\": \"@glowbyjune\",\n \"market\": \"US\"\n },\n {\n \"type\": \"product\",\n \"channel\": \"tiktok_shop\",\n \"external_id\": \"1729384756102938\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "resolve_response",
"data": [
{
"ref": "<string>",
"status": "resolved",
"id": "<string>",
"type": "shop",
"channel": "tiktok_shop",
"market": "US",
"candidates": [
{
"id": "<string>",
"name": "<string>",
"url": "<string>"
}
]
}
],
"credits_charged": 123
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "filters.revenue.gte must be a non-negative number.",
"param": "filters.revenue.gte",
"doc_url": "https://unif.dev/docs/platform/errors#parameter_invalid",
"request_id": "req_01k3m9x7v2q8r4t6y0b1n5d7fa"
}
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Authorizations
Send your workspace API key as a bearer token:
Authorization: Bearer unif_sk_live_...
Keys are scoped to a single workspace. See Authentication.
Body
1 - 100 elementsHide child attributes
Hide child attributes
shop, product, creator, video, livestream, category A channel URL for the entity.
The channel handle
The entity's native ID on the channel.
A sales channel — the commerce surface a request is about. Behind each channel is a cascade of data sources, tried in cost order until one verifies; the roster is published, but which source answered a given row is not carried in the response, so the cascade can be re-tuned without breaking your code.
tiktok_shop "tiktok_shop"
An ISO 3166-1 alpha-2 country code identifying a channel storefront.
US, GB, IE, ES, FR, DE, IT, ID, TH, VN, MY, PH, SG, JP, BR, MX "US"
Your own identifier
Response
Resolution results, in the order the inputs were sent.
"resolve_response"Hide child attributes
Hide child attributes
ambiguous means the identifier matched more than one entity; candidates lists them.
unsupported means the channel or entity type is not enabled for your workspace.
resolved, not_found, ambiguous, unsupported The Unif ID
shop, product, creator, video, livestream, category A sales channel — the commerce surface a request is about. Behind each channel is a cascade of data sources, tried in cost order until one verifies; the roster is published, but which source answered a given row is not carried in the response, so the cascade can be re-tuned without breaking your code.
tiktok_shop "tiktok_shop"
An ISO 3166-1 alpha-2 country code identifying a channel storefront.
US, GB, IE, ES, FR, DE, IT, ID, TH, VN, MY, PH, SG, JP, BR, MX "US"
Was this page helpful?