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:
- 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.
- 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. - Transcribes the video with sentence timestamps.
- 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.