curl -X POST "https://api.hooked.so/v1/social/account/analyze" \
-H "x-api-key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "username": "fitnessguru", "platform": "tiktok" }'
const response = await fetch('https://api.hooked.so/v1/social/account/analyze', {
method: 'POST',
headers: {
'x-api-key': 'your_api_key_here',
'Content-Type': 'application/json'
},
body: JSON.stringify({ username: '@fitnessguru', platform: 'tiktok' })
});
const { data } = await response.json();
console.log(data.account.id, data.account.analytics);
import requests
response = requests.post(
'https://api.hooked.so/v1/social/account/analyze',
headers={'x-api-key': 'your_api_key_here'},
json={'username': 'fitnessguru', 'platform': 'youtube'},
timeout=300
)
account = response.json()['data']['account']
print(account['id'], account['stats']['followers'])
{
"success": true,
"message": "Account analyzed successfully",
"data": {
"account": {
"id": "cm7g8h9i0j1k2l3m4n5o6p7q8",
"username": "fitnessguru",
"platform": "tiktok",
"displayName": "Fitness Guru",
"bio": "Helping you get fit one video at a time",
"avatarUrl": "https://p16-sign.tiktokcdn.com/...",
"isVerified": true,
"stats": {
"followers": 1500000,
"following": 250,
"videos": 342,
"likes": 45000000
},
"analytics": {
"engagementRate": 12.5,
"viralityScore": 78.3,
"avgViews": 890000
},
"topHashtags": [
{
"hashtag": "#fitness",
"name": "fitness",
"count": 48,
"videoCount": 48,
"totalViews": 21000000,
"avgViews": 437500,
"engagementRate": 11.2,
"trending": false,
"lastUsed": "2026-09-28T18:00:00.000Z"
}
],
"keywords": [],
"lastAnalyzed": "2026-10-01T10:30:00.000Z",
"createdAt": "2026-10-01T10:30:00.000Z",
"profileUrl": "https://www.tiktok.com/@fitnessguru"
}
}
}
{
"code": "bad_request",
"message": "Invalid input",
"errorCode": "INVALID_INPUT",
"details": { "platform": ["platform must be 'tiktok' or 'youtube'"] }
}
{
"success": false,
"errorCode": "INSUFFICIENT_CREDITS",
"message": "Not enough credits to perform this action"
}
Account Analysis
Analyze Account
Analyze a public TikTok or YouTube account and save its insights
POST
/
v1
/
social
/
account
/
analyze
curl -X POST "https://api.hooked.so/v1/social/account/analyze" \
-H "x-api-key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "username": "fitnessguru", "platform": "tiktok" }'
const response = await fetch('https://api.hooked.so/v1/social/account/analyze', {
method: 'POST',
headers: {
'x-api-key': 'your_api_key_here',
'Content-Type': 'application/json'
},
body: JSON.stringify({ username: '@fitnessguru', platform: 'tiktok' })
});
const { data } = await response.json();
console.log(data.account.id, data.account.analytics);
import requests
response = requests.post(
'https://api.hooked.so/v1/social/account/analyze',
headers={'x-api-key': 'your_api_key_here'},
json={'username': 'fitnessguru', 'platform': 'youtube'},
timeout=300
)
account = response.json()['data']['account']
print(account['id'], account['stats']['followers'])
{
"success": true,
"message": "Account analyzed successfully",
"data": {
"account": {
"id": "cm7g8h9i0j1k2l3m4n5o6p7q8",
"username": "fitnessguru",
"platform": "tiktok",
"displayName": "Fitness Guru",
"bio": "Helping you get fit one video at a time",
"avatarUrl": "https://p16-sign.tiktokcdn.com/...",
"isVerified": true,
"stats": {
"followers": 1500000,
"following": 250,
"videos": 342,
"likes": 45000000
},
"analytics": {
"engagementRate": 12.5,
"viralityScore": 78.3,
"avgViews": 890000
},
"topHashtags": [
{
"hashtag": "#fitness",
"name": "fitness",
"count": 48,
"videoCount": 48,
"totalViews": 21000000,
"avgViews": 437500,
"engagementRate": 11.2,
"trending": false,
"lastUsed": "2026-09-28T18:00:00.000Z"
}
],
"keywords": [],
"lastAnalyzed": "2026-10-01T10:30:00.000Z",
"createdAt": "2026-10-01T10:30:00.000Z",
"profileUrl": "https://www.tiktok.com/@fitnessguru"
}
}
}
{
"code": "bad_request",
"message": "Invalid input",
"errorCode": "INVALID_INPUT",
"details": { "platform": ["platform must be 'tiktok' or 'youtube'"] }
}
{
"success": false,
"errorCode": "INSUFFICIENT_CREDITS",
"message": "Not enough credits to perform this action"
}
Overview
Scrapes a public TikTok or YouTube account (profile and recent videos) and computes engagement metrics, top hashtags and more. The account is saved to your team; read it later with Account Details or List Accounts. The request waits for the scrape to finish, so it can take a while; set a generous client timeout. Keywords are generated afterwards in the background:keywords may be empty at first; check keywordsStatus in Account Details (pending, processing, completed, or failed when the keywords could not be generated).
Analyzing an account your team already analyzed runs the analysis again, updates the saved account and charges again (same id, 201). To update an existing account you can also use Refresh Account.
Credits
8 credits per call. Scraping is a platform cost, so it is charged to every team, including teams that use their own provider keys (BYOK). The credits are refunded if the scrape fails or the account is not found.curl -X POST "https://api.hooked.so/v1/social/account/analyze" \
-H "x-api-key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "username": "fitnessguru", "platform": "tiktok" }'
const response = await fetch('https://api.hooked.so/v1/social/account/analyze', {
method: 'POST',
headers: {
'x-api-key': 'your_api_key_here',
'Content-Type': 'application/json'
},
body: JSON.stringify({ username: '@fitnessguru', platform: 'tiktok' })
});
const { data } = await response.json();
console.log(data.account.id, data.account.analytics);
import requests
response = requests.post(
'https://api.hooked.so/v1/social/account/analyze',
headers={'x-api-key': 'your_api_key_here'},
json={'username': 'fitnessguru', 'platform': 'youtube'},
timeout=300
)
account = response.json()['data']['account']
print(account['id'], account['stats']['followers'])
{
"success": true,
"message": "Account analyzed successfully",
"data": {
"account": {
"id": "cm7g8h9i0j1k2l3m4n5o6p7q8",
"username": "fitnessguru",
"platform": "tiktok",
"displayName": "Fitness Guru",
"bio": "Helping you get fit one video at a time",
"avatarUrl": "https://p16-sign.tiktokcdn.com/...",
"isVerified": true,
"stats": {
"followers": 1500000,
"following": 250,
"videos": 342,
"likes": 45000000
},
"analytics": {
"engagementRate": 12.5,
"viralityScore": 78.3,
"avgViews": 890000
},
"topHashtags": [
{
"hashtag": "#fitness",
"name": "fitness",
"count": 48,
"videoCount": 48,
"totalViews": 21000000,
"avgViews": 437500,
"engagementRate": 11.2,
"trending": false,
"lastUsed": "2026-09-28T18:00:00.000Z"
}
],
"keywords": [],
"lastAnalyzed": "2026-10-01T10:30:00.000Z",
"createdAt": "2026-10-01T10:30:00.000Z",
"profileUrl": "https://www.tiktok.com/@fitnessguru"
}
}
}
{
"code": "bad_request",
"message": "Invalid input",
"errorCode": "INVALID_INPUT",
"details": { "platform": ["platform must be 'tiktok' or 'youtube'"] }
}
{
"success": false,
"errorCode": "INSUFFICIENT_CREDITS",
"message": "Not enough credits to perform this action"
}
Errors
| Status | When |
|---|---|
| 400 | username or platform invalid (message: "Invalid input", per-field details), or a body that is not valid JSON ({ "success": false, "message": "Invalid JSON body" }) |
| 401 | Missing or invalid API key (code: "not_authenticated") |
| 402 | Not enough credits (errorCode: "INSUFFICIENT_CREDITS"), or a managed team without a live subscription (code: "subscription_required"). Nothing is charged |
| 403 | The team does not have the Hooked app product (code: "entitlement_required") |
| 500 | The scrape failed, including when the platform has no such account: { "success": false, "message": "Failed to analyze account", "error": "..." } with the reason in error. Credits are refunded |
This endpoint charges credits. Send an
Idempotency-Key header to retry safely: a retry with the same key and body after a timeout returns the first answer and is not charged again.Authorizations
Headers
Makes the request safe to retry. 1-255 printable ASCII characters, one per operation (your job id, or a UUID you store), reused on every retry. Within 24 hours the same key with the same body answers with the first response and the header Idempotent-Replayed: true, without running or charging again. Keys are scoped to your team and the endpoint. 5xx answers and refusals before anything ran (401, 402, 403, 409, 429) are not kept. See Idempotency.
Required string length:
1 - 255Pattern:
^[\x20-\x7E]+$Body
application/json