# 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/transactions`

Needs an API key: `Authorization: Bearer YOUR_API_KEY`. See [Authentication](https://switchfile.io/docs/authentication).

## Example

cURL:

```bash
curl "https://api.switchfile.io/v1/account/transactions" \
  -H "Authorization: Bearer $SWITCHFILE_API_KEY"
```

Node.js:

```js
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:

```php
<?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));
```

Python:

```python
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

### 200: OK

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | object[] | yes |  |
| `data[].at` | string | yes | ISO 8601 timestamp |
| `data[].balance_after` | string (integer) \| integer | yes |  |
| `data[].credits` | string (integer) \| integer | yes | Positive: added; negative: taken off |
| `data[].expires_at` | string \| null | yes | ISO 8601 timestamp |
| `data[].id` | string | yes |  |
| `data[].kind` | string | yes | (one of "purchase", "subscription", "expire", "welcome", "welcome_expire", "grant", "refund", "frozen") |
| `data[].receipt` | object \| null | yes | Our receipt for web purchases; App Store purchases have Apple's receipt |
| `data[].receipt.number` | string | yes |  |
| `data[].receipt.url` | string | yes | Receipt and contract documents in the dashboard |
| `data[].source` | string \| null | yes | (one of "web", "app_store") |
| `usage_by_day` | object[] | yes | Days of the last 30 with credits used, newest first |
| `usage_by_day[].credits` | string (integer) \| integer | yes |  |
| `usage_by_day[].day` | string | yes | YYYY-MM-DD (UTC) |
| `usage_by_day[].files` | string (integer) \| integer | yes |  |

Example (application/json):

```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
    }
  ]
}
```

### 401: The API key is missing or not valid (`UNAUTHENTICATED`)

Example (application/problem+json):

```json
{
  "type": "https://switchfile.io/docs/api/v1#errors-unauthenticated",
  "title": "Unauthenticated",
  "status": 401,
  "code": "UNAUTHENTICATED",
  "detail": "Missing or invalid API key."
}
```

### 403: Not available with a service key or a connected app (`NOT_AVAILABLE`)

Example (application/problem+json):

```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."
}
```

### 404: Does not exist for this account (`NOT_FOUND`)

Example (application/problem+json):

```json
{
  "type": "https://switchfile.io/docs/api/v1#errors-not-found",
  "title": "Not found",
  "status": 404,
  "code": "NOT_FOUND",
  "detail": "Not found."
}
```

### 422: Invalid data. errors names the fields (`INVALID_DATA`)

Example (application/problem+json):

```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"
    ]
  }
}
```

### 429: Too many requests or a daily quota is used up. See Retry-After (`RATE_LIMIT_EXCEEDED`)

Example (application/problem+json):

```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."
}
```

Error bodies and codes are explained in [Errors](https://switchfile.io/docs/errors).
