Docs
Ctrl+K Rechercher Alt+[Alt+] Guides
Obtenir une clé API

API

Landers

Découvrir landing pages from the Premium Explorer library — same data as /landers in the dashboard. POST /api/v1/landers/explore accepts an API key and costs 1 crédit per call.

JSON body or form fields; query string params are merged in as fallbacks.

PUBLICATION/api/v1/landers/explore

Search landing pages with filters matching the Landers explorer table.

Send Clé X-API on every request.

Body parameters

  • pageinteger

    1-based page.

    Default: 1
  • pageSizeinteger

    Rows per page; max 250.

    Default: 10
  • sortingKeystring

    e.g. relevant, landers_ad_volume, monthly_visits, store_revenue.

    Default: relevant
  • sortingDirectionstring
    Default: descValues: asc desc
  • rechercherstring

    General search term.

  • landersAdvertiserstring

    Filter by advertiser / page name.

  • landersUrlstring

    Filter by landing URL fragment.

  • landersNichestring
  • landersPageTypestring

    product, collection, homepage, …

  • landersAdVolumestring
  • landersRunningTimestring
  • landersMonthlyVisitsstring
  • landersMonthlyRevenuestring
  • paysstring
    Default: Tous
Demande
curl -sS \
  -X POST \
  -H "X-API-Key: $WH_API_KEY" \
  -H "Content-Type: application/json" \
  "{origin}/api/v1/landers/explore" \
  -d '{"page":1,"pageSize":10,"sortingKey":"relevant","sortingDirection":"desc","search":"string","landersAdvertiser":"string","landersUrl":"string","landersNiche":"string","landersPageType":"string","landersAdVolume":"string","landersRunningTime":"string","landersMonthlyVisits":"string","landersMonthlyRevenue":"string","country":"All"}'
