Submit a creator handle for analysis, then retrieve brand-safety flags, traits,
scores, sentiment, and stats. Analyses run asynchronously and complete typically within minutes;
you are notified by a signed webhook and retrieve results by influencer_id.
https://api.katchdata.com/v1/verifiedAuthorization header. No Bearer./v1). Breaking changes ship a new version./v1
and treat unrecognized response fields as additive.Send the credential Katch supplies directly in the Authorization header:
Authorization: <partner credential>
Bearer prefix.Authorization only.401; an invalid credential returns 403.Analyses are asynchronous: you submit, Katch processes, and you collect results once they're ready. There is no job-status polling — drive completion off the webhook.
Start — or transparently reuse — an analysis for one account, or for several accounts belonging to the same influencer.
handle + platform, or an accounts array covering up to six social accounts for the same influencer (one handle per supported platform). Do not combine the two formats in one request. This is existing behavior — not a new or breaking change.| Field | Req | Description |
|---|---|---|
handle | either | Account handle, with or without @. Max 255 chars. Use with platform for a single account; omit when sending accounts. |
platform | either | instagram, tiktok, youtube, facebook, linkedin, or x. Pairs with a single top-level handle. |
accounts | either | Array of { "platform", "handle" } objects for the same influencer — up to six, one handle per supported platform. Alternative to top-level handle + platform; do not send both. |
influencer_name | opt | Display name. Defaults to the handle. Max 255. |
limit | opt | Post cap for the analysis. 1–5000, default 50. Controls how much history is analyzed (by post count, not date range). Applies per account. |
start_date | opt | Inclusive publication-date floor, formatted YYYY-MM-DD. |
end_date | opt | Inclusive publication-date ceiling, formatted YYYY-MM-DD. |
webhook_url | opt | Public HTTPS completion endpoint. Max 2048. Must resolve to a public IP; no embedded credentials. |
curl --request POST \ "https://api.katchdata.com/v1/verified/analyze" \ --header "Authorization: $KATCH_VERIFIED_API_KEY" \ --header "Content-Type: application/json" \ --data '{ "handle": "creator_handle", "platform": "instagram", "limit": 500, "webhook_url": "https://partner.example.com/hook" }'
{
"influencer_id": 123,
"influencer_name": "Creator Name",
"parent_job_id": "123e4567-…-426614174000",
"status": "queued"
}
status becomes already_queued with the existing parent_job_id.
Persist influencer_id; it's how you retrieve results later.curl --request POST \ "https://api.katchdata.com/v1/verified/analyze" \ --header "Authorization: $KATCH_VERIFIED_API_KEY" \ --header "Content-Type: application/json" \ --data '{ "accounts": [ { "platform": "instagram", "handle": "creator_instagram" }, { "platform": "tiktok", "handle": "creator_tiktok" }, { "platform": "youtube", "handle": "creator_youtube" } ], "influencer_name": "Creator Name", "limit": 50, "start_date": "2026-01-01", "end_date": "2026-06-30", "webhook_url": "https://partner.example.com/hook" }'
When an analysis completes, Katch sends a signed POST to your webhook_url.
Content-Type: application/json X-Katch-Event: analysis_finished X-Katch-Delivery: 123e4567-…-174000 X-Katch-Signature: sha256=<hex>
{
"type": "analysis_finished",
"parent_job_id": "…174000",
"influencer_id": 123,
"has_errors": false,
"count_total": 10,
"count_success": 10,
"count_fail": 0
}
2xx. Failed deliveries retry up to 10 times.parent_job_id.has_errors is true, fetch available results normally.Retrieve results for an influencer you previously submitted. The view selects the projection.
brand_name.| Parameter | Notes |
|---|---|
influencer_id | ID returned by /analyze. Preferred. One identifier required. |
handle + platform | Used when influencer_id is omitted. platform defaults to instagram. |
view | flags · traits · score · sentiment · stats. Default flags. |
brand_name | Required for view=sentiment — the brand to measure sentiment toward. Ignored by other views. Max 255. |
start_date / end_date | Inclusive YYYY-MM-DD publication date filters. |
limit / offset | Pagination for list views. limit 1–1000 (default 100); offset 0–1,000,000. |
{
"influencer_id": 123,
"view": "flags",
"count": 1,
"rows": [ … ]
}
{
"view": "score",
"analyzed_posts": 50,
"brand_safety": {"posts":4,"ratio":.08},
"sales": {"posts":12,"ratio":.24},
"video_quality": {"posts":39,"ratio":.78}
}
{
"view": "stats",
"total_posts": 50,
"earliest_post": "2025-01-15 09:30:00",
"latest_post": "2026-07-01 18:22:10",
"platform_count": 2,
"sponsored_posts": 7
}
Rows in the flags and traits views share the same shape; flags rows add a flag severity.
| Field | Type | Description |
|---|---|---|
video_id | string | Source post identifier. |
url | string | Permalink to the post. |
platform | string | instagram, tiktok, youtube, facebook, linkedin, or x. |
ut_id | integer | Universal trait id. |
universal_trait | string | Trait name (e.g. Mild Profanity). |
category / sub_category | string | Trait taxonomy. |
activation_score | number | Strength of the trait in the post. |
first_appearance | integer | Marker for where the trait first appears in the post. |
is_sponsored | boolean | Whether the post is sponsored. May be null when undetermined. |
published | datetime | YYYY-MM-DD HH:MM:SS. |
explanation | string | Why the trait was detected. |
flag | string | flags view only. Roll-up severity — Red or Yellow. |
| Field | Type | Description |
|---|---|---|
video_id | string | Source post identifier. |
url | string | Permalink to the post. |
platform | string | Post platform. |
brand | string | Brand mentioned. Pass brand_name to filter to a single brand. |
sentiment | string | positive, negative, or neutral. |
published | date | YYYY-MM-DD. |
explanation | string | Basis for the sentiment call. |
ut_id is an integer;
published (flags/traits), earliest_post, and latest_post are datetimes
(YYYY-MM-DD HH:MM:SS) while sentiment published is date-only (YYYY-MM-DD);
is_sponsored is a boolean that may be null when undetermined.List every influencer analyzed under your credential — the starting point for GET /results
when you don't already hold an influencer_id. Credential-scoped: you see only your own.
| Parameter | Notes |
|---|---|
limit | Page size. Default 50. |
offset | Row offset for pagination. Default 0. |
curl \ --header "Authorization: $KATCH_VERIFIED_API_KEY" \ "https://api.katchdata.com/v1/verified/influencers?limit=50&offset=0"
{
"count": 2,
"rows": [
{ "influencer_id": 298,
"influencer_name": "Coco Lloyd",
"created_at": "2026-07-30 04:12:08",
"last_accessed_at": "2026-07-30 04:12:08" }
]
}
Authorization
header returns 401; an invalid credential returns 403.| Code | Meaning |
|---|---|
400 | Invalid request. |
401 | Missing credential. |
403 | Invalid credential or access not allowed. |
404 | Influencer not found for your credential. |
429 | Rate limited — wait for Retry-After. |
500 / 502 | Transient — retry with backoff. |
500/502 with exponential backoff using the same body. Honor Retry-After on 429. Error bodies use {"error": "…"}.| Environment | Status |
|---|---|
Productionapi.katchdata.com/v1/verified | Available |
| Sandbox | Planned |