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.

GET/api/v1/cards?limit=5demo key: pk_live_demo.cardperksapi

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.

credit
amount, currency, reset_cadence, trigger, eligible_merchants
insurance
coverage_limit, limit_basis, covered_events, claim_window_days, exclusions
protection
coverage_limit_per_claim, annual_cap, deductible, coverage_window_days
access
access_kind, provider_network, guest_policy, visit_limit
status
program, tier, granted_by, spend_requirement, included_benefits
earning
earn_rate, reward_unit, earn_category, spend_cap, bonus_amount
perk
entitlement, scope, limit, eligibility, estimated_value
service
service_kind, provider, availability, usage_cost, access_method
term
term_kind, amount_or_rate, duration, notes

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:

Authoritative sources first
Perks are extracted from the legal Guide-to-Benefits documents published per network tier (Visa Infinite/Signature, Mastercard World/World Elite) and per issuer — not marketing pages. These PDFs are ranked highest-trust (0.95).
Automatic source discovery
For each card, the engine resolves its network tier to the governing benefits document, validates that the document parses and matches, and attaches it. Issuer-specific docs are found via targeted, domain-restricted search.
Field-level confidence + citations
Every perk is re-expressed as a structured fact with a confidence score and a verbatim citation quoting the exact source line — so any value is auditable back to its document.
Cross-source agreement
When multiple independent sources confirm the same perk, confidence is boosted; disagreements are flagged as conflicts and held for human review rather than published.
Human-in-the-loop + freshness
High-confidence perks from authoritative documents publish automatically; fee changes, removals, and conflicts require operator approval. A background engine re-verifies cards continuously, prioritizing the ones most queried and most volatile.