API Documentation
Integrate AdScan ad tracking, boards, and company intelligence into your applications.
Authentication
All requests require an API key sent via the Authorization header:
Authorization: Bearer adscan_live_your_api_key_here
Create and manage API keys below or from the API Keys page in your dashboard.
Your API Keys
Base URL
https://adscan.ai/api/v1/trpc
All endpoint paths below are appended to this base URL.
Making Requests
AdScan uses the tRPC protocol. Each procedure is available at:
/api/v1/trpc/<router>.<procedure>
Encoding
Both raw JSON and {"json": { ... }}-wrapped input are accepted on all endpoints. The examples below use raw JSON for brevity.
Queries (read data)
Use GET with your parameters JSON-encoded in the input query parameter:
# No parameters
GET /api/v1/trpc/boards.list
Authorization: Bearer adscan_live_...
# With parameters (URL-encode the JSON)
GET /api/v1/trpc/brandSpy.getOverview?input={"companyName":"nike.com"}
Authorization: Bearer adscan_live_...Mutations (write data)
Use POST with a JSON body:
POST /api/v1/trpc/boards.create
Authorization: Bearer adscan_live_...
Content-Type: application/json
{ "name": "My Board" }Endpoints
Boards
boards.listList all your boardsboards.createCreate a new boardboards.updateUpdate board name or orderboards.removeDelete a boardboards.updateSlugSet a custom URL slugboards.updateDescriptionUpdate board descriptionboards.togglePublicMake a board public or privateboards.checkSlugAvailabilityCheck if a slug is availableAds (Saved)
ads.listSearch and filter your saved ads (ads you've saved to boards via the extension or API). For discovering new ads, use brandSpy endpoints.ads.getDetailsGet full ad details by hashads.addToBoardSave an ad to a boardads.removeFromBoardRemove an ad from a boardads.deletePermanently delete an adads.listBoardsContainingFind which boards contain an adads.getFilterValuesGet available filter optionsads.listTopCompaniesSearch advertisers by name to find the exact company name for brandSpy queriesads.getClonePayloadGet AI clone payload for an adCompanies
companies.followFollow a company for notificationscompanies.unfollowUnfollow a companycompanies.listFollowedList companies you followcompanies.isFollowingCheck if you follow a companyBrand Spy (Ad Discovery & Competitor Intelligence)
brandSpy.listTopAdvertisersDiscover top advertisers globally ranked by reach. Accepts optional search and limit params.brandSpy.getOverviewFull competitor overview: stats, demographics, media breakdown, top ads, and landing pagesbrandSpy.getAdCopiesRanked ad copy texts with performance scores, reach, and run durationbrandSpy.getHeadlinesRanked headlines with performance scores (same filters as getAdCopies)brandSpy.getLandingPagesLanding page distribution — which URLs a competitor drives traffic tobrandSpy.getTimelineAd launch timeline with thumbnailsbrandSpy.getHeaderBrand header info (logo, name, total ads, total reach)Notifications
notifications.listList your notificationsnotifications.unreadCountGet unread notification countnotifications.markReadMark notifications as readnotifications.listRulesList notification rulesnotifications.upsertRuleCreate or update a notification rulenotifications.deleteRuleDelete a notification ruleTeams
teams.listList your teamsteams.getGet team detailsteams.createCreate a new teamteams.updateUpdate team settingsteams.deleteDelete a teamteams.listMembersList team membersteams.inviteByEmailInvite a user by emailteams.removeMemberRemove a team memberAPI Keys
apiKeys.listList your API keysapiKeys.createCreate a new API keyapiKeys.revokeRevoke an API keyAI Images
aiImages.listList your generated AI imagesaiImages.deleteDelete a generated imageClone Products
cloneProducts.listList your productscloneProducts.getGet a specific productcloneProducts.createCreate a new productcloneProducts.updateUpdate a productcloneProducts.deleteDelete a productcloneProducts.setDefaultSet a product as defaultcloneProducts.inspectWebsiteInspect a website for product infoBrand Images
brandImages.listList your brand assetsbrandImages.deleteDelete a brand assetBrand Spy (Ad Discovery & Competitor Research)
The brandSpy.* endpoints let you discover ads and analyze competitors across the entire AdScan database. Unlike ads.list(which only returns ads you've saved), Brand Spy gives you access to all indexed ads.
Company name must match stored name
Brand Spy matching is case-insensitive but must match the stored advertiser name (e.g. "madgicx.com" works but "Madgicx" is a different advertiser with fewer ads). Use ads.listTopCompanies first to find the correct name, then pass it to Brand Spy endpoints.
# Step 1: Find the exact company name
GET /api/v1/trpc/ads.listTopCompanies?input={"name":"madgicx"}
# Returns: { "companies": [{ "name": "madgicx.com", ... }] }
# Step 2: Use the exact name for Brand Spy
GET /api/v1/trpc/brandSpy.getOverview?input={"companyName":"madgicx.com"}Brand Spy shared filters
All brandSpy.* endpoints (except listTopAdvertisers) accept these filters:
| Parameter | Type | Required | Description |
|---|---|---|---|
companyName | string | yes | Exact company name (use ads.listTopCompanies to find it) |
dateFrom | string | no | ISO date (e.g. "2025-01-01") |
dateTo | string | no | ISO date (e.g. "2025-12-31") |
status | string | no | "active", "inactive", or "all" |
mediaType | string | no | "image", "video", or "all" |
language | string | no | Language code filter |
Additional parameters by endpoint
| Endpoint | Extra params | Returns |
|---|---|---|
getOverview | (shared filters only) | Stats, demographics, media breakdown, top 5 ads, top 5 landing pages |
getAdCopies | sortBy: "adCount" | "reach" | "longestRunning" | "performanceScore", cursor, limit | Ranked ad copy texts with performance scores |
getHeadlines | Same as getAdCopies | Ranked headlines with performance scores |
getLandingPages | sortBy: "adCount" | "distribution", cursor, limit | Landing pages with ad count and traffic distribution % |
getTimeline | timeRange: "1week" | "1month" | "3months" | "6months" | "1year", cursor, limit | Timeline of ad launches with thumbnails |
getHeader | (shared filters only) | Brand name, logo, total ads, total reach |
listTopAdvertisers | limit (number), search (string) — no companyName needed | Top advertisers ranked by reach with ad counts and platforms |
Searching Saved Ads
ads.listonly returns ads you've previously saved to boards (via the Chrome extension or the ads.addToBoard API). To discover new ads across all advertisers, use the Brand Spy endpoints above.
All parameters are optional — combine them freely.
| Parameter | Type | Description |
|---|---|---|
searchQuery | string | Search ad copy, headlines, advertiser names, and landing page URLs |
boardId | number | "ALL" | Filter to a specific board, or "ALL" for all your boards |
platforms | string[] | facebook, instagram, youtube, linkedin, tiktok |
formats | string[] | video, image, carousel, dco, dpa, other |
companyNames | string[] | "FOLLOWED" | Filter by advertiser names, or "FOLLOWED" for companies you follow |
adTypes | string[] | Filter by category (use ads.getFilterValues to see available types) |
languages | string[] | Filter by language |
ctaTypes | string[] | Filter by call-to-action text (e.g. "Shop Now", "Learn More") |
isPartnership | boolean | Filter for partnership/influencer ads |
viewsMin / viewsMax | number | Filter by estimated reach range |
dateFrom / dateTo | string (ISO) | Filter by date range |
sortBy | string | recommended, date, views, likes, or comments |
limit | number | Results per page (default: 20) |
cursor | number | Pass nextCursor from previous response to get next page |
Playground
Test the ads.list endpoint live. Enter your API key, set filters, and hit Send.
curl "https://adscan.ai/api/v1/trpc/ads.list?input=%7B%22limit%22%3A5%7D" \ -H "Authorization: Bearer adscan_live_your_api_key_here"
Examples
Competitive analysis workflow
Step 1: Find the exact company name using ads.listTopCompanies.
curl 'https://adscan.ai/api/v1/trpc/ads.listTopCompanies?input={"name":"madgicx"}' \
-H "Authorization: Bearer adscan_live_your_api_key_here"
# Response includes: { "companies": [{ "name": "madgicx.com", "adCount": 322, ... }] }Step 2: Use the exact name with Brand Spy to get competitor overview.
curl 'https://adscan.ai/api/v1/trpc/brandSpy.getOverview?input={"companyName":"madgicx.com","status":"active"}' \
-H "Authorization: Bearer adscan_live_your_api_key_here"Response:
{
"result": {
"data": {
"stats": { "totalAds": 322, "totalReach": 1500000, "imageAds": 200, "videoAds": 122 },
"mediaTypeBreakdown": { "image": 62, "video": 38 },
"demographics": { "gender": [...], "country": [...] },
"topLandingPages": [{ "url": "https://madgicx.com/pricing", "adCount": 45 }],
"topAds": [{ "id": 1234, "reach": 250000, "body": "..." }]
}
}
}Get top performing ad copy
curl 'https://adscan.ai/api/v1/trpc/brandSpy.getAdCopies?input={"companyName":"madgicx.com","sortBy":"performanceScore","limit":5}' \
-H "Authorization: Bearer adscan_live_your_api_key_here"Response:
{
"result": {
"data": {
"copies": [
{
"body": "Stop wasting ad spend. Madgicx optimizes your campaigns automatically.",
"adCount": 12,
"totalReach": 800000,
"daysRunning": 90,
"performanceScore": 95.2
}
],
"total": 48,
"hasMore": true,
"nextCursor": 10
}
}
}Discover top advertisers globally
curl 'https://adscan.ai/api/v1/trpc/brandSpy.listTopAdvertisers?input={"limit":5}' \
-H "Authorization: Bearer adscan_live_your_api_key_here"Response:
{
"result": {
"data": [
{
"advertiserId": 100,
"company": "nike.com",
"adCount": 2400,
"totalViews": 50000000,
"brandLogo": "https://media.adscan.ai/...",
"platforms": ["facebook", "instagram"]
}
]
}
}List boards
curl 'https://adscan.ai/api/v1/trpc/boards.list' \ -H "Authorization: Bearer adscan_live_your_api_key_here"
Search your saved ads
ads.listsearches only ads you've saved to boards. Use searchQuery to search across ad copy, headlines, and advertiser names.
curl 'https://adscan.ai/api/v1/trpc/ads.list?input={"searchQuery":"free trial","boardId":"ALL","limit":5}' \
-H "Authorization: Bearer adscan_live_your_api_key_here"Create a board
curl -X POST "https://adscan.ai/api/v1/trpc/boards.create" \
-H "Authorization: Bearer adscan_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "name": "My New Board" }'Follow a company
curl -X POST "https://adscan.ai/api/v1/trpc/companies.follow" \
-H "Authorization: Bearer adscan_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "companyName": "Nike" }'Error Handling
The API returns standard HTTP status codes:
| Status | Meaning |
|---|---|
200 | Success |
401 | Invalid or missing API key |
403 | Not allowed to access this resource |
404 | Resource not found |
429 | Rate limit exceeded |
500 | Internal server error |
Error responses include a JSON body with an error object containing a message field.
Rate Limits
API requests are rate-limited to prevent abuse. If you exceed the limit you will receive a 429 response. Contact support if you need higher limits for your integration.
Support
Questions or issues? Reach us at [email protected]