API Reference

Complete reference for the CardAPI REST API. Every endpoint returns JSON, and all but /v1/stats need an API key.

Try it without a key

GET /v1/cards/:slug, live, with the fields a free key returns. A few sample cards here; a free key covers the whole catalogue.

SDKs

Official SDKs are available on npm and PyPI. They handle authentication, serialization, and error handling out of the box.

JavaScript / TypeScriptnpm →
npm install @cardapi/client
Usage
import { CardAPI } from "@cardapi/client";

const client = new CardAPI({ apiKey: "your_api_key" });
const cards = await client.getCards({ country: "US" });
PythonPyPI →
pip install cardapi
Usage
from cardapi import CardAPI

client = CardAPI("your_api_key")
cards = client.get_cards(country="US")

Authentication

HEADER Authorization: Bearer <api_key>: Authenticate a request

Every endpoint except /v1/stats and /v1/auth/register needs your API key as a Bearer token. Keys start with ck_live_ and are shown once, when you create them in the portal. Each response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers for your daily quota, which every key on your account shares.

Response
// Missing or malformed key -> 401
{
  "error": {
    "code": "unauthorized",
    "message": "Missing or invalid API key"
  }
}

POST /v1/auth/register: Register by email

Start a sign-up without the website. We email a sign-in link to the address; opening it confirms the email and signs you in to the portal, where your free API key is created. No key is returned by this call, and the reply is the same whether or not the address already has an account. No API key needed. Rate limited by IP (5/hour, 10/day).

Parameters
emailstringrequiredAccount email address
Response (abridged)
{
  "status": "verification_pending",
  "message": "Check your inbox for a link from CardAPI. Open it to confirm your email and sign in to the developer portal, where your free API key is created.",
  "portal_url": "https://cardapi.dev/portal"
}

POST /v1/auth/keys: Create an API key

Create an additional API key on the same plan. Maximum 5 active keys per account.

Response (abridged)
{
  "api_key": "ck_live_..."
}

GET /v1/auth/usage: Get your usage

Your plan and your account's usage so far today and this month. Quotas are per account: the counts cover every key on the account, including keys you have revoked. This call counts toward your quota like any other.

Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/auth/usage" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "tier": "starter",
  "daily_used": 128,
  "daily_limit": 500,
  "monthly_used": 3402,
  "monthly_limit": 15000
}

POST /v1/auth/upgrade: Start a paid plan

Start a paid plan. For an account without one, this returns a Stripe Checkout URL where the cardholder completes payment (Starter starts with a 7-day free trial, once per customer). An API key never changes an existing paid plan, since that would bill the saved card: if the account already has one you get 409 use_portal. Change, cancel or update the card for a paid plan in the developer portal at cardapi.dev/portal, signed in as the account owner (or email support@cardapi.dev).

Parameters
tierstringrequiredTarget plan: starter, pro or enterprise
billingstringmonthly (default) or annual
Response (abridged)
{
  "checkout_url": "https://checkout.stripe.com/c/pay/cs_live_...",
  "updated": false,
  "trial": false
}

Cards

GET /v1/cards: List cards

List published cards, sorted by name, with reward rates, benefits, statement credits, perks and spend bonuses. Discontinued cards are left out unless include_discontinued=true. Free keys get the basic fields and top reward rates; paid plans get more fields.

Parameters
countrystringUS or CA
issuerstringIssuer slug, e.g. chase, amex-us, td (see /v1/issuers)
networkstringVISA, MC, AMEX or DISCOVER
typestringpersonal, business, student or secured
max_annual_feenumberHighest annual fee to include
no_annual_feebooleantrue for $0 annual fee cards only
credit_scoreintegerYour credit score; hides cards that need a higher one
include_discontinuedbooleantrue to include discontinued cards
limitintegerResults per page (default 20, max 100)
offsetintegerResults to skip, for paging
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/cards?country=US&issuer=amex-us" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "c2495eb2-eb53-4c4d-9bfb-6843f641f4ee",
      "slug": "american-express-gold-card",
      "name": "American Express® Gold Card",
      "issuer_id": "875b443c-1d31-48fd-a475-a9ca487e9749",
      "issuers": { "slug": "amex-us", "name": "American Express", "country": "US", "logo_url": null },
      "network": "AMEX",
      "card_type": "personal",
      "annual_fee": 325,
      "signup_bonus": "up to 100,000 Membership Rewards points",
      "reward_currency_name": "Membership Rewards",
      "is_discontinued": false,
      "reward_rates": [ ... ],
      "benefits": [ ... ],
      "updated_at": "2026-09-10T08:52:16.527+00:00"
    }
  ],
  "total": 27,
  "limit": 20,
  "offset": 0
}

GET /v1/cards/compare: Compare cards

Full details for 2-5 different cards in one response, in the order requested. A slug that matches no published card is a 404 that names it; a repeated slug is counted once; a malformed slug is a 400.

Parameters
slugsstringrequiredComma-separated card slugs (2-5 different cards)
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/cards/compare?slugs=chase-sapphire-preferred-credit-card,american-express-gold-card" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "slug": "american-express-gold-card",
      "name": "American Express® Gold Card",
      "annual_fee": 325,
      "reward_rates": [ ... ],
      "benefits": [ ... ],
      "statement_credits": [ ... ]
    },
    {
      "slug": "chase-sapphire-preferred-credit-card",
      "name": "Chase Sapphire Preferred Credit Card",
      "annual_fee": 95,
      "reward_rates": [ ... ],
      "benefits": [ ... ],
      "statement_credits": [ ... ]
    }
  ]
}

GET /v1/cards/:slug: Get a card

Full details for one card: fees, APRs, signup bonus, reward rates, benefits, statement credits, perks, spend bonuses and eligibility. A reward rate's categories (slugs from /v1/categories), merchant, booking_channel and choice_group say where it earns; its category_slug is a label built from them and unique on the card: <categories>[:<merchant>][@portal|@direct][#choice][~<tag>], for example dining, groceries+gas, airlines:united-airlines, travel@portal, dining#choice, or other for the base rate (a ~tag such as ~3x only when two rates would otherwise share a label). Protection benefits can carry a details object with structured coverage terms (for example coverage_amount, minimum_delay_hours, covered_reasons).

Parameters
slugstringrequiredCard slug, e.g. american-express-gold-card or chase-sapphire-preferred-credit-card (from /v1/cards or /v1/cards/search)
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/cards/american-express-gold-card" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": {
    "id": "c2495eb2-eb53-4c4d-9bfb-6843f641f4ee",
    "slug": "american-express-gold-card",
    "name": "American Express® Gold Card",
    "issuers": {
      "slug": "amex-us",
      "name": "American Express",
      "country": "US",
      "website": "https://www.americanexpress.com",
      "logo_url": null
    },
    "network": "AMEX",
    "card_type": "personal",
    "annual_fee": 325,
    "foreign_transaction_fee": 0,
    "signup_bonus": "up to 100,000 Membership Rewards points",
    "signup_min_spend": 8000,
    "signup_min_spend_months": 6,
    "reward_currency_name": "Membership Rewards",
    "credit_score_min": null,
    "reward_rates": [
      {
        "category_slug": "dining",
        "categories": ["dining"],
        "rate_multiplier": 4,
        "rate_type": "points_per_dollar",
        "cap_amount": 50000,
        "cap_period": "annual",
        "is_base_rate": false
      },
      {
        "category_slug": "groceries",
        "categories": ["groceries"],
        "rate_multiplier": 4,
        "rate_type": "points_per_dollar",
        "cap_amount": 25000,
        "cap_period": "annual",
        "is_base_rate": false
      }
    ],
    "benefits": [
      {
        "benefit_type": "travel_insurance",
        "name": "Trip Delay Insurance",
        "description": "...",
        "value": 300,
        "details": null
      }
    ],
    "statement_credits": [
      {
        "credit_name": "Dining Credit",
        "credit_amount": 120,
        "credit_period": "annual",
        "eligible_merchants": "Grubhub, Seamless, Buffalo Wild Wings, Five Guys, The Cheesecake Factory, Wonder",
        "enrollment_required": true
      }
    ],
    "card_perks": [
      {
        "perk_type": "travel_credit",
        "perk_name": "The Hotel Collection Credit",
        "perk_value": null,
        "details": "Credit at over 1,300 upscale hotels worldwide with 2+ night minimum"
      }
    ],
    "spend_bonuses": [],
    "updated_at": "2026-09-10T08:52:16.527+00:00"
  }
}

GET /v1/cards/best: Rank cards for a category

Cards ranked by their reward rate in one spending category. Each card carries a category_rate object with the matching rate. Rates are matched on their canonical categories; merchant-only, portal-only and pick-your-category rates, and discontinued cards, are left out unless you opt in.

Parameters
categorystringrequiredCategory slug, e.g. dining, groceries, gas, travel (see /v1/categories); a reward rate's category_slug naming one category also works (dining#choice, travel@portal)
countrystringUS or CA
max_annual_feenumberHighest annual fee to include
no_annual_feebooleantrue for cards with a stated $0 annual fee only (an unknown fee does not count)
include_restrictedbooleantrue to also rank rates limited to one merchant, the issuer's travel portal, or a pick-your-category option (e.g. Citi Custom Cash)
include_discontinuedbooleantrue to also rank cards no longer open to new applicants
limitintegerNumber of results (default 10, max 50)
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/cards/best?category=dining&country=US" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "slug": "citi-strata-elite-card",
      "name": "Citi Strata Elite Card",
      "annual_fee": 595,
      "category_rate": {
        "category_slug": "dining",
        "categories": ["dining"],
        "rate_multiplier": 6,
        "rate_type": "multiplier",
        "cap_amount": null,
        "cap_period": null,
        "merchant": null,
        "booking_channel": null,
        "choice_group": null,
        "is_rotating": false
      }
    },
    {
      "slug": "ihg-one-rewards-premier-credit-card",
      "name": "IHG One Rewards Premier Credit Card",
      "annual_fee": 99,
      "category_rate": {
        "category_slug": "dining",
        "categories": ["dining"],
        "rate_multiplier": 5,
        "rate_type": "points_per_dollar",
        "cap_amount": null,
        "cap_period": null,
        "merchant": null,
        "booking_channel": null,
        "choice_group": null,
        "is_rotating": false
      }
    }
  ]
}

GET /v1/cards/:slug/perks: List a card's perks Starter plan and above

Companion perks for one card: hotel and rental-car status, travel credits, lounge access and similar.

Parameters
slugstringrequiredCard slug, e.g. american-express-gold-card or chase-sapphire-preferred-credit-card (from /v1/cards or /v1/cards/search)
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/cards/american-express-gold-card/perks" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "da8895b4-4ebc-40ff-b6be-7fbd203d96ca",
      "perk_type": "hotel_status",
      "perk_name": "Hertz Five Star Status",
      "perk_value": null,
      "perk_period": null,
      "partner": null,
      "details": "Complimentary upgrade with 2X Membership Rewards points on prepaid car rentals"
    }
  ]
}

GET /v1/cards/:slug/credits: List a card's statement credits Starter plan and above

Statement credits for one card (dining, Uber, airline fee, streaming and so on), largest first.

Parameters
slugstringrequiredCard slug, e.g. american-express-gold-card or chase-sapphire-preferred-credit-card (from /v1/cards or /v1/cards/search)
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/cards/american-express-gold-card/credits" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "5f364ff3-f614-4759-a4dc-2eb3498245cd",
      "credit_name": "Dining Credit",
      "credit_amount": 120,
      "credit_period": "annual",
      "eligible_merchants": "Grubhub, Seamless, Buffalo Wild Wings, Five Guys, The Cheesecake Factory, Wonder",
      "enrollment_required": true,
      "notes": null
    }
  ]
}

GET /v1/cards/:slug/history: Get a card's change history Pro plan and above

Tracked changes to one card, newest first: which fields changed (old and new values) and a snapshot of the tracked fields before the change.

Parameters
slugstringrequiredCard slug, e.g. american-express-gold-card or chase-sapphire-preferred-credit-card (from /v1/cards or /v1/cards/search)
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/cards/citi-custom-cash-card/history" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "e39df93a-7579-43af-94b7-93d6e6a7ac75",
      "card_id": "f994ec72-2e50-4898-9546-c49be8d80a37",
      "changed_fields": {
        "reward_currency": { "old": "points", "new": "cashback" }
      },
      "snapshot": { "annual_fee": 0, "reward_currency": "points" },
      "changed_at": "2026-03-21T13:10:38.302968+00:00"
    }
  ]
}

GET /v1/cards/:slug/transfers: List a card's transfer partners Pro plan and above

Loyalty programs the card's points can be transferred to, with transfer ratios.

Parameters
slugstringrequiredCard slug, e.g. american-express-gold-card or chase-sapphire-preferred-credit-card (from /v1/cards or /v1/cards/search)
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/cards/american-express-gold-card/transfers" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "source_currency": "MR",
      "partner_program": "Aeroplan",
      "partner_type": "airline",
      "transfer_ratio_from": 1,
      "transfer_ratio_to": 1,
      "transfer_time": null,
      "transfer_bonus_current": null
    }
  ]
}