const res = await fetch(`${ORIGIN}/api/v1/landers/explore`, {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.WH_API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "page": 1,
      "pageSize": 10,
      "sortingKey": "relevant",
      "sortingDirection": "desc",
      "search": "string",
      "landersAdvertiser": "string",
      "landersUrl": "string",
      "landersNiche": "string",
      "landersPageType": "string",
      "landersAdVolume": "string",
      "landersRunningTime": "string",
      "landersMonthlyVisits": "string",
      "landersMonthlyRevenue": "string",
      "country": "All"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    f"{ORIGIN}/api/v1/landers/explore",
    headers={"X-API-Key": os.environ["WH_API_KEY"]},
    json={
        "page": 1,
        "pageSize": 10,
        "sortingKey": "relevant",
        "sortingDirection": "desc",
        "search": "string",
        "landersAdvertiser": "string",
        "landersUrl": "string",
        "landersNiche": "string",
        "landersPageType": "string",
        "landersAdVolume": "string",
        "landersRunningTime": "string",
        "landersMonthlyVisits": "string",
        "landersMonthlyRevenue": "string",
        "country": "All"
    },
)
data = res.json()
Response
{
    "data": [
        {
            "lander_key": "im8health.com/pages/drjames",
            "url": "https://im8health.com/pages/drjames",
            "url_host": "im8health.com",
            "url_path": "/pages/drjames",
            "page_type": "nofunnels",
            "primary_niche": "Health",
            "primary_niche_code": "HT",
            "advertiser_names": [
                "Dr. James DiNicolantonio"
            ],
            "advertiser_count": 1,
            "advertisers": [
                {
                    "page_id": "300483420412645",
                    "name": "Dr. James DiNicolantonio",
                    "ads_to_lander": 52,
                    "total_active_ads_on_page": 51,
                    "total_active_ads_on_page_growth_1w": 59,
                    "page_like_count": 179230,
                    "ig_followers": 3744626
                }
            ],
            "active_ad_count": 52,
            "active_ad_count_30d": 52,
            "running_days": 10,
            "niche_codes": [
                "HT",
                "SP"
            ],
            "niches": [
                "Health",
                "Supplements"
            ],
            "countries": [
                "US"
            ],
            "first_seen_at": "2026-08-15T15:57:56+00:00",
            "last_seen_at": "2026-08-25T00:00:00+00:00"
        }
    ],
    "total": 1240,
    "facets": [],
    "credits": null,
    "credits_unlimited": true,
    "cpm": 11
}
{
    "success": false,
    "error": "Unauthorized"
}
{
    "success": false,
    "error": "No API credits remaining. Buy an add-on pack or wait until next monthly reset."
}

générique est le Premium Explorer (Landers) pool — pas programmatic API credits. On Standard it is null avec credits_unlimited: true (legacy DB sentinel -1 is normalized away). Basic plans see a non-negative integer. Every /api/v1/landers/* call still costs 1 programmatic credit. The 200 body has no top-level success.

facets is always [] on this route today (unused). Rows include advertiser rollups, niche codes, country mixes, and many more ES fields. explore_wlads_ads is omitted unless Meta ad previews were requested/hydrated.

EU reach/spend filters and tracked-brand rules use the same POST field names as the dashboard (landersReachMin, landersSpendMax, landersTrackedBrandsRules, age/gender share fields, etc.).

Favorites

List and toggle starred landers. Each call costs 1 API credit.

OBTENIR/api/v1/landers/favorites

List the authenticated user's saved lander favorites.

Send Clé X-API on every request.
Demande
curl -sS \
  -H "X-API-Key: $WH_API_KEY" \
  "{origin}/api/v1/landers/favorites"
const res = await fetch(`${ORIGIN}/api/v1/landers/favorites`, {
  method: 'GET',
  headers: {
    'X-API-Key': process.env.WH_API_KEY,
  },
});
const data = await res.json();
import os, requests

res = requests.get(
    f"{ORIGIN}/api/v1/landers/favorites",
    headers={"X-API-Key": os.environ["WH_API_KEY"]},
)
data = res.json()
Response
{
    "success": true,
    "data": [
        {
            "id": 42,
            "userid": "user_abc",
            "lander_key": "glowbeautyco.com/products/vitamin-c-serum",
            "lander_url": "https://glowbeautyco.com/products/vitamin-c-serum",
            "advertiser_name": "Glow Beauty Co.",
            "entity_data": null,
            "created_at": "2026-03-14 12:00:00",
            "updated_at": "2026-03-14 12:00:00"
        }
    ]
}
PUBLICATION/api/v1/landers/favorites/toggle

Add or remove a lander favorite.

Send Clé X-API on every request.

Body parameters

  • lander_keystringrequired
  • lander_urlstring
  • advertiser_namestring
  • entity_dataobject
Demande
curl -sS \
  -X POST \
  -H "X-API-Key: $WH_API_KEY" \
  -H "Content-Type: application/json" \
  "{origin}/api/v1/landers/favorites/toggle" \
  -d '{"lander_key":"string","lander_url":"string","advertiser_name":"string","entity_data":"string"}'
const res = await fetch(`${ORIGIN}/api/v1/landers/favorites/toggle`, {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.WH_API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "lander_key": "string",
      "lander_url": "string",
      "advertiser_name": "string",
      "entity_data": "string"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    f"{ORIGIN}/api/v1/landers/favorites/toggle",
    headers={"X-API-Key": os.environ["WH_API_KEY"]},
    json={
        "lander_key": "string",
        "lander_url": "string",
        "advertiser_name": "string",
        "entity_data": "string"
    },
)
data = res.json()
Response
{
    "success": true,
    "action": "added",
    "is_favorite": true
}
{
    "success": false,
    "error": "missing_required_fields"
}

Related routes (session-only)

Method Chemin Remarques
PUBLICATION /api/shops/explore Shop browse (distinct from metered POST /api/v1/store-explorer)
OBTENIR /api/landers/filter-bootstrap Facet options for dashboard UI
OBTENIR /api/lander/overview Single lander overview fragment