API Reference
A read-only, versioned API for credit-card benefits — every field carries provenance, a confidence score, and a last-verified date.
Quickstart
1. Create a free account and key at /developers.
2. Send your key as the X-API-Key header:
curl "https://api.cardperksapi.com/api/v1/cards?limit=5" \ -H "X-API-Key: pk_live_xxx.xxxxxxxx"
Try it now
Run live requests against the API right here, pre-loaded with a public read-only demo key. Pick an endpoint, tweak the params, and hit Send.
Code snippets
Drop-in examples in your language of choice. Replace the placeholder key with your own from the developer dashboard.
curl "https://cardperksapi.com/api/v1/cards?limit=5" \ -H "X-API-Key: pk_live_xxx.xxxxxxxx"
Authentication
All /api/v1 requests require a valid API key in the X-API-Key header. Keys are shown once at creation — store them securely. Revoke and rotate keys anytime from your dashboard.
Rate limits
Limits are per-key, per-minute, by plan: Developer 60/min · Growth 300/min · Enterprise 2,000/min. Exceeding your limit returns 429.
Endpoints
GET /api/v1/cards — list cards (search, issuer, network, type, limit, offset)
GET /api/v1/cards/{id} — card with benefits, grouped by category + a value_estimate_total
GET /api/v1/benefits — query benefits across all cards by type + DEEP attributes
GET /api/v1/taxonomy — the 6 categories + subcategories
GET /api/v1/types — the 9 benefit types + the fields each carries
POST /api/v1/benefits/{id}/report — flag an inaccurate perk (we re-verify it)
POST /api/v1/cards/{id}/report — flag a card-level issue (wrong fee, missing perk)
GET /api/v1/reports/{id} — poll a report's status to close the loop with your user
Report bad data from your own app
Drop a "report this perk" control in your UI. Reports lower our confidence, trigger re-verification, and escalate when several agree — so the data you rely on keeps getting more accurate.
# Flag a perk you believe is wrong
curl -X POST "https://api.cardperksapi.com/api/v1/benefits/{benefit_id}/report" \
-H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"reason":"Travel credit is now $325, not $300","evidence_url":"https://issuer.com/terms"}'
# -> { "report_id": "...", "status": "open", "escalated": false }// JS helper — wire a "report this perk" button in your own app
async function reportPerk(benefitId, reason, evidenceUrl) {
const res = await fetch(
`https://api.cardperksapi.com/api/v1/benefits/${benefitId}/report`,
{ method: "POST",
headers: { "X-API-Key": KEY, "Content-Type": "application/json" },
body: JSON.stringify({ reason, evidence_url: evidenceUrl }) });
return res.json(); // { report_id, status, escalated }
}Deep attribute filters on /v1/benefits
Filter all the way down into a benefit's structure:
# Cell-phone protection: deductible <= $50, cap >= $800 GET /api/v1/benefits?type=protection&max_deductible=50&min_coverage=800 # Monthly auto-triggered credits worth more than $15 GET /api/v1/benefits?type=credit&reset_cadence=monthly&min_value=15 # Priority Pass lounge access with a 2-guest policy GET /api/v1/benefits?type=access&provider_network=Priority%20Pass # Trip insurance that pays at least $500 GET /api/v1/benefits?type=insurance&min_coverage=500
Params: type, category, subcategory, card_id, issuer, enrollment_required, reset_cadence, min_value, max_value, provider_network, covered_event, max_deductible, min_coverage, search, limit, offset.
Benefit types & taxonomy
Every benefit is one atomic row with exactly one type. Bundles are decomposed — "airline benefits" becomes a credit (fee credit) + a perk (free bag) + a status (fast-track). The type determines which fields live in attributes.
Six categories organize the taxonomy: Travel · Shopping & Purchases · Rewards & Earning · Everyday & Lifestyle Credits · Services & Experiences · Card Terms & Fees. Fetch the live list from /v1/taxonomy.
Response fields
Each benefit is a typed object: shared fields up top, type-specific depth in attributes, and full provenance (a verbatim citation + source):
{
"title": "Cell Phone Protection",
"type": "protection",
"category": "shopping",
"subcategory": "Cell phone protection",
"value_estimate": null,
"enrollment_required": false,
"attributes": {
"coverage_limit_per_claim": 800,
"deductible": 50,
"annual_cap": 1600,
"max_claims_per_year": 2,
"covered_events": ["damage", "theft"],
"eligibility": "Pay your monthly wireless bill with the card",
"claim_window_days": 60
},
"confidence": 0.94,
"verified": true,
"needs_review": false,
"citation": "...up to $800 per claim, with a maximum of 2 approved claims per 12-month period, subject to a $50 deductible...",
"source": {
"document": "Amex Platinum Guide to Benefits — Cell Phone Protection",
"url": "https://...platinum-card-guide-to-benefits.pdf",
"section": "Cell Phone Protection"
},
"last_verified_at": "2026-06-21T00:00:00Z"
}How we verify the data
Card Perks API is not a scraped list — it's a verification engine. Here's exactly how a perk earns its place in the database: