List credit transactions
Purchases from the website and the App Store, plan payments, welcome credits, refunds and expiries (newest first, up to 100), plus credits used per day over the last 30 days.
GET
https://api.switchfile.io/v1/account/transactionsExample
Request
curl "https://api.switchfile.io/v1/account/transactions" \
-H "Authorization: Bearer $SWITCHFILE_API_KEY"const res = await fetch("https://api.switchfile.io/v1/account/transactions", {
headers: {
Authorization: `Bearer ${process.env.SWITCHFILE_API_KEY}`,
},
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
console.log(await res.json());<?php
$ch = curl_init('https://api.switchfile.io/v1/account/transactions');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('SWITCHFILE_API_KEY'),
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException("HTTP $status: $response");
}
print_r(json_decode($response, true));import os
import requests
res = requests.get(
"https://api.switchfile.io/v1/account/transactions",
headers={"Authorization": f"Bearer {os.environ['SWITCHFILE_API_KEY']}"},
)
res.raise_for_status()
print(res.json())Responses
200OK
dataobject[]requireddata[].atstringrequiredISO 8601 timestamp
data[].balance_afterstring (integer) | integerrequireddata[].creditsstring (integer) | integerrequiredPositive: added; negative: taken off
data[].expires_atstring | nullrequiredISO 8601 timestamp
data[].idstringrequireddata[].kindstringrequiredone of "purchase", "subscription", "expire", "welcome", "welcome_expire", "grant", "refund", "frozen"
data[].receiptobject | nullrequiredOur receipt for web purchases; App Store purchases have Apple's receipt
data[].receipt.numberstringrequireddata[].receipt.urlstringrequiredReceipt and contract documents in the dashboard
data[].sourcestring | nullrequiredone of "web", "app_store"
usage_by_dayobject[]requiredDays of the last 30 with credits used, newest first
usage_by_day[].creditsstring (integer) | integerrequiredusage_by_day[].daystringrequiredYYYY-MM-DD (UTC)
usage_by_day[].filesstring (integer) | integerrequired
200 application/json{ "data": [ { "id": "41", "at": "2026-11-06T18:00:02+00:00", "kind": "purchase", "credits": 1000, "balance_after": 1240, "expires_at": null, "source": "app_store", "receipt": null }, { "id": "17", "at": "2026-11-06T18:00:00+00:00", "kind": "purchase", "credits": 1000, "balance_after": 1100, "expires_at": null, "source": "web", "receipt": { "number": "SF-000123", "url": "https://switchfile.io/dashboard/billing" } } ], "usage_by_day": [ { "day": "2026-11-06", "files": 7, "credits": 12 } ] }401The API key is missing or not valid
UNAUTHENTICATED401 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-unauthenticated", "title": "Unauthenticated", "status": 401, "code": "UNAUTHENTICATED", "detail": "Missing or invalid API key." }403Not available with a service key or a connected app
NOT_AVAILABLE403 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-not-available", "title": "Not available", "status": 403, "code": "NOT_AVAILABLE", "detail": "This endpoint is only available with your own API key or the switchfile app." }404Does not exist for this account
NOT_FOUND404 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-not-found", "title": "Not found", "status": 404, "code": "NOT_FOUND", "detail": "Not found." }422Invalid data. errors names the fields
INVALID_DATA422 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-invalid-data", "title": "Invalid data", "status": 422, "code": "INVALID_DATA", "detail": "The request contains invalid data.", "errors": { "to": [ "Expected string" ] } }429Too many requests or a daily quota is used up. See Retry-After
RATE_LIMIT_EXCEEDED429 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-rate-limit-exceeded", "title": "Rate limit exceeded", "status": 429, "code": "RATE_LIMIT_EXCEEDED", "detail": "Too many requests. Try again in 12 seconds." }