mcpField
A
awardwallet

awardwallet

github.com/borskiOther78070 installsUpdated 2d ago
Repository

About awardwallet

awardwallet is a travel-planning skill that queries loyalty balances, elite status, and account activity through the AwardWallet Business Account Access API. It is intended for users with a Business account and credentials for connected accounts.

Key features

  1. 01Retrieve connected account balances
  2. 02View elite status and account properties
  3. 03Fetch full transaction history
  4. 04Retrieve saved travel itineraries
  5. 05List supported providers

Use cases

  1. 01Summarize airline and card points before trip planning
  2. 02Review recent loyalty account transactions
  3. 03Check itinerary details for a date range

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/borski/travel-hacking-toolkit --skill awardwallet

After installing, type/awardwalletin Claude Code to confirm it loaded.

Details

From the project README

AwardWallet Skill

Query loyalty program balances, elite status, and transaction history via the AwardWallet Business Account Access API.

Source: business.awardwallet.com — Requires a Business account.

Authentication

Set these in your .env file:

All requests use the X-Authentication header.

First-time setup gotcha: AwardWallet enforces an IP allowlist on Business API keys. Without your IP whitelisted, every call returns {"error": "access_denied", "code": "IP_DENIED"}. Whitelist before troubleshooting.

  • Where to whitelist: https://business.awardwallet.com/profile/api
  • How to find your IP: curl ifconfig.me
  • Multi-IP: home, office, hotspot, VPN exit nodes, and any travel locations each need their own entry. Easiest is to whitelist a /24 if you're on a stable residential ISP.
Error signatures
ResponseMeaningFix
{"error": "access_denied", "code": "IP_DENIED"}IP not on allowlistWhitelist current IP at the developer portal
Unauthorized / 401Bad keyRegenerate key
Empty accounts arrayUser ID wrong or no connectionsVerify AWARDWALLET_USER_ID

API Base

https://business.awardwallet.com/api/export/v1

Quick Start: Get All Balances

curl -s -H "X-Authentication: $AWARDWALLET_API_KEY" \
  "https://business.awardwallet.com/api/export/v1/connectedUser/$AWARDWALLET_USER_ID" | jq '.accounts'
Response Fields

Each account object contains:

FieldDescription
accountIdUnique ID for deep dive
codeProvider code (e.g., "united", "chase", "amex")
displayNameHuman name (e.g., "United Airlines (MileagePlus)")
kindCategory: Airlines, Hotels, Credit Cards, etc.
balanceFormatted balance string
balanceRawNumeric balance
propertiesArray with status, account number, expiration, etc.
historyLast 10 transactions (call /account/{id} for full history)
errorCode1 = successfully updated, 2 = invalid creds, etc.
Useful jq Filters

All filters below assume the curl output is piped in. Replace ... with the full curl command above.

# Just airline balances with status
... | jq '[.accounts[] | select(.kind == "Airlines") | {name: .displayName, balance: .balanceRaw, status: ((.properties // [])[] | select(.kind == 3) | .value) // "none"}]'

# Just hotel balances with status
... | jq '[.accounts[] | select(.kind == "Hotels") | {name: .displayName, balance: .balanceRaw, status: ((.properties // [])[] | select(.kind == 3) | .value) // "none"}]'

# Just credit card / transferable points
... | jq '[.accounts[] | select(.kind == "Credit Cards") | {name: .displayName, balance: .balanceRaw}]'

# All balances sorted by amount (descending), non-zero only
... | jq '[.accounts[] | {name: .displayName, kind: .kind, balance: .balanceRaw} | select(.balance > 0)] | sort_by(-.balance)'

# Elite status across all programs
... | jq '[.accounts[] | {name: .displayName, status: ((.properties // [])[] | select(.kind == 3) | .value) // null} | select(.status != null)]'

# Accounts with errors (need password update, etc.)
... | jq '[.accounts[] | select(.errorCode != 1) | {name: .displayName, error: .errorCode}]'

# Combined summary for trip planning (airlines + transferable points, non-zero, sorted)
... | jq '[.accounts[] | select((.kind == "Airlines" or .kind == "Credit Cards") and .balanceRaw > 0) | {name: .displayName, kind: .kind, balance: .balanceRaw, status: ((.properties // [])[] | select(.kind == 3) | .value) // null}] | sort_by(-.balance)'

Deep Dive: Full Account History

For full transaction history (beyond last 10):

curl -s -H "X-Authentication: $AWARDWALLET_API_KEY" \
  "https://business.awardwallet.com/api/export/v1/account/{accountId}" | jq '.account[0].history'

Travel Timeline

Get saved itineraries for a connected user:

curl -s -H "X-Authentication: $AWARDWALLET_API_KEY" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"start": "2026-01-01", "end": "2027-01-01"}' \
  "https://business.awardwallet.com/api/export/v1/travel-timeline/$AWARDWALLET_USER_ID" | jq '.itineraries'

List All Supported Providers

curl -s -H "X-Authentication: $AWARDWALLET_API_KEY" \
  "https://business.awardwallet.com/api/export/v1/providers/list" | jq '.'

Account Property Kinds

When parsing properties arrays, these kind values are standardized:

KindMeaning
1Account number
2Expiration
3Elite status
4Lifetime points
5Member since
6Expiring balance
7YTD Miles/Points
8YTD Segments
9Next elite level
10Points needed to next level
11Segments needed to next level
12Name
13Last activity
14Points needed for next reward
15Status expiration
16Points to retain status
17Segments to retain status
18Alliance elite level
19Status miles/points

Error Codes

CodeMeaning
0Never updated
1Success
2Invalid credentials
3Locked out
4Provider error or user action needed
5Provider disabled by AwardWallet
6Parse failure
7Password missing
8Disabled to prevent lockouts
9Success with warning
10Security question needed
11Timed out

Workflow: Trip Planning Summary

When planning a trip, run this workflow:

  1. Pull all accounts
  2. Filter to Airlines and Credit Cards (transferable points)
  3. Show a clean summary: program name, balance, elite status
  4. Note any accounts with errors that might need updating
  5. Cross reference with transfer partners for the destination

Notes

  • History in user/member detail responses is capped at 10 records. Use /account/{id} for full history.
  • balanceRaw is the numeric value. balance is formatted with commas.
  • Connected users control their own access level. If data seems limited, they may have restricted sharing.
  • SubAccounts exist for programs like Capital One where one login has multiple cards. Check subAccounts array.

Comments

Markdown supported