← LeaderboardThe Skill Leaderboard

awardwallet

Query AwardWallet for loyalty program balances, elite status, and transaction history. Use when checking points inventory, airline status, or planning trips on points.

Published by borski ↗borski/travel-hacking-toolkit

Try your first task

awardwallet

Start a fresh conversation. Replace the highlighted placeholders.

Use awardwallet to create a trip-planning summary for [DESTINATION_AND_DATES]: list nonzero airline and transferable-points balances, elite status, account issues, and relevant transfer-partner considerations. I have an AwardWallet Business account, connected-user access, API credentials, and an allowlisted IP.

Required inputs

  • [DESTINATION_AND_DATES]

User-approved starter prompt based on a pinned source version; check current skill requirements before running. Task evidence ↗

SKILL.md

name: awardwalletdescription: Query AwardWallet for loyalty program balances, elite status, and transaction history. Use when checking points inventory, airline status, or planning trips on points.category: loyaltysummary: All loyalty balances, elite status, history.api_key: AwardWallet Businesslicense: MIT

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.