OverviewIntroduction

Creatives

A client's own Meta ads and creatives, read from its Airbyte data, with media, video transcripts and the same analysis competitor ads get.

Overview

Mythic reads each client's own Meta ads from the Airbyte data it already syncs: ads, creatives, videos, images and ad insights. It makes no live calls to the Meta API.

Every ad that is active, or had any spend in the last 90 days, is covered. There is no spend minimum, so new and zero-spend ads are included. For every covered ad Mythic:

  1. Stores the copy, headline, call to action, landing link, format (image, video, carousel or dynamic), carousel cards and dynamic creative variants, campaign, ad set and ad names, and 90-day spend and impressions.
  2. Copies the best available image and the video to Mythic storage, per client (never shared between clients). Meta's media links expire within days, so every sync looks for a better live version: the full image first, then the creative image, then the video still, and the small thumbnail only as a last resort (marked quality: "thumbnail"). A stored copy is never replaced by a worse or expired one.
  3. Transcribes the video with sentence timestamps.
  4. Reads the creative and its transcript with the same models and tags as Competitor Ads: hook, offer and call to action text, hook type, persuasion angle and offer tags, and the E.P.I.C. test. For a carousel the models also read the cards; for a dynamic creative, its other headlines, bodies and descriptions. These extra versions are capped at 6 entries, 600 characters each and 3,000 characters in total, so cards or variants past the cap are not read. The E.P.I.C. test reads the primary copy.

An unchanged creative is never analysed again.

The summary has the same shape as the competitor ads summary, so what a client runs compares directly with what its competitors run.

When data updates

  • Mythic-managed Airbyte connection: within 5 minutes of each successful Meta sync.
  • Legacy dataset: once a day after 09:00 UTC.
  • By hand: POST /creatives/sync, at most once every 10 minutes and 10 times per 24 hours per client.

A client with many ads is read over several passes, about 3,000 ads per pass, 5 minutes apart. POST /creatives/sync runs one pass and returns complete: false when more follow; GET /creatives/sync shows a read in progress under traversal.

An ad that is no longer active and had no spend in 90 days is marked gone when a complete read no longer finds it. A read that has not finished never marks ads as gone.

Base URL

https://mythic-analytics.gulp.workers.dev/client/v1/creatives

The same key system as the rest of /client/v1: an agency key (ak_, which must bind a location on every request with ?location_id= or the X-Location-Id header) or a location secret key (sk_, auto-scoped to its own location). An agency key that binds no location returns 400 location_required; one that names a location it is not linked to returns 403 location_not_linked.

A location secret key (sk_) can read creatives, the summary and the sync status. A manual sync needs an agency key or an mcp_ key with creative_analysis:write. Reads with an mcp_ key need creative_analysis:read.

This surface is sold by tier. If your plan does not include it, every endpoint answers 402 feature_not_in_plan — the key is valid, the tier is what is missing. GET /client/v1/agency/quota lists what your plan includes.

Creatives is part of the Pro plan.

Read creatives

curl "https://mythic-analytics.gulp.workers.dev/client/v1/creatives?location_id=LOC&status=ACTIVE&format=video" \
  -H "Authorization: Bearer ak_..."

Each creative carries spend_90d (from the sync) and spend_30d (from Mythic's ad spend copy; null with a spend_error when it could not be read). Filters: account_id, campaign_id, adset_id, status (a Meta effective_status, or gone), format, has_video, tag, epic=in_order, since, include_gone. Page with cursor.

GET /creatives/{ad_id} returns one ad by its Meta ad id, with the full analysis, the transcript and media URLs.

Media URLs are signed and valid for about an hour. Read the creative again for fresh links.

Compare with competitors

curl "https://mythic-analytics.gulp.workers.dev/client/v1/creatives/summary?location_id=LOC" -H "Authorization: Bearer ak_..."
curl "https://mythic-analytics.gulp.workers.dev/client/v1/competitor-ads/summary?location_id=LOC" -H "Authorization: Bearer ak_..."

Both return overall with the same fields: ad and active counts, formats, new ads in the last 7 and 30 days, hook type, angle and offer shares among analysed ads, the longest-running active ads, the most used hooks and offers, and E.P.I.C. aggregates. The creatives summary groups by ad account (accounts) where the competitor summary groups by page.

The E.P.I.C. test is Mythic's interpretation of Chris Rocheleau's publicly described formula. It is not yet checked against spend results.

MCP tools

get_creatives_sync, get_creatives_summary, list_creatives, get_creative and sync_creatives. See MCP tools.

Complete readiness and coverage

GET /client/v1/creatives/intelligence (get_creative_intelligence in MCP) needs creative_analysis:read and the creative_analysis plan feature, with the same location binding and privacy rules as other creatives reads. No model call or live Meta request is made.

The response contains exact counts over every stored non-gone ad, not a sample page: active/spending ads, unknown spend, missing creatives, analysis coverage, and media/transcript/analysis states with ratios. Transcript counts are eligible ads, not unique shared videos. Source Airbyte errors/freshness and Mythic traversal freshness are separate. No raw error text or credentials appear. An absent source or timestamp is unknown, not healthy. A source is confirmed healthy only when every connection is active and has synced. Partial traversals are open findings; in-progress, skipped or unknown syncs cannot confirm recovery. Normal short queues are not alarms, and retrying or incomplete stages do not confirm recovery. Analysis/transcript work older than 48 hours merits investigation; media enqueue age is not available, so pending media is not labeled stuck.

cohorts lists up to 10 account/campaign groups by ad count, reduced further to keep the complete JSON response under 10,000 characters. cohorts_total and cohorts_truncated disclose omissions. Each group has hook-type, angle, offer and format counts, known raw spend, within-cohort shares and example ad_ids. A rich campaign may retain only its highest-ad-count dimension rows, preserving at least one row per family and every unclassified gap. dimensions_total and dimensions_truncated disclose omissions; shares still use the whole campaign, not the retained rows. Ratios are rounded to six decimal places. Multi-label tag shares overlap; unclassified values are coverage gaps. A partial sync can mean incomplete upstream coverage even when stored-row counts are exact.

performance.status is currently unavailable: these snapshots have no verified ad-level outcome, campaign-objective, currency and attribution-window join. Do not calculate CPA/ROAS, claim success from spend, pool accounts/campaigns or mistake creation age for continuous runtime. Spend is a rolling 90-day source snapshot, not a daily or weekly performance series.

The opt-in Creative performance weekly scout includes coverage and next-test hypotheses in one ordinary report. The daily Creative readiness scout monitors queues and source readiness. Both are agency BYOK only and use existing Scout schedules, settings and delivery channels. See Scouts.