HomeLatest OffersOffer Directory⏰ Expiring SoonSearch APIMCP ServerPricingChrome ExtensionMy Offers

Base URL

https://data.offer.love/v1

Authentication

Append your API key to the URL — works with any client:

curl "https://data.offer.love/v1/search?q=amazon&key=YOUR_API_KEY"

Also supports x-api-key header, Authorization: Bearer, and OAuth 2.0.

No key? Anonymous requests get 100 free calls/day with basic fields.

Get a Free API Key

  1. Go to /myoffers and sign in with your email
  2. Click the 🔑 API Key button
  3. Copy your key (starts with usr_)

💡 Using an AI assistant? Access offers via our MCP server with the same API key — no code needed.

Response Format

List endpoints return:

{
  "total": 4,      // number of results returned
  "per_page": 10,  // max results per request (tier-based)
  "results": [...]  // array of offer objects
}

If total equals per_page, there may be more results. No pagination — upgrade tier for higher limits.

Offer Fields

{
  "offerId": "19cdd43e-...",   // unique offer identifier
  "domainSld": "walmart",      // merchant slug
  "merchantName": "Walmart",   // display name
  "title": "Earn 4% Back...",   // offer headline
  "details": "Terms apply...",  // full terms (keyed users only)
  "bank": "Amex",              // issuing bank
  "imgSrc": "https://...",     // merchant logo URL
  "addedAt": "2026-03-01",     // date offer was added
  "expiresAt": "2026-06-01"    // expiration date
}

Endpoints

GET/v1/search?q={query}Free

Search Offers

Search by merchant name, bank, or keyword. Min 2 characters.

ParamTypeDescriptionExample
qstringSearch query (min 2 chars)walmart
Response
{
  "total": 4,
  "per_page": 10,
  "results": [
    {
      "offerId": "19cdd43e-...",
      "domainSld": "walmart",
      "merchantName": "Walmart",
      "title": "Earn 4% Back on any purchase.",
      "bank": "Amex",
      "imgSrc": "https://assets.offer.love/logo/walmart.png",
      "addedAt": "2026-03-01",
      "expiresAt": "2026-06-15"
    }
  ]
}
GET/v1/merchants/{slug}Free

List by Merchant

Get all active offers from a specific merchant.

ParamTypeDescriptionExample
slugstringMerchant slug (use /v1/search to find slugs)walmart
Response
{
  "total": 4,
  "per_page": 10,
  "results": [ ... ]
}
GET/v1/banks/{name}Free

List by Bank

Get all active offers from a specific bank. Case-insensitive.

ParamTypeDescriptionExample
namestringBank nameChase
Response
{
  "total": 10,
  "per_page": 10,
  "results": [ ... ]
}
GET/v1/offers/{id}Free

Get Offer

Get a specific offer by its ID.

ParamTypeDescriptionExample
idstringOffer ID (from search/list results)19cdd43e-ae4c-...
Response
{
  "offerId": "19cdd43e-...",
  "domainSld": "walmart",
  "merchantName": "Walmart",
  "title": "Earn 4% Back on any purchase.",
  "bank": "Amex",
  "imgSrc": "https://...",
  "addedAt": "2026-03-01",
  "expiresAt": "2026-06-15"
}
GET/v1/statsFree

Get Stats

Overall statistics for active offers.

Response
{
  "total": 5628,      // active offers
  "merchants": 2796,  // unique merchants
  "banks": 5           // issuing banks
}
GET/v1/banksFree

List Banks

All banks with their active offer counts.

Response
[
  { "bank": "Paypal", "count": 1989 },
  { "bank": "Amex", "count": 1832 },
  { "bank": "Chase", "count": 1204 },
  { "bank": "Citi", "count": 412 },
  { "bank": "US Bank", "count": 191 }
]
GET/v1/trendingKey

Trending Merchants

Most viewed merchants by page views.

Response
{
  "total": 20,
  "per_page": 20,
  "results": [
    {
      "domainSld": "amazon",
      "views": 1523,
      "merchantName": "Amazon",
      "offerCount": 12,
      "bank": "Amex",
      "imgSrc": "https://..."
    }
  ]
}
GET/v1/expiringKey

Expiring Soon

Offers expiring within 7 days, sorted by expiration date.

Response
{
  "total": 50,
  "per_page": 50,
  "results": [
    {
      "offerId": "...",
      "title": "Last chance: 5% back",
      "expiresAt": "2026-03-10",
      ...
    }
  ]
}
GET/v1/recentKey

Recently Added

Most recently added offers.

Response
{
  "total": 50,
  "per_page": 50,
  "results": [
    {
      "offerId": "...",
      "title": "New: 3x points at...",
      "addedAt": "2026-03-08",
      ...
    }
  ]
}
GET/v1/my-offers?q=Free

Search Personal Offers

Search your own credit card offers synced from the browser extension. Requires API key linked to your offer.love account.

ParamTypeDescriptionExample
qstringSearch query (min 2 chars)undefined
Response
{
  "total": 3,
  "results": [
    {
      "merchant": "starbucks",
      "title": "Earn 5% back at Starbucks",
      "bank": "Chase",
      "details": "...",
      "expiresAt": "2026-04-15",
      "cardNumber": "...1234"
    }
  ]
}

Tier Comparison

FeatureAnonymousFree KeyProEnterprise
Rate limit100/day100/day10K/dayUnlimited
Search, list by bank/merchant
Stats & bank list
Offer details/terms
Results per request10105050
Trending, expiring, recent
Search personal offers
MCP server access

Error Handling

CodeMeaningResponse
401Invalid API key{"error":"Invalid API key"}
403Tier restriction{"error":"Pro tier required"}
404Not found{"error":"Offer not found"}
429Rate limit exceeded{"error":"Rate limit exceeded..."}

Code Examples

JavaScript
const res = await fetch("https://data.offer.love/v1/search?q=starbucks&key=YOUR_KEY")
const { total, results } = await res.json()
console.log(`Found ${total} offers`)
results.forEach(o => console.log(o.merchantName, "-", o.title))
Python
import requests

r = requests.get("https://data.offer.love/v1/search",
    params={"q": "starbucks", "key": "YOUR_KEY"})
data = r.json()
print(f"Found {data['total']} offers")
for o in data["results"]:
    print(f"{o['merchantName']} - {o['title']}")
cURL
curl "https://data.offer.love/v1/search?q=starbucks&key=YOUR_KEY"
Get API Key →