A small, read-only JSON API over the AdSwipeFile ad library. No key and no sign-in. It shows what a signed-out visitor sees: per list, the newest 12 ads; per ad, its card (name, description, brand, niche, formats, image, page URL). For the full library and the ads' copy, use the MCP server with a free account.
The machine-readable description is https://adswipefile.com/openapi.json (OpenAPI 3.1; every operation has an operationId, so it imports as function-calling tools).
GET /api/v1/search?q={keywords}: ads, brands, niches and formats matching the keywords (2 to 64 characters), each with its page URL.GET /api/v1/ads?brand=&niche=&format=&limit=: the newest ads, optionally filtered by slugs; limit 1 to 12.GET /api/v1/ads/{id}: one ad's card.GET /api/health: { ok, buildId, startedAt }.Slugs are the last part of a page URL: https://adswipefile.com/niches/beauty is the niche beauty. Find them with search.
curl -s 'https://adswipefile.com/api/v1/search?q=protein'
curl -s 'https://adswipefile.com/api/v1/ads?niche=beauty&format=ugc&limit=5'
60 requests a minute per IP address, over a sliding window. Every response says where you stand:
RateLimit-Policy: "public";q=60;w=60
RateLimit: "public";r=59;t=42
(RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset carry the same numbers.) Past the limit the answer is 429 with Retry-After in seconds.
Every error is application/problem+json (RFC 9457), including unknown paths under /api/:
{ "type": "https://adswipefile.com/docs/api#errors", "title": "Not found", "status": 404,
"detail": "No niche with slug \"beuty\".", "code": "not_found",
"resolution": "Find slugs with /api/v1/search?q=<name>, …" }
Branch on code (one of not_found, bad_request, method_not_allowed, rate_limited, not_acceptable, service_unavailable), show detail, follow resolution.
Any page URL answers Accept: text/markdown with that page as markdown, at the same URL: curl -H 'Accept: text/markdown' https://adswipefile.com/niches. A client that accepts neither markdown nor HTML gets 406.