Issuers

GET /v1/issuers: List issuers

Every active issuer, with a card count.

Parameters
countrystringUS or CA
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/issuers?country=US" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "875b443c-1d31-48fd-a475-a9ca487e9749",
      "slug": "amex-us",
      "name": "American Express",
      "country": "US",
      "website": "https://www.americanexpress.com",
      "cards_url": "https://www.americanexpress.com/us/credit-cards/",
      "card_count": 29
    }
  ]
}

GET /v1/issuers/:slug: Get an issuer

One issuer, with its card count. List its cards with /v1/cards?issuer=<slug>.

Parameters
slugstringrequiredIssuer slug, e.g. chase, amex-us, amex-ca, capital-one
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/issuers/chase" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": {
    "id": "983858af-740a-4019-8651-af7023f665fd",
    "slug": "chase",
    "name": "Chase",
    "country": "US",
    "website": "https://www.chase.com",
    "cards_url": "https://creditcards.chase.com/all-credit-cards",
    "card_count": 42
  }
}

GET /v1/issuers/:slug/rules: Get an issuer's application rules

Application rules for one issuer, such as Chase's 5/24 rule. Same data as /v1/application-rules?issuer=<slug>.

Parameters
slugstringrequiredIssuer slug
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/issuers/chase/rules" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "rule_name": "5/24 Rule",
      "rule_type": "velocity",
      "description": "Chase will deny most applications if you have opened 5 or more personal credit cards across all issuers in the last 24 months.",
      "details": { "max_cards": 5, "period_months": 24, "applies_to": "personal" },
      "issuers": { "name": "Chase", "slug": "chase" }
    }
  ]
}

Categories

GET /v1/categories: List spending categories

The spending categories CardAPI tracks. Use their slugs with /v1/cards/best. Every reward rate's categories come from this list, and its category_slug label starts with them, joined by + in this list's order (groceries+gas).

Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/categories" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    { "slug": "groceries", "name": "Groceries", "icon": "shopping-cart", "sort_order": 1 },
    { "slug": "gas", "name": "Gas & Fuel", "icon": "fuel", "sort_order": 2 },
    { "slug": "dining", "name": "Dining", "icon": "utensils", "sort_order": 3 },
    { "slug": "travel", "name": "Travel", "icon": "plane", "sort_order": 4 },
    { "slug": "drugstore", "name": "Drugstore", "icon": "pill", "sort_order": 5 },
    { "slug": "entertainment", "name": "Entertainment", "icon": "film", "sort_order": 6 },
    { "slug": "streaming", "name": "Streaming", "icon": "tv", "sort_order": 7 },
    { "slug": "transit", "name": "Transit", "icon": "bus", "sort_order": 8 },
    { "slug": "online-shopping", "name": "Online Shopping", "icon": "globe", "sort_order": 9 },
    { "slug": "other", "name": "Other / General", "icon": "credit-card", "sort_order": 10 }
  ]
}

Transfer Partners

GET /v1/transfer-partners: List transfer partners Pro plan and above

The transfer partner directory: which loyalty programs each points currency transfers to, and at what ratio.

Parameters
currencystringPoints currency code, e.g. MR, UR, TYP, C1
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/transfer-partners?currency=MR" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "f59f9870-f319-4d0f-88f1-d7b1e0400cd2",
      "source_currency": "MR",
      "partner_program": "Aeroplan",
      "partner_type": "airline",
      "transfer_ratio_from": 1,
      "transfer_ratio_to": 1,
      "country": "US",
      "transfer_minimum": null,
      "transfer_time": null,
      "transfer_bonus_current": null,
      "transfer_bonus_expires": null
    },
    {
      "id": "b3b848be-9c37-421e-9c14-5b41e2a465f5",
      "source_currency": "MR",
      "partner_program": "ANA Mileage Club",
      "partner_type": "airline",
      "transfer_ratio_from": 1,
      "transfer_ratio_to": 1,
      "country": "US",
      "transfer_minimum": null,
      "transfer_time": null,
      "transfer_bonus_current": null,
      "transfer_bonus_expires": null
    }
  ]
}

Reward Valuations

GET /v1/reward-valuations: List reward valuations

