Banking API
A single integration surface for building, testing, and measuring landing page hypotheses against the Banking marketplace — primarily high yield savings accounts (HYSAs). Revenue fires on click with no confirmation lag. Read the Pacing section before designing your experiment.
pacing_status field on each offer and the pacing_impact_rate metric in analytics help you detect and account for this.Quickstart
# 1. Create a session RESP=$(curl -s -X POST https://api.nerdwallet.com/v1/banking/session \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"referrer_tag": "your_experiment"}') SUB_ID=$(echo $RESP | jq -r '.sub_id') # 2. Submit inputs curl -s -X POST https://api.nerdwallet.com/v1/banking/inputs \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d "{\"sub_id\":\"$SUB_ID\",\"fields\":{\"account_type\":\"savings\",\"deposit_amount\":10000,\"state\":\"CA\",\"citizenship_status\":\"citizen\"}}" # 3. Render marketplace — check pacing_status on each offer curl -s "https://api.nerdwallet.com/v1/banking/marketplace?sub_id=$SUB_ID&format=json" \ -H "Authorization: Bearer YOUR_API_KEY" # 4. Pull analytics — pacing_impact_rate shows if budget gaps skewed results curl -s "https://api.nerdwallet.com/v1/banking/analytics?referrer_tag=your_experiment&granularity=summary" \ -H "Authorization: Bearer YOUR_API_KEY"
Authentication
Authorization: Bearer nw_bk_live_xxxxxxxxxxxxxxxxxxxxnw_bk_test_ return synthetic offers with simulated pacing states and no CPC revenue attributed.Base URL & versioning
https://api.nerdwallet.com/v1/banking/POSTCreate session
Generates a sub_id that ties form inputs, marketplace events, and CPC revenue together. Call once per page load.
| Field | Type | Required | Description |
|---|---|---|---|
| referrer_tag | string | required | Experiment namespace.e.g. "mikes_hysa_rate_comparison_v1" |
| user_agent | string | optional | For device-segmented analytics. |
| metadata | object | optional | Arbitrary key-value pairs. Max 10 keys.e.g. {"variant": "control", "traffic_source": "organic"} |
{ "sub_id": "bksn_3m7p9q2rxt", "referrer_tag": "mikes_hysa_rate_comparison_v1", "expires_at": "2024-09-15T18:45:00Z", "sandbox": false }{ "error": "INVALID_REFERRER_TAG" }{ "error": "UNAUTHORIZED" }POSTSubmit inputs
| Field | Type | Required | Description |
|---|---|---|---|
| sub_id | string | required | Session ID from POST /session. |
| fields | object | required | Key-value map. See pocket field schema. |
{ "sub_id": "bksn_3m7p9q2rxt", "fields": { "account_type": "savings", "deposit_amount": 10000, "state": "CA", "citizenship_status": "citizen", "age_range": "35-49" } }Pocket field schema
account_type=savings, especially late in the month.GETGet marketplace
Returns matched banking offers. Each offer includes pacing_status indicating the partner's current budget state. Revenue fires automatically on click.
| Param | Type | Required | Description |
|---|---|---|---|
| sub_id | string | required | Session ID. |
| format | enum | required | "json" | "iframe" | "js" |
| max_offers | integer | optional | Default: 5. Max: 20. |
| sort | enum | optional | Default: highest_apy."highest_apy" | "recommended" | "nw_revenue" |
| include_paced_out | boolean | optional | Default false. If true, includes exhausted offers (shown but not clickable). Useful for UI testing. |
{
"sub_id": "bksn_3m7p9q2rxt", "match_quality": "high",
"pacing_snapshot": {
"active_partners": 6, "throttled_partners": 2,
"exhausted_partners": 3, "budget_reset_date": "2024-10-01"
},
"offers": [
{
"nw_offer_id": "off_bk_4r8t2z", "bank_name": "Marcus by Goldman Sachs",
"apy": 5.10, "apy_as_of": "2024-09-12",
"min_deposit": 0, "monthly_fee": 0, "fdic_insured": true,
"pacing_status": "active", // "active" | "throttled" | "paused" | "exhausted"
"budget_headroom": "high", // "high" | "medium" | "low" | "exhausted"
"click_url": "https://www.nerdwallet.com/go/marcus/savings?sub=bksn_3m7p9q2rxt&offer=off_bk_4r8t2z"
},
{
"bank_name": "Ally Bank", "apy": 4.85,
"pacing_status": "throttled", "budget_headroom": "low"
}
],
"total_offers": 6, "generated_at": "2024-09-15T14:47:33Z"
}throttled offer and clicks several minutes later, the partner may have exhausted their budget. Design your UI to handle zero-offer states.Render formats
Build any UI you want. Attribution is automatic as long as you use the provided click_url.
Returns an embed_url. The NW marketplace renders inside it with pacing-aware display built in.
GETGet analytics
Query session and CPC revenue data. Includes pacing metrics to detect whether budget exhaustion affected results.
| Param | Type | Required | Description |
|---|---|---|---|
| referrer_tag | string | one of | Filter to one experiment. |
| sub_id_list | string[] | one of | Comma-separated. Max 500. |
| date_from / date_to | string | optional | ISO dates. Defaults: 30 days ago → today. |
| granularity | enum | optional | Default: summary."row" | "daily" | "summary" |
{
"referrer_tag": "mikes_hysa_rate_comparison_v1",
"sessions_total": 3410, "marketplace_views": 2690, "offer_clicks": 537,
"click_rate": 0.200,
"cpc_rev": 2148.00, // fires on click, same-day, no confirmation lag
"rev_per_session": 0.63, // primary comparison metric
"top_partners": [{ "bank": "Marcus by Goldman Sachs", "clicks": 188, "cpc_rev": 752.00 }],
// ── Pacing metrics ──────────────────────────────────────
"pacing_impact_rate": 0.18, // fraction of views where ≥1 partner was exhausted
"zero_offer_rate": 0.04, // fraction of views with NO active offers
"offers_available_rate": 0.96,
"avg_active_offers_per_view": 4.2,
"pacing_by_day": [
{ "date": "2024-09-01", "active_partners": 9, "exhausted_partners": 0, "zero_offer_rate": 0.00 },
{ "date": "2024-09-25", "active_partners": 3, "exhausted_partners": 6, "zero_offer_rate": 0.21 }
]
}{
"date": "2024-09-10", "sub_id": "bksn_3m7p9q2rxt", "account_type": "savings",
"marketplace_viewed": true, "active_offers_shown": 4, "offers_clicked": 1,
"clicked_bank": "Marcus by Goldman Sachs", "cpc_rev": 4.00,
"pacing_impact": false, // true if any partner was exhausted at view time
"active_partners_at_view": 7
}Revenue model — CPC
Banking operates on a cost-per-click (CPC) model. Revenue fires on click with no confirmation lag — unlike Personal Loans, there's no funded-loan event to wait for.
pacing_impact=false rows for cleanest read.Pacing overview
Banking partners allocate a fixed monthly CPC budget. As that budget is consumed, partners throttle and eventually pause their offers. This is the central operational constraint of the Banking vertical.
Early in the month, most partners are active. By mid-month some throttle. By month-end, multiple partners may be exhausted.
Experiment strategy for pacing
Partner budgets reset on the 1st. The first 10 days have the most active partners, highest offer density, and most stable CPC rates.
pacing_impact: false rowsUse granularity=row and filter to sessions where pacing_impact=false for the cleanest signal on whether your hypothesis actually drives clicks.
zero_offer_rate dailyPull granularity=daily each day. If zero_offer_rate spikes above 10%, your test is likely generating noise. Pause and resume next month.
Pacing conditions will likely dominate any real signal. Run both variants simultaneously, or compare after filtering to pacing_impact=false rows.
Error codes
- 400INVALID_REFERRER_TAGMust match
[a-z0-9_-]{3,64}. - 400INVALID_FIELD_VALUEPocket field failed validation. Response includes
fields_invalidarray. - 400MISSING_CD_TERM
account_type=cdrequirescd_term_months. - 400SUB_ID_EXPIREDSession exceeded 4-hour TTL. Create a new session.
- 401UNAUTHORIZEDAPI key missing, malformed, or expired.
- 403VERTICAL_MISMATCHBanking keys are prefixed
nw_bk_. - 200ALL_PARTNERS_EXHAUSTEDReturns 200 with empty
offersarray andno_match_reason: "all_partners_exhausted". Design your UI to handle this state. - 429RATE_LIMIT_EXCEEDEDCheck
X-RateLimit-Reset. Use exponential backoff.
Rate limits
Vertical parity contract
| Vertical | Base path | Token prefix | Rev model | Status |
|---|---|---|---|---|
| Personal Loans | /v1/personal-loans/ | nw_pl_ | CPL confirmed | stable |
| Credit Cards | /v1/credit-cards/ | nw_cc_ | CPC | beta |
| Mortgage | /v1/mortgage/ | nw_mo_ | CPL confirmed | beta |
| Banking | /v1/banking/ | nw_bk_ | CPC + pacing | beta |
| Find a Financial Advisor | /v1/find-advisor/ | nw_fa_ | CPL | planned |