Search creatives

GET /creatives — search ad creatives by filters, cursor pagination, delta feed.

GET /public/v1/creatives

Creatives matching your filters, paged with a cursor. Each returned card costs one view from the account balance. Gambling is hidden unless you ask for it explicitly: with vertical=gambling, store, app_id or webmaster.

curl -G https://app.mtwspy.com/public/v1/creatives \
  -H "Authorization: Bearer mtw_live_your_key" \
  -d geo=PL,DE -d vertical=nutra -d since=2026-07-20 -d sort=reach -d limit=50

The list includes domain, metrics and geo, but not the offer landing link or the landing archive — those are only on the card.

Parameters

Pass several values separated by commas or |; they match as "any of". Up to 50 values per parameter, 30 for category.

Filters

ParameterValues
geoISO-2 (PL, DE) or regions EUROPE, LATAM, NORTH_AMERICA, ASIA, AFRICA, OCEANIA
verticalnutra, crypto, gambling
categoryCategory slugs, listed below
formatvideo, image, carousel
genderall, male, female
platformPlacements: facebook, instagram and others
ctaButton type: SEE_DETAILS, LEARN_MORE and others
storeApp store
languageAd text language codes
offer / domainOffer name / domain
qPhrase in the ad text
urlStart of the ad button URL
fanpageFan page id (digits) or name
app_id / ipApp / landing server IP
min_reach / max_reachReach; _likes, _views, _age work the same way
published_from / published_toPublication date, YYYY-MM-DD or unix
min_active_days / max_active_daysHow many days the ad has been running: from publication to the last time it was seen, or to today if still active
sinceDate added to the database, for the delta feed
has_landing1 — only with a landing archive, 0 — only without, any — all. With vertical=nutra and no has_landing, 1 applies
webmasterWebmaster code WM-ABCD-1234, see Webmasters
aff_networkAffiliate network ids or names; any — in any network. See Affiliate networks
aff_modeany (default) — the offer is live in at least one of the networks, all — in all of them

Output

ParameterValues
sortadded (default), published, reach, reactions
limit1–200, default 50
cursormeta.next_cursor from the previous response

Category slugs

alcoholism, infertility, varicose, hair_loss, gastritis, hemorrhoids, hypertension, fungus, diabetes, vision, teeth, smoking, lungs, urination, rejuvenation, parasites, liver, digestion, potency, weight_loss, prostatitis, psoriasis, hearing, joints, breast_enlargement, penis_enlargement, cystitis.

Response

{
  "data": [
    {
      "id": 2255582,
      "uuid": "4499ba18-431e-45a6-bf60-c0a0d2e1ac77",
      "vertical": "nutra",
      "category": "hearing",
      "offer": "Otinax Max",
      "geo": "PL",
      "format": "video",
      "media": { "type": "video", "preview": "https://.../vpreview/....jpg",
                 "items": [{ "url": "https://.../creative/....mp4", "type": "video", "index": 1 }] },
      "text": null,
      "cta": "SEE_DETAILS",
      "domain": "ad-domain.com",
      "has_landing": true,
      "app_id": null,
      "platforms": "facebook, instagram, audience_network, messenger",
      "page": { "id": "100094758680183", "name": "Concrete Canvas" },
      "ad_library_id": "120249694299460433",
      "aff_networks": [{ "id": 13, "name": "Dr.Cash", "url": "https://dr.cash", "logo": "https://.../logo.png" }],
      "webmaster": {
        "code": "WM-KQZT-4821",
        "library_url": "https://app.mtwspy.com/library?webmaster=WM-KQZT-4821",
        "dossier_url": "https://app.mtwspy.com/public/v1/webmasters/WM-KQZT-4821",
        "creatives_url": "https://app.mtwspy.com/public/v1/creatives?webmaster=WM-KQZT-4821"
      },
      "metrics": { "reach": 1601, "views": 0, "likes": 0, "shares": 0, "comments": 0, "spend_usd_est": 31.72 },
      "targeting": { "gender": "all", "age_min": 25, "age_max": 65 },
      "is_active": false,
      "published_at": "2026-07-21T10:00:00+03:00",
      "stopped_at": "2026-07-24T07:00:00+03:00",
      "last_seen_at": null,
      "added_at": "2026-07-22T09:14:00+03:00"
    }
  ],
  "meta": {
    "delivered": 50,
    "has_more": true,
    "next_cursor": "eyJzIjoiYWRkZWRhdCIsInYiOjE3ODQ4NzAxMDMsImkiOjIyNTU1ODJ9",
    "sort": "added",
    "charged": 50,
    "api_limit": { "period": "2026-11", "limit": 60000, "used": 12390, "remaining": 47610, "plan": "team_api", "unit": "views" }
  }
}
FieldDescription
metrics.spend_usd_estSpend estimate based on reach, USD
aff_networksAffiliate networks where the offer is live now. Empty array — none we know of
webmasterThe ad's webmaster: code, feed in the dashboard (library_url), dossier and creatives via the API. null — no webmaster identified
meta.chargedViews charged for this request. 0 — empty result, or the same page was already requested in the last 2 hours

Cursor pagination

Pages only go in order; you can't jump to page ten. Pass meta.next_cursor as cursor until has_more is false:

const BASE = 'https://app.mtwspy.com/public/v1';
const headers = { Authorization: 'Bearer mtw_live_your_key' };

async function* all(params) {
  let cursor = null;
  do {
    const qs = new URLSearchParams({ ...params, limit: '100', ...(cursor ? { cursor } : {}) });
    const { data, meta } = await (await fetch(`${BASE}/creatives?${qs}`, { headers })).json();
    yield* data;
    cursor = meta.has_more ? meta.next_cursor : null;
  } while (cursor);
}

A cursor only works with the sort it came from. After changing sort, start again without cursor, or you'll get 422 invalid_parameter.

Delta feed (since)

since selects creatives by the date they were added to the database (added_at) — what appeared since your last check. Save the time of each check and pass it as since next time.

curl -G https://app.mtwspy.com/public/v1/creatives \
  -H "Authorization: Bearer mtw_live_your_key" \
  -d since=2026-07-27 -d vertical=nutra -d geo=PL -d limit=100

On this page