curl --request GET \
--url https://laso.finance/get-card-data \
--header 'Authorization: <api-key>'import requests
url = "https://laso.finance/get-card-data"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://laso.finance/get-card-data', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://laso.finance/get-card-data",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://laso.finance/get-card-data"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://laso.finance/get-card-data")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://laso.finance/get-card-data")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"card_id": "<string>",
"card_type": "Non-Reloadable U.S.",
"usd_amount": 123,
"country": "US",
"label": "<string>",
"charged_usd_amount": 123,
"fees_paid": 123,
"state": "queued",
"balance_update_requested_timestamp": 123,
"queued_order_card_id": "<string>",
"timestamp": 123,
"timestamp_readable": "<string>",
"last_updated_timestamp": 123,
"status": "pending",
"card_details": {
"card_number": "<string>",
"exp_month": "<string>",
"exp_year": "<string>",
"cvv": "<string>",
"available_balance": 123,
"billing_address": {
"name": "<string>",
"line_1": "<string>",
"line_2": "<string>",
"city": "<string>",
"state": "<string>",
"zip": "<string>",
"country": "<string>",
"required": true,
"note": "<string>"
}
},
"transactions": [
{
"amount": 123,
"date": "<string>",
"description": "<string>",
"is_credit": true
}
],
"last4": "8260",
"expiry": "07/31",
"balance": 208,
"spend_limit": 208,
"reusable": true,
"issuer_status": "OPEN",
"created_at": 123,
"expires_at": 123,
"details_approval": {
"status": "pending",
"approval_id": "<string>",
"note": "<string>"
},
"details_error": "<string>"
}{
"error": "card_type must be \"Non-Reloadable\" or \"Non-Reloadable International\" when provided. Received: foo"
}{
"error": "Missing or invalid Authorization header"
}{
"error": "Not authorized to view this card"
}{
"error": "Card not found"
}Get card details
Returns the current status and details of card orders. If card_id is provided, returns a single card, looked up across U.S. non-reloadable, international non-reloadable, and reloadable cards. If omitted, returns all cards of the given card_type for the authenticated user; card_type defaults to Non-Reloadable U.S. when omitted, so existing callers see unchanged behavior. Pass card_type=Non-Reloadable International to list international cards, or card_type=Reloadable to list reloadable cards.
For U.S. non-reloadable cards, details take ~7-10 seconds to become available after ordering; poll every 2-3 seconds until status is "ready", then read card_details. For international non-reloadable cards, the order is queued until an admin fulfills it (typically within 24 hours), after which card_details is populated.
For international cards, the card_id returned by /order-intl-card is a queue id. After admin fulfillment, the issuer’s transaction id becomes the new card_id and the original queue id is preserved on the card as queued_order_card_id. You can keep polling /get-card-data?card_id=<original-queue-id> and it will resolve to the fulfilled card.
Reloadable cards are a separate product, set up by the account holder in the Laso dashboard rather than ordered through this API. They are reusable (a multi_use card stays open across charges until its limit is spent) and can be topped up, unlike the single-load non-reloadable cards. Listing them returns balance, spend_limit, last4, expiry, and reusable. If the wallet has no card issuer account linked, the list is empty and a note explains how the holder sets one up.
Reading a reloadable card’s number and CVV is gated by the card issuer, and which gate applies depends on who issued it. Request the card by card_id; the response carries exactly one of three fields. card_details is the normal result for a card created through /create-reloadable-card, which Laso issues on the holder’s behalf and can read for them directly — no approval step is involved. details_approval with status: "pending" and an approval_id appears only for a card the holder created in a DIFFERENT app: the issuer has emailed them an approve/deny link, and once they approve you retry as GET /get-card-data?card_id=<CARD_ID>&approval_id=<APPROVAL_ID> to receive card_details. details_error means the issuer could not return the number; retry shortly, and if it persists the holder can read the card in the dashboard. Spend the card by entering its number, expiry, and CVV at the merchant’s checkout. billing_address is null on these cards and always will be — the issuer holds no billing address for a card. If a merchant requires one, use the address the account holder gave at identity verification (ask them; do not guess), since these cards are AVS-checked against it and a mismatch is the most common decline on a card that has funds. A card with reusable: true stays open after an approved charge and can be spent again up to its remaining balance; a charge larger than the balance is declined in full, as there are no partial approvals.
Requires a Bearer token from /auth or /get-card.
curl --request GET \
--url https://laso.finance/get-card-data \
--header 'Authorization: <api-key>'import requests
url = "https://laso.finance/get-card-data"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://laso.finance/get-card-data', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://laso.finance/get-card-data",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://laso.finance/get-card-data"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://laso.finance/get-card-data")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://laso.finance/get-card-data")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"card_id": "<string>",
"card_type": "Non-Reloadable U.S.",
"usd_amount": 123,
"country": "US",
"label": "<string>",
"charged_usd_amount": 123,
"fees_paid": 123,
"state": "queued",
"balance_update_requested_timestamp": 123,
"queued_order_card_id": "<string>",
"timestamp": 123,
"timestamp_readable": "<string>",
"last_updated_timestamp": 123,
"status": "pending",
"card_details": {
"card_number": "<string>",
"exp_month": "<string>",
"exp_year": "<string>",
"cvv": "<string>",
"available_balance": 123,
"billing_address": {
"name": "<string>",
"line_1": "<string>",
"line_2": "<string>",
"city": "<string>",
"state": "<string>",
"zip": "<string>",
"country": "<string>",
"required": true,
"note": "<string>"
}
},
"transactions": [
{
"amount": 123,
"date": "<string>",
"description": "<string>",
"is_credit": true
}
],
"last4": "8260",
"expiry": "07/31",
"balance": 208,
"spend_limit": 208,
"reusable": true,
"issuer_status": "OPEN",
"created_at": 123,
"expires_at": 123,
"details_approval": {
"status": "pending",
"approval_id": "<string>",
"note": "<string>"
},
"details_error": "<string>"
}{
"error": "card_type must be \"Non-Reloadable\" or \"Non-Reloadable International\" when provided. Received: foo"
}{
"error": "Missing or invalid Authorization header"
}{
"error": "Not authorized to view this card"
}{
"error": "Card not found"
}Authorizations
Firebase ID token from /auth or any paid route, sent as a Bearer token: Authorization: Bearer <id_token> (the Bearer prefix is required).
Query Parameters
The card ID returned from /get-card or /order-intl-card, or a reloadable card's id from card_type=Reloadable. Looked up across all three card types. If omitted, returns all cards of card_type.
When listing all cards (no card_id), filters by card type. Defaults to Non-Reloadable U.S. if omitted (preserves existing client behavior). Pass Non-Reloadable International to list international cards, or Reloadable to list reloadable cards.
Non-Reloadable U.S., Non-Reloadable International, Reloadable Reloadable cards only, and only for a card the account holder created in a DIFFERENT app: pass the approval_id from a prior details_approval response once they have approved it. Cards created through /create-reloadable-card are Laso-issued and never require this.
Response
Card status and details. Returns a single CardData object when card_id is provided, or { "cards": CardData[] } when omitted.
- Option 1
- Option 2
Response from /get-card-data. Three card types share this shape and each populates a different subset.
Non-reloadable (U.S. and International): when status is ready, card_details carries the number, CVV, and expiry. International cards add label, charged_usd_amount, fees_paid, state, balance_update_requested_timestamp, and queued_order_card_id.
Reloadable: returns last4, expiry, balance, spend_limit, reusable, issuer_status, created_at, and expires_at instead of the usd_amount/timestamp fields above. Reading its number and CVV is gated by the card issuer, so exactly one of card_details, details_approval, or details_error is present on a single-card lookup.
Non-Reloadable U.S., Non-Reloadable International, Reloadable U.S. cards only.
"US"
International cards only. User-supplied label, may be empty.
International cards only. Amount the user was charged including fees.
International cards only. Fees paid for this card.
International cards only. Raw card state.
queued, redeemable, complete, refund-requested, refund-requested-approved-for-queue, archived, refunded International cards only. Unix timestamp (ms) of an outstanding admin balance update request, or null if none is pending.
International cards only. The original card_id returned by /order-intl-card. After admin fulfillment the card is reissued with a new card_id (the issuer's transaction id); querying /get-card-data?card_id=<original> continues to resolve to the fulfilled card via this field.
U.S. cards only. Unix timestamp (ms) of the last time card data was refreshed.
pending, ready, queued, complete, refund-requested, refunded, archived Only present when status is ready (U.S.) or complete (international).
Show child attributes
Show child attributes
Card transaction history. U.S. and international cards use slightly different shapes — see CardTransaction and IntlCardTransaction.
U.S. prepaid card transaction.
- Option 1
- Option 2
Show child attributes
Show child attributes
Reloadable cards only. Last four digits.
"8260"
Reloadable cards only. MM/YY.
"07/31"
Reloadable cards only. Spendable balance in dollars.
208
Reloadable cards only. Spend cap in dollars.
208
Reloadable cards only. True for a multi-use card.
Reloadable cards only. The issuer's own status string, kept verbatim.
"OPEN"
Reloadable cards only. Epoch milliseconds.
Reloadable cards only. Epoch milliseconds, or null when the card does not expire.
Reloadable cards only, and only for a card the holder created in ANOTHER app. The issuer has emailed them an approve/deny link; retry with approval_id once they approve. Cards created through /create-reloadable-card are Laso-issued and never take this path.
Show child attributes
Show child attributes
Reloadable cards only. Present when the issuer could not return the number, so a card with no card_details is never silently indistinguishable from one whose details are pending.
Was this page helpful?