Cents-per-point valuations for each rewards currency (Chase Ultimate Rewards, Amex Membership Rewards, Citi ThankYou and more), for working out effective earn rates.

Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/reward-valuations" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "currency_name": "Chase Ultimate Rewards",
      "currency_code": "UR",
      "cpp_cash": 1,
      "cpp_travel_portal": 1,
      "cpp_transfer": 2,
      "cpp_recommended": 2,
      "notes": "Chase Travel redemptions are worth 1 cent per point. Points Boost offers on select flights and hotels through Chase Travel are worth up to 1.5 cents per point with Sapphire Preferred, Ink Business Preferred and Ink Plus, and up to 2 cents with Sapphire Reserve, J.P. Morgan Reserve and Sapphire Reserve for Business. Sapphire Reserve points earned before 26 Oct 2025 by cardmembers who applied before 23 Jun 2025 redeem at 1.5 cents on Chase Travel until 26 Oct 2027. Transfer value based on avg airline redemptions."
    },
    {
      "currency_name": "Amex Membership Rewards",
      "currency_code": "MR",
      "cpp_cash": 0.6,
      "cpp_travel_portal": 1,
      "cpp_transfer": 1.8,
      "cpp_recommended": 1.8,
      "notes": "Cash out via Schwab at 1.1cpp. Transfer to airlines averages 1.5-2.0cpp."
    }
  ]
}

Application Rules

GET /v1/application-rules: List application rules

Known application rules by issuer: velocity limits, once-per-lifetime bonus rules and product restrictions.

Parameters
issuerstringIssuer slug
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/application-rules?issuer=chase" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "33def85c-f4c6-47e7-8738-396a3ebf7e81",
      "issuer_id": "983858af-740a-4019-8651-af7023f665fd",
      "rule_name": "5/24 Rule",
      "rule_type": "velocity",
      "description": "Chase will deny most applications if you have opened 5 or more personal credit cards across all issuers in the last 24 months.",
      "details": { "max_cards": 5, "period_months": 24, "applies_to": "personal" },
      "country": "US",
      "issuers": { "name": "Chase", "slug": "chase" }
    },
    {
      "rule_name": "One Sapphire Rule",
      "rule_type": "lifetime",
      "description": "You cannot hold more than one Sapphire product at a time. Must close existing Sapphire before applying for another.",
      "details": { "products": ["Sapphire Preferred", "Sapphire Reserve"] },
      "issuers": { "name": "Chase", "slug": "chase" }
    }
  ]
}

Product Changes

GET /v1/product-changes: List product change paths

Product change paths: which cards can be upgraded or downgraded to which others, useful for keeping a card's history while dropping its annual fee. Coverage is limited: a path is recorded only when the issuer's own page names the card it can switch to, so most issuers have none yet. direction is upgrade, downgrade, both (either way) or one_way (from_card to to_card only, as recorded from an issuer page). Returns an empty list when no paths are recorded for the issuer.

Parameters
issuerstringIssuer slug of the card you have
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/product-changes?issuer=chase" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "direction": "downgrade",
      "notes": "Available after 12 months of card membership",
      "from_card": {
        "slug": "chase-sapphire-preferred-credit-card",
        "name": "Chase Sapphire Preferred Credit Card",
        "issuers": { "slug": "chase", "name": "Chase" }
      },
      "to_card": {
        "slug": "chase-freedom-unlimited-credit-card",
        "name": "Chase Freedom Unlimited Credit Card",
        "issuers": { "slug": "chase", "name": "Chase" }
      }
    }
  ]
}

Offer Changes

GET /v1/offers/notable: List notable offer changes Pro plan and above

The 50 most recent notable offer changes across all cards: signup bonus increases, fee changes and other detected updates.

Parameters
countrystringUS or CA
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/offers/notable?country=US" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "47617b6f-8f71-4da5-a7c3-3df6d0622870",
      "field_name": "signup_bonus",
      "old_value": null,
      "new_value": "50,000 points for $3,000 spend in the first 90 days",
      "change_type": "increased",
      "is_notable": true,
      "detected_at": "2026-09-11T04:03:07.673816+00:00",
      "card_slug": "penfed-pathfinder-rewards-visa-signature",
      "card_name": "PenFed Pathfinder Rewards Visa Signature"
    }
  ]
}

GET /v1/offers/history: Get a card's offer history Pro plan and above

Every recorded offer change for one card, newest first.

