AppBoard API
A free REST API for product discovery. Search the board, pull community-ranked results, and read structured data on categories, use cases, platforms, audiences and pricing. Authenticate with a free key you create in one click.
Quick start
Set APPBOARD_API_KEY to your key and run any of these.
curl -H "X-AppBoard-Api-Key: $APPBOARD_API_KEY" \
"https://api.appboard.pro/api/v1/products?limit=5"curl -H "X-AppBoard-Api-Key: $APPBOARD_API_KEY" \
"https://api.appboard.pro/api/v1/trending?period=week&limit=5"curl -H "X-AppBoard-Api-Key: $APPBOARD_API_KEY" \
"https://api.appboard.pro/api/v1/products?category=ai&platform=web"curl -H "X-AppBoard-Api-Key: $APPBOARD_API_KEY" \
"https://api.appboard.pro/api/v1/categories"Authentication
Every request needs a free API key, sent in the X-AppBoard-Api-Key header. There is no query-parameter fallback and no Authorization header: an AppBoard key is not a session token, and a key in a URL leaks into access logs, browser history and referrers.
Create a key
Free and instant, up to 5 active keys per account so you can rotate them or keep one per project. The key is shown once — we store only a hash. Revoking takes effect on the next request.
Requests without a valid key are rejected with 401.
{
"status": "error",
"message": "this endpoint requires a free AppBoard API key — send it in the X-AppBoard-Api-Key header"
}Rate limits
Two tiers per key. Every response carries the headers below, on success as well as on rejection, so you can back off before you are blocked.
Response headers
X-RateLimit-Limit | The limit for whichever tier is closest to exhaustion |
X-RateLimit-Remaining | Requests left in that tier |
X-RateLimit-Reset | Unix time when that tier refills |
Exceeding a tier returns 429 with a Retry-After header. A rejected request does not consume quota.
Endpoints
All endpoints are GET, return JSON, and are CORS-enabled. v1 is read-only.
| Endpoint | Description |
|---|---|
GET/api/v1/products | Search and filter products, ranked by community engagement |
GET/api/v1/trending | Products gaining momentum, defaulting to the last week |
GET/api/v1/categories | List every category |
GET/api/v1/use-cases | List every use case |
GET/api/v1/platforms | List every platform |
GET/api/v1/audiences | List every target audience |
GET/api/v1/pricing-models | List every pricing model |
Query parameters
Filters take taxonomy names — the name values from the vocabulary endpoints — not ids. An unknown name returns 400 rather than an empty list, so a typo can't look like "no results".
| Parameter | Values | Meaning |
|---|---|---|
period | today · yesterday · week · month · all | Time window the ranking is computed over |
limit | 1–100 (default 20) | How many products to return (max 100) |
offset | 0+ | Skip this many results, for paging |
category | comma-separated names | Comma-separated category names |
use_case | comma-separated names | Comma-separated use-case names |
platform | comma-separated names | Comma-separated platform names |
audience | comma-separated names | Comma-separated audience names |
pricing | comma-separated names | Comma-separated pricing-model names |
Response shape
Every endpoint returns the payload under data, with paging and the effective query echoed under meta. Product links carry AppBoard referral parameters — that attribution is why the API is free.
{
"data": [
{
"slug": "loan-tools",
"name": "Loan Tools",
"tagline": "Mortgage calculator that shows the math behind your payments",
"url": "https://loan.tools?utm_source=appboard.pro&ref=appboard.pro",
"appboardUrl": "https://appboard.pro/product/loan-tools",
"logoUrl": "https://api.appboard.pro/api/product/<uuid>/logo",
"categories": ["finance"],
"useCases": ["financial-planning"],
"audiences": ["home-owners"],
"platforms": ["web"],
"pricing": "free",
"community": {
"score": 42,
"upvotes": 2,
"comments": 1,
"follows": 0,
"saves": 0,
"rating": "0.0"
},
"creator": {
"username": "quceca_6897",
"reputation": 12,
"url": "https://appboard.pro/creator/quceca_6897"
},
"promoted": false,
"createdAt": "2026-08-02T10:12:00Z"
}
],
"meta": { "count": 1, "limit": 20, "offset": 0, "period": "all" }
}