[ API & MCP ]
Query the index from your own code or your AI assistant
A REST API and an MCP server over shops, ads, products, advertisers and captured emails, plus your own tracked stores, alerts and collections. One request is one lookup regardless of rows, no per-row credits, signed webhooks for alerts, and every response states what is measured and what is modelled.

[ Core capabilities ]
What API & MCP does
Shops, ads, products, advertisers and emails with the same presets, sorts and filters as the app; your tracked stores, alerts and collections; usage, freshness, the spec and an llms.txt guide for agents.
Endpoints and what they return
- GET /shops, /shops/{domain}
- Directory with presets and floors; one shop with twelve-month trends, top ads and top products
- GET /shops/{domain}/ads, /similar, /profile
- A page of the shop’s ads; up to 8 lookalikes with the formula score; stored storefront profile and tech stack
- GET /ads, /ads/{id}
- The Meta and TikTok library with presets, status and floors; one ad
- GET /products, /products/{id}
- The catalog with sort, source, trends, price and order floors; one product with siblings and store ads
- GET /advertisers, /advertisers/{pageId}
- The library grouped by Meta page; one page with its stores, launch series and top ads
- GET /emails, /emails/{id}
- Captured newsletter and flow emails; one email with text preview and, on request, the sanitised HTML
- GET, POST /tracked; DELETE /tracked/{domain}
- Your tracked stores with measured stats; track and untrack by domain. Free
- GET /alerts, /collections, /collections/{id}
- Your alert events newest first; your boards with their saved items. Free
- GET /me/usage, /system/freshness, /llms.txt
- Your meter; when each pipeline last ran; the agent guide. Freshness and llms.txt need no key
[ How you use it ]
API & MCP, in four steps
- 01
Create a key
Settings, General, API keys. Name it, copy it once; only a hash is kept. Up to ten active keys, revocation is immediate.
- 02
Call the API
Send the key as a Bearer token to /api/v1/shops, /ads, /products, /advertisers or /emails with the same presets and sorts the app uses. Page size up to 100, one lookup per page.
- 03
Or connect an assistant
Point Claude, ChatGPT or n8n at the MCP endpoint with the same header, or hand it /api/v1/llms.txt. The seventeen tools appear under majorka; the server tells the model to relay the measured-vs-modelled caveat.
- 04
Watch the meter and the alerts
Each data response reports used, limit and reset time; the in-app usage card shows the same number. Track stores through the API and receive their alerts as signed webhooks or poll /alerts.
[ What’s measured vs estimated ]
Every number on this surface, with where it comes from
Where there is no measurement, the product shows nothing rather than a guess. The labels below are the ones on screen.
- EstimatedDerived where the platform discloses nothing; labelled est.
- MeasuredA count or a value read from the source.
- ModelledComputed from a stated method; carries an info hint.
- Ads: reach, spendLow, spendHigh
- Estimates unless reachIsReal is true; countries is a targeting estimate unless countriesAreReal.
- Ads: firstSeen
- When Majorka first indexed the ad, not the advertiser’s launch date.
- Shops: ad counts, launches
- Counted over the index.
- Shops: reach, spendLow, spendHigh
- Sums of per-ad estimates.
- Advertisers: activeAds, inLibrary, launches
- Meta’s own running-ads count at scrape time and counts over indexed ads; reach is a sum of estimates unless reachBasis says Meta-reported.
- Emails: subject, sender, sentAt
- Read from real messages received by seed inboxes; kind, flow and promotion are rule-based labels.
- Similar shops: score
- A fixed formula over niche, shared markets and ad volume; the reasons that scored are returned with it.
- Products: name, image, price, originalPrice, variants, url, store
- Real listing data.
- Products: ordersDaily, ordersTotal, orders30d, revenue30d
- Shopify does not expose order counts.
- Freshness timestamps and row counts
- Read from each pipeline’s own state table or newest stored row.
- meta.usage
- Lookups counted from the account’s real billing-cycle start.
[ Keep going ]
Related features and free tools
- FeatureShopsA directory of Shopify stores built from the Meta ads they actually run. Sort by active ads, 30-day growth, reach or catalog size, cut it with the segments below, and open any store for the full picture.Open
- FeatureAds libraryEvery Meta ad links to its own Ad Library page. Days running, duplicates and the rank by reach sit on the card, so you read a winner from evidence, not from a badge.Open
- Free toolShopify product exporterAny public product feed as a CSV, one row per variant.Open
- Free toolCompetitor ads finderActive Meta ads for a domain, from our own index.Open
One lookup, whatever the page size and whatever the filters. There are no per-row credits, no per-filter charges and nothing to top up. Your own tracked stores, alerts and collections, the usage, freshness, spec and llms.txt calls, the MCP handshake and any failed request are free.
Sixty requests a minute per key, refilled one per second. Over it you get a 429 with Retry-After. The monthly allowance is the real ceiling and it is global.
No. Everything reads the indexed library. Live Meta or TikTok pulls and storefront scrapes stay in-app lookups; /system/freshness tells you when each pipeline last ran, and a shop nobody has opened yet reports its profile as not crawled.
Register an endpoint and secret in Settings. Each alert on a tracked store is posted once as JSON with X-Majorka-Event, X-Majorka-Delivery and an X-Majorka-Signature header carrying an HMAC-SHA256 of the raw body. The payload is documented in the OpenAPI webhooks section and in llms.txt.
Every paid plan. Accounts without an active paid plan cannot create keys and any key they hold returns 402 on every call.