Parameters
card_slugstringrequiredCard slug
Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/offers/history?card_slug=american-express-gold-card" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "efafbd8e-f02a-4672-bec8-5c43d20c07bb",
      "field_name": "signup_min_spend",
      "old_value": null,
      "new_value": "8000",
      "change_type": "increased",
      "is_notable": false,
      "detected_at": "2026-09-10T08:52:16.239485+00:00"
    }
  ]
}

Stats

GET /v1/stats: Get catalog stats

Card and issuer counts and the last update time. No API key needed.

Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/stats" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": {
    "total_cards": 463,
    "published_cards": 354,
    "total_issuers": 39,
    "issuers_by_country": { "US": 25, "CA": 14 },
    "last_updated": "2026-09-12T06:41:12.577+00:00"
  }
}

Webhooks

POST /v1/webhooks: Register a webhook Enterprise plan

Register an HTTPS URL to be notified when card data changes. The secret is only returned here; use it to verify deliveries (X-CardAPI-Signature: sha256=<HMAC-SHA256 of the body>). Maximum 20 webhooks per key. card.updated: a published card's data changed, from a scrape or an edit by CardAPI, and is sent only when something did change; data has the card's id, slug and name, the fields written, changes (each changed field's old and new value) and changed_relations (the related tables that changed, such as reward_rates). card.created: a card joined the catalog; data.reason is published for a newly published card, or reinstated when a discontinued card came back. card.deleted: a card left the catalog; data.reason is discontinued (GET /v1/cards no longer lists it by default, but its slug still resolves) or unpublished (CardAPI withdrew it and its slug no longer resolves). offer.notable: a welcome offer went up, its minimum spend or the annual fee came down, or a first-year fee waiver was added.

Parameters
urlstringrequiredPublic HTTPS URL to receive events
eventsstring[]requiredComma-separated: card.created, card.updated, card.deleted, offer.notable
Example
Paste your key into Try it to fill it in, or get a key
curl -X POST "https://api.cardapi.dev/v1/webhooks" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/webhooks/cardapi","events":["card.updated"]}'
Response (abridged)
{
  "data": {
    "id": "0f8fad5b-d9cb-469f-a165-70867728950e",
    "url": "https://example.com/webhooks/cardapi",
    "events": ["card.updated"],
    "is_active": true,
    "created_at": "2026-09-30T12:00:00.000000+00:00",
    "secret": "5b9e..."
  }
}

GET /v1/webhooks: List webhooks Enterprise plan

The webhooks registered for your API key.

Example
Paste your key into Try it to fill it in, or get a key
curl "https://api.cardapi.dev/v1/webhooks" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "data": [
    {
      "id": "0f8fad5b-d9cb-469f-a165-70867728950e",
      "url": "https://example.com/webhooks/cardapi",
      "events": ["card.updated"],
      "is_active": true,
      "last_triggered_at": "2026-09-29T03:12:44.000000+00:00",
      "failure_count": 0,
      "created_at": "2026-09-01T12:00:00.000000+00:00"
    }
  ]
}

DELETE /v1/webhooks/:id: Delete a webhook Enterprise plan

Delete one of your webhooks.

Parameters
idstringrequiredWebhook ID (UUID)
Example
Paste your key into Try it to fill it in, or get a key
curl -X DELETE "https://api.cardapi.dev/v1/webhooks/0f8fad5b-d9cb-469f-a165-70867728950e" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (abridged)
{
  "success": true
}

GraphQL

POST /v1/graphql: Run a GraphQL query Enterprise plan

One endpoint for every read, as GraphQL: send a JSON body {"query": "..."}. Root fields: cards, card, searchCards, bestCards, issuers, issuer, categories, stats, transferPartners and applicationRules. Card fields use the REST names (annual_fee, reward_rates) and follow the same plan rules. A query may ask for at most 10 root fields (aliases included) and nest 5 levels deep; list fields return at most 100 items; schema introspection is off.

Parameters
querystringrequiredThe GraphQL query document
Response (abridged)
{
  "data": {
    "card": {
      "slug": "american-express-gold-card",
      "name": "American Express® Gold Card",
      "annual_fee": 325,
      "reward_rates": [
        { "category_slug": "dining", "rate_multiplier": 4 },
        { "category_slug": "groceries", "rate_multiplier": 4 }
      ]
    }
  }
}

Re-checked against issuer sites every Friday · last change Oct 17