{"openapi":"3.1.0","info":{"title":"Laso Finance x402 API","version":"1.0.0","description":"Payment-gated API for Laso Finance. All paywalled routes use the x402 protocol \u2014 the caller includes a USDC payment header on Base (eip155:8453) or Solana (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp) and the server verifies payment before processing. Free routes require no payment header.\n\n## Getting started\n\nTo set up a wallet for making x402 payments, read https:\/\/paywithlocus.com\/SKILL.md and follow the instructions to set up Locus.\n\n## How x402 works\n\n1. Call a paywalled endpoint without a payment header \u2192 receive a `402 Payment Required` response containing payment details (price, recipient address, network).\n2. Construct an x402 payment header using the details from the 402 response.\n3. Replay the request with the payment header \u2192 the server verifies payment and processes the request.\n\n## Authentication flow\n\nMost routes return auth credentials (`id_token`, `refresh_token`, `expires_in`). Use the `id_token` as a Bearer token to call authenticated Laso Finance endpoints like `\/get-card-data`. When the `id_token` expires, use `POST \/auth` with `grant_type: refresh_token` to get a new one.\n\n## Important notes\n\nThe `\/get-card` prepaid card endpoint is US only. The card is issued in USD and can only be used at US-based merchants for US purchases. Physical goods must ship to a US address. This endpoint is for the caller's own use. ","guidance":"For step-by-step instructions, read https:\/\/laso.finance\/SKILL.md"},"servers":[{"url":"https:\/\/laso.finance","description":"Production"}],"paths":{"\/auth":{"get":{"operationId":"getAuth","summary":"Get auth credentials","description":"Pay $0.001 USDC to receive an ID token, refresh token, and user ID. Use the ID token as a Bearer token to call Laso Finance APIs.","x-x402":[{"price":"$0.001","scheme":"exact","network":"eip155:8453","payTo":"0x3291e96b3bff7ed56e3ca8364273c5b4654b2b37"},{"price":"$0.001","scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","payTo":"3MZVk97x9SeRxbYpc3jhzRfU2fyA3emYutnqfn9kNfYX"}],"x-payment-info":{"pricingMode":"fixed","price":"0.001","protocols":["x402"]},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Auth credentials and user ID","content":{"application\/json":{"schema":{"type":"object","properties":{"auth":{"$ref":"#\/components\/schemas\/AuthCredentials"},"callable_base_url":{"type":"string","example":"https:\/\/us-central1-kyc-ts.cloudfunctions.net"},"user_id":{"type":"string","description":"The user's ID (lowercase wallet address)"}}}}}},"400":{"description":"No payer address found in payment header","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"402":{"description":"Payment required \u2014 response body contains x402 payment details"}}},"post":{"operationId":"refreshToken","summary":"Refresh an ID token","description":"Exchange a refresh token for a new ID token. This is a free endpoint \u2014 no x402 payment required. Uses the standard OAuth2 `grant_type=refresh_token` pattern.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["grant_type","refresh_token"],"properties":{"grant_type":{"type":"string","enum":["refresh_token"],"description":"Must be \"refresh_token\""},"refresh_token":{"type":"string","description":"The refresh token received from a previous \/auth or \/get-card call"}}}}}},"responses":{"200":{"description":"Refreshed auth credentials and user ID","content":{"application\/json":{"schema":{"type":"object","properties":{"id_token":{"type":"string","description":"New ID token \u2014 use as Bearer token for Laso Finance APIs"},"refresh_token":{"type":"string","description":"New refresh token \u2014 use for the next refresh"},"expires_in":{"type":"string","description":"Token lifetime in seconds"},"user_id":{"type":"string","description":"The user's ID (lowercase wallet address)"}}}}}},"400":{"description":"Invalid or missing grant_type or refresh_token","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"401":{"description":"Token is invalid or revoked","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/get-card":{"get":{"operationId":"getCard","summary":"Order a prepaid card","description":"Pay between $5\u2013$1000 USDC to order a Laso Finance prepaid card. By default returns JSON with auth credentials and card info (for AI agents). Pass `format=html` to get an HTML redirect to the card redemption URL (for browser-based flows).\n\nThe JSON response includes a `card.status` of `\"pending\"`. Card details (number, CVV, etc.) take ~7-10 seconds to become available. Poll `getCardData` at the `callableBaseUrl` to check when `status` becomes `\"ready\"`.\n\n**US only.** This card is issued in USD and can only be used for purchases at US-based merchants. Physical goods must ship to a US address. This endpoint is intended for the caller's own use \u2014 the card is non-transferable.","x-x402":[{"price":"dynamic","priceRange":"$5\u2013$1000","scheme":"exact","network":"eip155:8453","payTo":"0x3291e96b3bff7ed56e3ca8364273c5b4654b2b37"},{"price":"dynamic","priceRange":"$5\u2013$1000","scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","payTo":"3MZVk97x9SeRxbYpc3jhzRfU2fyA3emYutnqfn9kNfYX"}],"x-payment-info":{"pricingMode":"range","minPrice":"5","maxPrice":"1000","protocols":["x402"]},"parameters":[{"name":"amount","in":"query","required":true,"description":"USD amount to load on the card (min $5, max $1000)","schema":{"type":"number","minimum":5,"maximum":1000}},{"name":"format","in":"query","required":false,"description":"Response format. `json` (default) returns auth credentials and card info for agents. `html` returns a redirect page for browsers.","schema":{"type":"string","enum":["json","html"],"default":"json"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["amount"],"properties":{"amount":{"type":"number","minimum":5,"maximum":1000,"description":"USD amount to load on the card"},"format":{"type":"string","enum":["json","html"],"default":"json","description":"Response format. json (default) for agents, html for browsers."}}}}}},"responses":{"200":{"description":"Card order response. JSON by default, or HTML redirect if `format=html`.","content":{"application\/json":{"schema":{"type":"object","properties":{"auth":{"$ref":"#\/components\/schemas\/AuthCredentials"},"callable_base_url":{"type":"string","example":"https:\/\/us-central1-kyc-ts.cloudfunctions.net"},"user_id":{"type":"string","description":"The user's ID (lowercase wallet address)"},"card":{"$ref":"#\/components\/schemas\/CardOrder"}}}},"text\/html":{"schema":{"type":"string","description":"HTML page with meta-refresh redirect to card redemption URL (when format=html)"}}}},"400":{"description":"Invalid or missing amount","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"402":{"description":"Payment required \u2014 response body contains x402 payment details"}}}},"\/get-card-data":{"get":{"operationId":"getCardData","summary":"Get card details","description":"Returns the current status and details of card orders. If `card_id` is provided, returns a single card. If omitted, returns all cards for the authenticated user.\n\nCard details take ~7-10 seconds to become available after ordering. Poll every 2-3 seconds until `status` is `\"ready\"`, then read `card_details`.\n\nRequires a Bearer token from `\/auth` or `\/get-card`.","security":[{"BearerAuth":[]}],"parameters":[{"name":"card_id","in":"query","required":false,"description":"The card ID returned from `\/get-card`. If omitted, returns all cards for the user.","schema":{"type":"string"}}],"responses":{"200":{"description":"Card status and details. Returns a single `CardData` object when `card_id` is provided, or `{ \"cards\": CardData[] }` when omitted.","content":{"application\/json":{"schema":{"oneOf":[{"$ref":"#\/components\/schemas\/CardData"},{"type":"object","properties":{"cards":{"type":"array","items":{"$ref":"#\/components\/schemas\/CardData"}}}}]}}}},"401":{"description":"Missing or invalid Bearer token","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Not authorized to view this card","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Card not found","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/get-account-balance":{"get":{"operationId":"getAccountBalance","summary":"Get account balance","description":"Returns the current account balance and total deposits for the authenticated user.\n\nRequires a Bearer token from `\/auth` or `\/get-card`.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Account balance information","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AccountBalance"}}}},"401":{"description":"Missing or invalid Bearer token","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Account balance not found","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/withdraw":{"post":{"operationId":"withdraw","summary":"Withdraw from account balance","description":"Initiate a withdrawal from the user's account balance. The withdrawal is created in a `pending` state and will be processed by the admin flow.\n\nRequires a Bearer token from `\/auth` or `\/get-card`.","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["amount"],"properties":{"amount":{"type":"number","minimum":0.01,"description":"Amount to withdraw in USD"}}}}}},"responses":{"200":{"description":"Withdrawal initiated","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"withdrawal":{"$ref":"#\/components\/schemas\/WithdrawalRecord"}}}}}},"400":{"description":"Invalid amount or insufficient funds","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"401":{"description":"Missing or invalid Bearer token","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Account balance not found","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/get-withdrawal-status":{"get":{"operationId":"getWithdrawalStatus","summary":"Get withdrawal statuses","description":"Returns the status of withdrawals for the authenticated user. If `withdrawal_id` is provided, returns a single withdrawal. If omitted, returns all withdrawals.\n\nRequires a Bearer token from `\/auth` or `\/get-card`.","security":[{"BearerAuth":[]}],"parameters":[{"name":"withdrawal_id","in":"query","required":false,"description":"Get a specific withdrawal by ID. If omitted, returns all withdrawals.","schema":{"type":"string"}}],"responses":{"200":{"description":"Withdrawal status. Returns `{ \"withdrawal\": WithdrawalStatus }` when `withdrawal_id` is provided, or `{ \"withdrawals\": WithdrawalStatus[] }` when omitted.","content":{"application\/json":{"schema":{"oneOf":[{"type":"object","properties":{"withdrawal":{"$ref":"#\/components\/schemas\/WithdrawalStatus"}}},{"type":"object","properties":{"withdrawals":{"type":"array","items":{"$ref":"#\/components\/schemas\/WithdrawalStatus"}}}}]}}}},"401":{"description":"Missing or invalid Bearer token","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Withdrawal not found","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/refresh-card-data":{"post":{"operationId":"refreshCardData","summary":"Trigger a card data refresh","description":"Requests a re-scrape of card balance and transactions from the issuer. The card is added to a retrieval queue and processed asynchronously. Rate limited to one request per card every 5 minutes.\n\nRequires a Bearer token from `\/auth` or `\/get-card`.","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["card_id"],"properties":{"card_id":{"type":"string","description":"The card ID to refresh data for"}}}}}},"responses":{"200":{"description":"Card refresh requested successfully","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string","example":"Card refresh requested."}}}}}},"400":{"description":"Missing card_id","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"401":{"description":"Missing or invalid Bearer token","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Card not found","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"409":{"description":"Card already has a pending refresh request","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Rate limited \u2014 must wait 5 minutes between refresh requests per card","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/search-merchants":{"get":{"operationId":"searchMerchants","summary":"Search merchant spend data","description":"Search Laso's merchant database for confirmed spend data from the Non-Reloadable U.S. card. Returns whether the card was accepted, not accepted, or unknown at each merchant.\n\n**Important:** This database only contains merchants where Laso users have previously attempted a transaction. A merchant not being listed, or being listed as `unknown`, does NOT mean the card won't work there \u2014 it just means it hasn't been tried yet. If a merchant is listed as `accepted`, you can confidently use the card there. If listed as `not_accepted`, the card will fail at that merchant.\n\nRequires a Bearer token from `\/auth` or `\/get-card`.","security":[{"BearerAuth":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query \u2014 the merchant name to search for (e.g. \"amazon\", \"netflix\")","schema":{"type":"string"}}],"responses":{"200":{"description":"Merchant search results","content":{"application\/json":{"schema":{"type":"object","properties":{"merchants":{"type":"array","items":{"$ref":"#\/components\/schemas\/MerchantResult"}},"query":{"type":"string","description":"The search query that was used"},"count":{"type":"integer","description":"Number of merchants returned"},"card_type":{"type":"string","description":"The card type results are filtered for","example":"Non-Reloadable U.S."},"note":{"type":"string","description":"Important caveat about the data \u2014 this database only includes merchants where users have previously attempted transactions"}}}}}},"400":{"description":"Missing search query","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"401":{"description":"Missing or invalid Bearer token","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/get-auth-link":{"get":{"operationId":"getAuthLink","summary":"Get a login link for the web dashboard","description":"Returns a URL that a human can open in a browser to log in to the Laso Finance web dashboard as the authenticated user. Useful for humans who want to see what their AI agent has been doing (view cards, transactions, balances, etc.).\n\nRequires a Bearer token from `\/auth` or `\/get-card`.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Auth link generated","content":{"application\/json":{"schema":{"type":"object","properties":{"auth_url":{"type":"string","description":"URL to open in a browser to log in to the Laso Finance dashboard","example":"https:\/\/laso.finance\/?authToken=eyJ..."},"user_id":{"type":"string","description":"The authenticated user's ID (wallet address)","example":"0xabc..."}}}}}},"401":{"description":"Missing or invalid Bearer token","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/get-push-to-card":{"get":{"operationId":"pushToCard","summary":"Send USD to a U.S. debit card","description":"Pay USDC to initiate a push-to-card transfer. A 4.8% fee is deducted from the amount, and the remainder is sent to the debit card. For example, a $100 payment sends ~$95.41 to the card. Returns a `redemption_url` that must be opened to complete the transfer. The person completing the form must provide: sender name, U.S. debit card number, and cardholder name across a multi-step form.\n\n**U.S. only.** The debit card must be tied to a U.S. bank account. Laso cannot perform the transfer directly \u2014 the redemption URL must be visited and the debit card details entered manually (by the agent or a human).\n\n**Fee:** 4.8% (included in the payment amount, not added on top).","x-x402":[{"price":"dynamic","priceRange":"$10\u2013$9,541.98","scheme":"exact","network":"eip155:8453","payTo":"0x3291e96b3bff7ed56e3ca8364273c5b4654b2b37"},{"price":"dynamic","priceRange":"$10\u2013$9,541.98","scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","payTo":"3MZVk97x9SeRxbYpc3jhzRfU2fyA3emYutnqfn9kNfYX"}],"x-payment-info":{"pricingMode":"range","minPrice":"10","maxPrice":"9541.98","protocols":["x402"]},"parameters":[{"name":"amount","in":"query","required":true,"description":"USD amount to pay via x402 (min $10, max $9,541.98). A 4.8% fee is deducted, and the remainder is sent to the debit card.","schema":{"type":"number","minimum":10,"maximum":9541.98}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["amount"],"properties":{"amount":{"type":"number","minimum":10,"maximum":9541.98,"description":"USD amount to pay via x402. A 4.8% fee is deducted, and the remainder is sent to the debit card."}}}}}},"responses":{"200":{"description":"Push-to-card transfer initiated. Open the redemption_url to enter debit card details.","content":{"application\/json":{"schema":{"type":"object","properties":{"auth":{"$ref":"#\/components\/schemas\/AuthCredentials"},"callable_base_url":{"type":"string","example":"https:\/\/us-central1-kyc-ts.cloudfunctions.net"},"user_id":{"type":"string","description":"The user's ID (lowercase wallet address)"},"success":{"type":"boolean"},"message":{"type":"string","example":"Push-to-card transfer initiated. Open the redemption_url to enter your U.S. debit card details and complete the transfer."},"amount":{"type":"number","description":"The face value sent to the debit card (after 4.8% fee deduction)"},"amount_paid":{"type":"number","description":"The total amount paid via x402 (before fee deduction)"},"redemption_url":{"type":"string","description":"URL to open and complete the push-to-card transfer. The form requires: sender name, U.S. debit card number, and cardholder name."},"note":{"type":"string","description":"Important information about U.S.-only restriction and required form fields"}}}}}},"400":{"description":"Invalid or missing amount, or no payer address","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"402":{"description":"Payment required \u2014 response body contains x402 payment details"}}}},"\/search-gift-cards":{"get":{"operationId":"searchGiftCards","summary":"Search the gift card catalog","description":"Browse and search available gift cards. Returns a list of gift card products with pricing, denomination, and catalog information. Use the `laso_server_id` from the results to order a card via `GET \/order-gift-card`.\n\nThis is a free endpoint \u2014 no x402 payment required. Requires a Bearer token from `\/auth`.","security":[{"BearerAuth":[]}],"parameters":[{"name":"q","in":"query","required":false,"description":"Search query to filter gift cards by name (e.g. \"Amazon\", \"Uber\")","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"ISO 3166-1 alpha-2 country code to filter by (e.g. \"US\", \"GB\")","schema":{"type":"string"}},{"name":"currency","in":"query","required":false,"description":"Currency code to filter by (e.g. \"USD\", \"EUR\")","schema":{"type":"string"}}],"responses":{"200":{"description":"List of matching gift card products","content":{"application\/json":{"schema":{"type":"object","properties":{"gift_cards":{"type":"array","items":{"$ref":"#\/components\/schemas\/GiftCardProduct"}},"count":{"type":"integer","description":"Number of results returned"},"filters":{"type":"object","properties":{"query":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"currency":{"type":"string","nullable":true}}}}}}}},"401":{"description":"Missing or invalid Bearer token","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/order-gift-card":{"get":{"operationId":"orderGiftCard","summary":"Order a gift card","description":"Pay USDC via x402 to order a gift card. First browse the catalog via `GET \/search-gift-cards` to find the `laso_server_id` for the card you want, then call this endpoint with the amount and product ID.\n\nReturns redemption details (URL, code, and\/or PIN) depending on the gift card brand.","x-x402":[{"price":"dynamic","priceRange":"$5\u2013$9,000","scheme":"exact","network":"eip155:8453","payTo":"0x3291e96b3bff7ed56e3ca8364273c5b4654b2b37"},{"price":"dynamic","priceRange":"$5\u2013$9,000","scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","payTo":"3MZVk97x9SeRxbYpc3jhzRfU2fyA3emYutnqfn9kNfYX"}],"x-payment-info":{"pricingMode":"range","minPrice":"5","maxPrice":"9000","protocols":["x402"]},"parameters":[{"name":"amount","in":"query","required":true,"description":"Gift card face value in the product's currency (min $5, max $9,000)","schema":{"type":"number","minimum":5,"maximum":9000}},{"name":"laso_server_id","in":"query","required":true,"description":"The product identifier from the gift card catalog (GET \/search-gift-cards)","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"ISO 3166-1 alpha-2 country code (defaults to \"US\")","schema":{"type":"string","default":"US"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["amount","laso_server_id"],"properties":{"amount":{"type":"number","minimum":5,"maximum":9000,"description":"Gift card face value in the product's currency"},"laso_server_id":{"type":"string","description":"The product identifier from the gift card catalog (GET \/search-gift-cards)"},"country":{"type":"string","default":"US","description":"ISO 3166-1 alpha-2 country code"}}}}}},"responses":{"200":{"description":"Gift card ordered successfully","content":{"application\/json":{"schema":{"type":"object","properties":{"auth":{"$ref":"#\/components\/schemas\/AuthCredentials"},"callable_base_url":{"type":"string","example":"https:\/\/us-central1-kyc-ts.cloudfunctions.net"},"user_id":{"type":"string","description":"The user's ID (lowercase wallet address)"},"gift_card":{"$ref":"#\/components\/schemas\/GiftCardOrder"}}}}}},"400":{"description":"Invalid or missing parameters","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"402":{"description":"Payment required \u2014 response body contains x402 payment details"}}}},"\/refresh":{"post":{"operationId":"refreshTokenDeprecated","summary":"Refresh an ID token (deprecated)","description":"**Deprecated:** Use `POST \/auth` with `grant_type=refresh_token` instead. This endpoint is kept for backward compatibility.\n\nExchange a refresh token for a new ID token. This is a free endpoint \u2014 no x402 payment required.","deprecated":true,"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["refresh_token"],"properties":{"refresh_token":{"type":"string","description":"The refresh token received from \/auth or a previous refresh call"}}}}}},"responses":{"200":{"description":"Refreshed auth credentials and user ID","content":{"application\/json":{"schema":{"type":"object","properties":{"auth":{"$ref":"#\/components\/schemas\/AuthCredentials"},"user_id":{"type":"string","description":"The user's ID (lowercase wallet address)"}}}}}},"400":{"description":"Missing refresh_token in request body","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"401":{"description":"Token is invalid or revoked","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}}},"components":{"schemas":{"AuthCredentials":{"type":"object","properties":{"id_token":{"type":"string","description":"ID token \u2014 use as Bearer token for Laso Finance APIs"},"refresh_token":{"type":"string","description":"Use with POST \/auth (grant_type=refresh_token) to get a new id_token when it expires"},"expires_in":{"type":"string","description":"Token lifetime in seconds"}}},"CardOrder":{"type":"object","description":"Card order info returned by \/get-card. Status is always `pending` initially \u2014 poll `\/get-card-data` to check when card details are ready.","properties":{"card_id":{"type":"string"},"usd_amount":{"type":"number"},"country":{"type":"string","example":"US"},"timestamp":{"type":"number"},"timestamp_readable":{"type":"string"},"status":{"type":"string","enum":["pending"],"description":"Always `pending` at order time. Poll `\/get-card-data` to check for `ready`."}}},"CardData":{"type":"object","description":"Response from `\/get-card-data`. When `status` is `ready`, `card_details` contains the card number, CVV, and expiry.","properties":{"card_id":{"type":"string"},"usd_amount":{"type":"number"},"country":{"type":"string","example":"US"},"timestamp":{"type":"number"},"timestamp_readable":{"type":"string"},"last_updated_timestamp":{"type":"number","description":"Unix timestamp (ms) of the last time card data was refreshed."},"status":{"type":"string","enum":["pending","ready"]},"card_details":{"type":"object","description":"Only present when status is `ready`.","properties":{"card_number":{"type":"string"},"exp_month":{"type":"string"},"exp_year":{"type":"string"},"cvv":{"type":"string"},"available_balance":{"type":"number"}}},"transactions":{"type":"array","description":"Card transaction history.","items":{"$ref":"#\/components\/schemas\/CardTransaction"}}}},"CardTransaction":{"type":"object","properties":{"amount":{"type":"number"},"date":{"type":"string"},"description":{"type":"string"},"is_credit":{"type":"boolean"}}},"AccountBalance":{"type":"object","description":"Account balance information.","properties":{"user_id":{"type":"string","description":"The user's ID (lowercase wallet address)"},"balance":{"type":"number","description":"Current available balance in USD"},"total_deposits":{"type":"number","description":"Total lifetime deposits in USD"},"created_timestamp":{"type":"number"},"created_timestamp_readable":{"type":"string"}}},"WithdrawalRecord":{"type":"object","description":"A withdrawal record.","properties":{"id":{"type":"string"},"amount":{"type":"number"},"state":{"type":"string","enum":["pending"]},"timestamp":{"type":"number"},"timestamp_readable":{"type":"string"}}},"WithdrawalStatus":{"type":"object","description":"A withdrawal status record.","properties":{"id":{"type":"string"},"amount":{"type":"number"},"asset":{"type":"string","example":"USDC"},"network":{"type":"string","example":"BASE_MAINNET"},"state":{"type":"string"},"address":{"type":"string","description":"The wallet address the withdrawal is sent to"},"timestamp":{"type":"number"},"timestamp_readable":{"type":"string"},"tx_hash":{"type":"string","description":"On-chain transaction hash, present once the withdrawal is processed"},"tx_url":{"type":"string","description":"Block explorer URL for the transaction, present when tx_hash exists"}}},"MerchantResult":{"type":"object","description":"A merchant from the spend data database with its acceptance status for the Non-Reloadable U.S. card.","properties":{"name":{"type":"string","description":"Merchant name","example":"Amazon"},"url":{"type":"string","description":"Merchant website URL","example":"amazon.com"},"status":{"type":"string","enum":["accepted","not_accepted","unknown"],"description":"Whether the Non-Reloadable U.S. card is accepted at this merchant. `accepted` = confirmed working, `not_accepted` = confirmed failing, `unknown` = card type not yet tried at this merchant."},"description":{"type":"string","nullable":true,"description":"Brief description of the merchant"},"notes":{"type":"string","nullable":true,"description":"Additional notes about using the card at this merchant"}}},"GiftCardProduct":{"type":"object","description":"A gift card product from the catalog.","properties":{"laso_server_id":{"type":"string","description":"Product identifier to use when ordering via GET \/order-gift-card"},"name":{"type":"string","description":"Gift card brand name"},"description":{"type":"string"},"currency":{"type":"string","nullable":true,"example":"USD","description":"Currency code for the gift card"},"min":{"type":"number","description":"Minimum order amount"},"max":{"type":"number","description":"Maximum order amount"},"increment":{"type":"string","description":"Minimum order increment"},"denominations":{"type":"array","nullable":true,"items":{"type":"string"},"description":"If set, only these exact amounts can be ordered. Null for range-based products."},"product_image_url":{"type":"string","description":"URL of the gift card image"},"catalog_info":{"type":"object","nullable":true,"properties":{"brand_description":{"type":"string","nullable":true},"redemption_instructions":{"type":"string","nullable":true}}}}},"GiftCardOrder":{"type":"object","description":"Gift card order result with redemption details.","properties":{"card_id":{"type":"string"},"laso_server_id":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string","example":"USD"},"country":{"type":"string","example":"US"},"redemption_url":{"type":"string","nullable":true,"description":"URL to redeem the gift card (if applicable)"},"redemption_code":{"type":"string","nullable":true,"description":"Code to redeem the gift card (if applicable)"},"pin_code":{"type":"string","nullable":true,"description":"PIN code for the gift card (if applicable)"},"status":{"type":"string","enum":["completed"]},"timestamp":{"type":"number"}}},"Error":{"type":"object","properties":{"error":{"type":"string"}}}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"ID token from `\/auth` or `\/get-card`"}}}}