Search and compare credit cards on NerdWallet (category, card name, full URL, or free-form criteria) and return structured per-card data — rating, fees, intro APR, welcome bonus, rewards, pros/cons, key benefits, and the affiliate Apply Now URL (captured, never followed). Read-only.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versioncompare-credit-cardsExecute the skills CLI command in your project's root directory to begin installation:
Fetches compare-credit-cards from nerdwallet.com/compare-credit-cards-0a4ihq and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate compare-credit-cards. Access via /compare-credit-cards in your agent's command palette.
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Automate repetitive workflows and reduce manual effort
Example
Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Learn new skills, understand complex topics, get expert guidance
Example
Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Enhance output quality through reviews, suggestions, and refinements
Example
Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
0
total installs
0
this week
0
upvotes
Run in your terminal
0
installs
0
this week
—
stars
| name | compare-credit-cards |
| title | NerdWallet Credit Card Comparison |
| description | >- Search and compare credit cards on NerdWallet (category, card name, full URL, or free-form criteria) and return structured per-card data — rating, fees, intro APR, welcome bonus, rewards, pros/cons, key benefits, and the affiliate Apply Now URL (captured, never followed). Read-only. |
| website | nerdwallet.com |
| category | credit-cards |
| tags | - credit-cards - comparison - nerdwallet - rewards - travel-cards - read-only |
| source | 'browserbase: agent-runtime 2026-05-18' |
| updated | '2026-05-18' |
| recommended_method | browser |
| alternative_methods | - method: api rationale: >- No public JSON or GraphQL API exists. Robots.txt explicitly disallows /CreditCardDetailAJAX, /compareajax, /structured-content-renderer, /api/, /cc-prequal-service/; direct probes (2026-05-18) returned 404/405 on every plausible endpoint. Do not invest more cycles searching for one. - method: url-param rationale: >- Category-page query params (?sort=, ?filter=) are inconsistently honored — a handful of pages respect a few sort keys but most ignore unknowns and render the editorial default. Sort/filter client-side after parsing. - method: hybrid rationale: >- Use bb fetch (no browser) for the sitemap + robots.txt + the /credit-cards root (all sub-1MB) to discover canonical slugs, then escalate to a real browser session for the category and review pages (every /credit-cards/best/{slug} and /credit-cards/reviews/{slug} page exceeds the 1MB fetch ceiling). |
| verified | false |
| proxies | true |
Search and compare credit cards on NerdWallet given (a) a full NerdWallet credit-card URL, (b) a category intent like "best travel cards" / "cash back cards" / "0% intro APR cards", (c) a specific card name (returns that one card's detail), or (d) free-form criteria ("travel card with no foreign transaction fee"). Returns a list of cards — name, issuer, network, star rating, fees, intro APR, welcome bonus, rewards structure, pros/cons, key benefits, "Apply Now" affiliate URL (captured, not followed), and canonical review URL — plus editorial context (NerdWallet's "Why we like it" blurb, "Best for…" tag, last-reviewed timestamp). Read-only — never clicks Apply Now, Apply, Get Started, Sign In, or submits an application form.
NerdWallet's category pages render the card grid into static-after-hydration HTML — the data is there, but the document is large (typical category page > 1 MB, occasionally 2 MB+) and there is no public JSON or GraphQL API: every internal endpoint hinted at by robots.txt (/CreditCardDetailAJAX, /compareajax, /structured-content-renderer, /api/*) is locked to internal callers or returns 405/404 from the public surface (verified 2026-05-18 — see Site-Specific Gotchas). JSON-LD blocks on category pages describe the page (Organization, VideoObject) not the cards, so the only path to per-card data is to parse the rendered card grid. Therefore the recommended method is browser via Browserbase — bb fetch is unsuitable because every category page exceeds the 1 MB fetch ceiling.
Resolve the input to a canonical URL.
Full URL given — if it starts with https://www.nerdwallet.com/credit-cards/best/... or https://www.nerdwallet.com/credit-cards/reviews/..., use as-is. If it starts with the deprecated https://www.nerdwallet.com/best/credit-cards/... form, don't rewrite it manually — NerdWallet's CDN emits a 301 to the new canonical (/credit-cards/best/{slug}); pass --allow-redirects (or let the browser follow) and read the final URL.
Category intent — map to the canonical slug under /credit-cards/best/{slug}:
| Intent | Slug |
|---|---|
| best travel cards | travel |
| cash back cards | cash-back |
| 0% intro APR / low-interest cards | low-interest |
| balance-transfer cards | balance-transfer |
| student / college cards | college-student |
| business cards | (use /credit-cards/small-business/... — different tree) |
| secured cards | secured |
| no-annual-fee cards | no-annual-fee |
| no foreign-transaction-fee cards | no-foreign-transaction-fee |
| rewards cards | rewards |
| premium / luxury cards | premium |
| bonus-offer / welcome-bonus cards | bonus-offers |
| airline (generic) | united-airlines-cards / delta-airlines-cards / american-airlines-cards / southwest-airlines-cards / alaska-airlines-cards (issuer-cobrand-specific — pick by issuer) |
| hotel (generic) | hotel (or marriott-bonvoy-cards / hilton-hotels for chain-specific) |
| excellent credit | excellent-credit |
| good credit | good-credit |
| fair credit | fair-credit |
| bad / limited credit | bad-credit / no-credit |
| groceries / dining / gas / streaming | groceries / restaurants / gas / streaming-services |
| lounge access / TSA PreCheck | airport-lounge-access / tsa-precheck-global-entry |
| Chase / Amex / Capital One / Citi / Discover / BofA / Wells Fargo / US Bank / Navy Federal | chase-cards / american-express-cards / capital-one-cards / citi-cards / discover-cards / bank-of-america-cards / wells-fargo-cards / us-bank-cards / navy-federal-cards |
| Visa / Mastercard | visa-cards / mastercard-cards |
The full enumeration of valid slugs is published in NerdWallet's WordPress sitemap at https://www.nerdwallet.com/sitemaps/us/wp-sitemap-posts-credit-cards-pages-1.xml (~80 category slugs as of 2026-05-18). If the intent doesn't obviously map, fetch the sitemap with bb fetch (XML, ~13 KB, well under the fetch ceiling), grep <loc>...best/...</loc> for the closest slug, and use it.
Specific card name — convert to the review-page slug https://www.nerdwallet.com/credit-cards/reviews/{slug} where {slug} is the canonical NerdWallet review slug (kebab-case, e.g. chase-sapphire-preferred, citi-double-cash, american-express-platinum, discover-it-cash-back). The full set is enumerated in the same credit-cards sitemap above (~180 review slugs as of 2026-05-18). If the name is ambiguous (e.g. "Chase Freedom" matches chase-freedom, chase-freedom-unlimited, chase-freedom-flex), return all matches and let the caller disambiguate.
Free-form criteria — pick the closest canonical category slug from the table above, then post-filter the parsed result list client-side by the explicit criteria. (NerdWallet's UI exposes filter chips but they're query-param-driven only on a handful of pages — see Site-Specific Gotchas.)
Open a remote Browserbase session with proxies. --proxies is generally sufficient — Cloudflare on NerdWallet is light. Add --verified only after a confirmed 403 on the canonical URL:
SID=$(bb sessions create --keep-alive --proxies | jq -r .id)
export BROWSE_SESSION="$SID"
browse open "https://www.nerdwallet.com/credit-cards/best/{slug}" --remote
browse wait load --remote
browse wait timeout 2500 --remote # card-grid hydration after `load`
Parse the card grid. Use browse get markdown body for fast structured extraction, or browse snapshot if you need ref-driven interaction (e.g. expanding a "Show details" accordion). Per-card extraction targets, in priority order:
h2/h3 inside each card row; also data-testid="product-card-title" on most templates.aria-label="Rated X out of 5 stars" near the card title. Always parse the aria-label rather than the visible text — visible text is rendered as a sprite at certain breakpoints.<img src="..."> on the card image. NerdWallet hosts on www.nerdwallet.com/cdn/... and www.nerdwallet.com/tachyon/.... Capture full absolute URL.$, %, intro qualifier, etc.). Don't try to coerce to numeric in the parser — return both raw (verbatim NerdWallet text) and a parsed numeric where unambiguous.[{ category, rate, cap }]. Rate is multiplier-style (5x, 3%) or flat percentage. Cap is usually null; some cards list up to $1,500 in combined purchases each quarter. Keep the raw bullet alongside the decomposed structure.{ amount, currency: 'points'|'miles'|'usd', spend_required, spend_window_months, estimated_value_usd }.Excellent (720-850), Good (690-719), Fair (630-689), Bad (300-629), Limited / No credit.Pros: / Cons: bullet blocks inside the card row. Capture verbatim — NerdWallet's editorial voice is part of the value.<a class="...apply-now..." href="...">Apply Now</a>. The href is typically a nerdwallet.com/redirect/... or nerdwallet.com/cct/... short-link that 302-redirects through partner tracking before landing on the issuer's application page. Capture the href, but DO NOT follow it. Tag it as is_affiliate: true in the output.https://www.nerdwallet.com/credit-cards/reviews/{slug}. This is the URL to follow if the caller asks for deeper detail on one card.For "specific card name" inputs (review-page mode), the same fields apply but laid out across a single page rather than a grid. The "Pros" / "Cons" sections are longer, the rewards structure is broken into a dedicated card-specific table, and there's a "Compare to similar cards" section near the bottom with thumbnails of 2–3 related cards — capture their names + slugs as related_cards if useful for the caller.
Honor sort + limit at parse time. NerdWallet's category-page query-param filter surface is inconsistent across slugs: a handful of pages accept ?sort=annual_fee_asc / ?sort=intro_apr_length / ?sort=rewards_rate / ?sort=welcome_bonus_value, but most ignore unknown params and render the editorial default ranking. Don't trust the URL to filter for you — fetch the full grid and sort/filter client-side. NerdWallet typically renders 10–20 cards per category page; if the caller asks for a specific count, truncate after parsing.
Release the session and emit JSON.
bb sessions update "$SID" --status REQUEST_RELEASE
The category-finder discovery surface — the /credit-cards root, /sitemaps/us/wp-sitemap-posts-credit-cards-pages-1.xml, and /robots.txt — all fetch cleanly under the 1 MB ceiling via bb fetch --proxies --allow-redirects --output <path>. Use this path for slug discovery and category enumeration (no browser needed). The card grids themselves do not — every /credit-cards/best/{slug} and /credit-cards/reviews/{slug} page exceeds 1 MB on first load and must be retrieved through a real session (browse open --remote).
Apply Now, Apply, Get Started, Sign In, or any form-submit on the page. NerdWallet's affiliate clickout is logged on click and starts a tracked redirect chain through partner ad networks before landing on the issuer's application page; clicking taints the user-state and is a category-prohibited action under the marketplace's read-only rule. Capture the href and flag it is_affiliate: true in the output — the caller decides whether to surface it.https://www.nerdwallet.com/best/credit-cards/{slug} 301-redirects to https://www.nerdwallet.com/credit-cards/best/{slug} at Cloudflare (Server: cloudflare, Location: /credit-cards/best/...). The new path is canonical; the legacy form still works only if you let redirects flow. Direct fetches without --allow-redirects return the bare 301 page and you'll have a confusing time. Always follow redirects..html-suffix variants trigger Cloudflare 403. Verified 2026-05-18: /credit-cards/best/travel/ (trailing slash) and /credit-cards/best/travel.html both return 403 Forbidden with a freshly-issued __cf_bm cookie (CF bot challenge). The bare canonical /credit-cards/best/travel returns 200. Stick to the no-trailing-slash, no-suffix canonical form. Don't programmatically append / or .html.bb fetch returns 502 The response body exceeded the maximum allowed size of 1MB. This is a Browserbase Fetch-API ceiling, not a NerdWallet limit. Every /credit-cards/best/{slug} and /credit-cards/reviews/{slug} page hits this. Use browse open --remote (real session) for those; reserve bb fetch for sitemap, robots.txt, and the /credit-cards root (~850 KB, OK).<script type="application/ld+json"> blocks on /credit-cards: a VideoObject (the embedded explainer video) and the site-wide Organization block. There is no FinancialProduct, CreditCard, or Product schema embedded — verified 2026-05-18. Do not try to read card data from JSON-LD. Parse the rendered card grid./CreditCardDetailAJAX, /compareajax, /structured-content-renderer, /api/, /cc-prequal-service/, /janitor/, /identity/, and /redirect/ — these endpoints exist internally but are locked. Direct probes (2026-05-18): /wp-json/wp/v2/pages?slug=... → 404, /api/credit-cards → 404, /compareajax?ids=... → 404, /structured-content-renderer?path=... → 405 (POST-only and likely auth-gated). Don't waste cycles on API-discovery — there isn't a usable one./card-finder-jump is a separate surface. It's a multi-step questionnaire (credit-score → spend categories → annual-fee tolerance → reward preference) that produces a personalized recommendation page rather than the editorial category page. It overlaps the filter surface in the task spec but is not the comparison surface — different data shape (one ranked recommendation + 2–3 alternates rather than a sorted grid of 10–20). If the caller's input includes both a category intent and personalization signals ("rebuild credit, low income, no annual fee, monthly rent payments to build score"), the quiz path is more accurate; but it's interaction-heavy and not described here. Default to the category-page path.__cf_bm, _cfuvid, nws4) issued on first request. A bare-cookie second request to the same domain in the same session is fine — CF sees the cookies and waves you through. If you rotate sessions per-card, expect a fresh challenge each time; pooling card fetches in a single session is significantly faster.bb sessions create returns a connect URL on connect.usw2.browserbase.com (or regional equivalent). This is the WebSocket endpoint your browse --remote driver attaches to — it is not reachable from sandboxes that allowlist only api.browserbase.com for outbound. If browse open --remote returns getaddrinfo ENOTFOUND connect.usw2.browserbase.com, your runtime's network policy is too restrictive and you have to use bb fetch only (which means you're limited to the sub-1MB pages — see fallback section above).?sort=... query params are inconsistently honored. A handful of category pages respect ?sort=annual_fee_asc, ?sort=intro_apr_length, etc., but most ignore unknown params and render the editorial default. The visible UI sort dropdown drives a client-side rerender via JS state — it does NOT update the URL on most templates. Sort and filter client-side after parsing.m.nerdwallet.com mobile-subdomain returns 500. Don't try the mobile variant as a "lighter" fetch — the route is broken or removed./credit-cards/best/travel/amp returns 404. Don't waste time looking for an AMP path.https://www.nerdwallet.com/redirect/...?... or https://www.nerdwallet.com/cct/.... They 302 through partners.nerdwallet.com to the issuer's actual application URL. Capture the NerdWallet-hosted href in the output — that's the de-facto canonical "Apply" link for the card; don't try to resolve it to the underlying issuer URL by following the chain (a) it's affiliate-tracked and (b) following the chain triggers ad-network beacons.estimated_value_usd_source: 'nerdwallet_editorial' so the caller knows it's not from the issuer.https://www.nerdwallet.com/sitemaps/us/wp-sitemap-posts-credit-cards-pages-1.xml enumerates every /credit-cards/best/{slug} and /credit-cards/reviews/{slug} URL NerdWallet considers canonical. ~13 KB. Re-fetch periodically (slugs do change — NerdWallet retires deprecated categories and adds new co-branded slugs at the start of each year).www.nerdwallet.com/cdn/... and www.nerdwallet.com/tachyon/... — both are CDN paths. They serve raster + WebP via srcset; pick the first 1x raster src for the primary URL.Two output shapes — list (category-page input) and single (review-page input):
// Category / list mode — input was a category intent, full /credit-cards/best/{slug} URL, or free-form criteria
{
"mode": "list",
"source_url": "https://www.nerdwallet.com/credit-cards/best/travel",
"category_slug": "travel",
"category_label": "Best Travel Credit Cards",
"last_reviewed_page_level": "2026-05-06",
"applied_filters": {
"annual_fee_max": null,
"credit_score_required": null,
"issuer": null,
"network": null,
"rewards_type": null,
"foreign_transaction_fee_none": false,
"intro_apr_min_months": null
},
"sort": "editorial_default",
"count": 12,
"cards": [
{
"name": "Chase Sapphire Preferred® Card",
"issuer": "Chase",
"network": "Visa",
"review_url": "https://www.nerdwallet.com/credit-cards/reviews/chase-sapphire-preferred",
"card_art_url": "https://www.nerdwallet.com/cdn/.../chase-sapphire-preferred.png",
"nerdwallet_rating": 5.0,
"rating_label": "Rated 5 out of 5 stars",
"best_for_tag": "Best for travel rewards",
"why_we_like_it": "If you want a great mix of …",
"why_we_dont": "If you'd rather pay zero …",
"annual_fee": { "raw": "$95", "amount_usd": 95 },
"intro_apr": {
"purchases": { "raw": "None", "rate_percent": null, "duration_months": null },
"balance_transfers": { "raw": "None", "rate_percent": null, "duration_months": null }
},
"regular_apr": { "raw": "20.49% – 27.49% Variable", "min_percent": 20.49, "max_percent": 27.49 },
"welcome_bonus": {
"raw": "Earn 60,000 bonus points after you spend $4,000 on purchases in the first 3 months from account opening",
"amount": 60000,
"currency": "points",
"spend_required_usd": 4000,
"spend_window_months": 3,
"estimated_value_usd": 750,
"estimated_value_usd_source": "nerdwallet_editorial"
},
"rewards": [
{ "category": "Travel purchased through Chase Travel", "rate": "5x", "cap": null, "raw": "5x on travel purchased through Chase Travel" },
{ "category": "Dining", "rate": "3x", "cap": null, "raw": "3x on dining" },
{ "category": "Online grocery", "rate": "3x", "cap": null, "raw": "3x on online grocery (excluding Target/Walmart/wholesale)" },
{ "category": "Streaming", "rate": "3x", "cap": null, "raw": "3x on select streaming services" },
{ "category": "Other travel", "rate": "2x", "cap": null, "raw": "2x on all other travel" },
{ "category": "Everything else", "rate": "1x", "cap": null, "raw": "1x on everything else" }
],
"foreign_transaction_fee": { "raw": "None", "percent": 0 },
"balance_transfer_fee": { "raw": "Either $5 or 5% of the amount of each transfer, whichever is greater" },
"late_payment_fee": { "raw": "Up to $40" },
"credit_score_required": { "raw": "Excellent, Good", "tier_min": "Good (690-719)" },
"key_benefits": [
"Trip cancellation/interruption insurance",
"Primary rental car coverage (within US)",
"$50 annual Chase Travel hotel credit",
"10% anniversary points boost",
"No foreign transaction fees"
],
"pro
Prerequisites
Time Estimate
15-45 minutes depending on use case complexity
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.
✗ Avoid when
Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.
nav.com/get-smb-funding-2s1rpm
booking.com/search-hotels-asq6cc
explainx/design-an-interface
aliexpress.com/search-product-p0h8a7
google.com/search-flights-ts4g1f
shopee.com.my/search-products-5epzg0
We added compare-credit-cards from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
Useful defaults in compare-credit-cards — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
Keeps context tight: compare-credit-cards is the kind of skill you can hand to a new teammate without a long onboarding doc.
compare-credit-cards has been reliable in day-to-day use. Documentation quality is above average for community skills.
I recommend compare-credit-cards for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
Solid pick for teams standardizing on skills: compare-credit-cards is focused, and the summary matches what you get after install.
compare-credit-cards fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
Keeps context tight: compare-credit-cards is the kind of skill you can hand to a new teammate without a long onboarding doc.
compare-credit-cards reduced setup friction for our internal harness; good balance of opinion and flexibility.
Solid pick for teams standardizing on skills: compare-credit-cards is focused, and the summary matches what you get after install.
showing 1-10 of 37