HookGet Open dashboard

TikTok Ads → HookGet

HookGet reads TikTok Ads's reporting API on a schedule and turns it into normalised events on the same pipeline as everything else you deliver.

In short

  • Reads the integrated report endpoint per advertiser with an access token in the Access-Token header.
  • One event per settled day, same shape as the Meta source — spend_cents, impressions, clicks, reach — so one filter covers both networks.
  • TikTok answers HTTP 200 even for auth failures; the connector reads the envelope’s real status code, so a dead token reports auth_failed health, not silence.
  • Every TikTok metric arrives as a string; they become real numbers here.

What it produces

Read from the APIBecomesData
One settled day of the advertiserad.spend_reportedspend_cents, impressions, clicks, reach

Set up

# TikTok Ads Manager -> tools -> API access: create an app, authorize the advertiser
curl -X POST https://api.hookget.com/v1/sources \
  -H "authorization: Bearer $HOOKGET_KEY" \
  -d '{"provider":"tiktok-ads",
       "secret":"<access token>",
       "config":{"advertiser_id":"7012345678901"}}'
One scheduled sync of a pull source The scheduler claims a due source, fetches from the provider's API with the saved cursor, normalises the response into events, and stores them. Only when the sync succeeds does the cursor advance. A failure keeps the old cursor and retries with a growing backoff; after twenty consecutive failures the source pauses and reports its health. Due interval passed Fetch from the saved cursor Normalise dedupe on provider ids Stored, cursor advances only on success — never mid-failure Failure: old cursor kept backoff doubles · 20 strikes → paused, health says why
The two rules that make polling safe: the cursor advances only on success (a partial read never silently skips events — re-reads deduplicate for free), and a failing credential backs off and eventually pauses instead of hammering the provider in your name.

Stated plainly

The reporting endpoint returns advertiser-level dailies and does not return the account currency, so unlike the Meta source no currency attribute is invented here — an attribute we cannot verify is an attribute we do not emit. Spend is converted to cents from whole units, matching every other money metric in the product.

Questions

Why do failures show up as health instead of errors in my logs?

Because a scheduled reader’s failures belong on the source, where you can see and act on them: the source records auth_failed or rate_limited with the provider’s own message, backs off, and pauses after repeated failures.