---
title: "A month's statement"
description: "A calendar month (UTC), whatever the periods of the account's subscription: the parts it is made of (the periods that have hours in it, and the hours in no period, which are the free plan's), each with, for every meter, what was used in it, what its stretch includes, what was past that, the price and the amount, what the lines come to at the prices, what of that the stretch's credit paid and what is left of it, and what is left to pay; each meter's line for the whole month; what the parts add up to, which is what the month's usage takes from the account's balance as far as the balance goes; the credit of the month, granted, used, gone to a plan the account moved up to and lapsed; the fees of the periods that began in the month; which Credits paid, by the kind of lot, what none has paid and is owed, and what none could pay and is written off; what was added to the balance in the month and what lapsed with it; what each project used, to be held against `GET /v1/usage` (`from` and `to` the month's) with that project's key; and what the account held at the month's end. A period that lies in two months has what it owes, and what its credit paid, split between their two statements so that the two add up to it, to the millionth of a dollar. The month that is not over yet is as it stands. A month that is over does not change in what was used and what it came to, unless usage of it comes in afterwards (a node that was away): then it is not `closed` until what it comes to is taken from the balance, and is closed again within seconds. What it says paid for it changes when something it owed is paid by Credits that came later. A month the account had nothing in has nothing used. Takes `read`."
---

> Documentation Index
> Fetch the complete documentation index at: https://glac.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

Path: Glac API › Account and billing › Billing

`GET /v1/billing/statement`

A calendar month (UTC), whatever the periods of the account's subscription: the parts it is made of (the periods that have hours in it, and the hours in no period, which are the free plan's), each with, for every meter, what was used in it, what its stretch includes, what was past that, the price and the amount, what the lines come to at the prices, what of that the stretch's credit paid and what is left of it, and what is left to pay; each meter's line for the whole month; what the parts add up to, which is what the month's usage takes from the account's balance as far as the balance goes; the credit of the month, granted, used, gone to a plan the account moved up to and lapsed; the fees of the periods that began in the month; which Credits paid, by the kind of lot, what none has paid and is owed, and what none could pay and is written off; what was added to the balance in the month and what lapsed with it; what each project used, to be held against `GET /v1/usage` (`from` and `to` the month's) with that project's key; and what the account held at the month's end. A period that lies in two months has what it owes, and what its credit paid, split between their two statements so that the two add up to it, to the millionth of a dollar. The month that is not over yet is as it stands. A month that is over does not change in what was used and what it came to, unless usage of it comes in afterwards (a node that was away): then it is not `closed` until what it comes to is taken from the balance, and is closed again within seconds. What it says paid for it changes when something it owed is paid by Credits that came later. A month the account had nothing in has nothing used. Takes `read`.

## Authentication

- `apiKey`, http, header `Authorization`, scopes: `read`

## Query parameters

- `period` (`getBillingStatement.query.period`; string, optional) — The month, `YYYY-MM`, one that has begun. By default the month it is.
  - pattern `^[0-9]{4}-[0-9]{2}$`

## Code samples

### cURL

```bash
curl --request GET \
  --url https://api.glac.ai/v1/billing/statement \
  --header 'Authorization: Bearer <token>'
```

### TypeScript

```typescript
const url = 'https://api.glac.ai/v1/billing/statement';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://api.glac.ai/v1/billing/statement"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.text)
```

## Responses

### 200

The statement.

#### Example

```json
{
  "object": "billing_statement",
  "account_id": "string",
  "period": "string",
  "from": "2019-08-24T14:15:22Z",
  "to": "2019-08-24T14:15:22Z",
  "ended": true,
  "hours": 0,
  "lines": [
    {
      "item": "cpu",
      "unit": "string",
      "quantity": 0,
      "billable": 0,
      "unit_price_usd": 0,
      "price_per": "vcpu_hour",
      "amount_usd": 0,
      "regions": {
        "na": {
          "used": 0,
          "billable": 0,
          "unit_price_usd": 0,
          "amount_usd": 0
        },
        "eu": {
          "used": 0,
          "billable": 0,
          "unit_price_usd": 0,
          "amount_usd": 0
        },
        "ap": {
          "used": 0,
          "billable": 0,
          "unit_price_usd": 0,
          "amount_usd": 0
        }
      },
      "backups_gb_hours": 0
    }
  ],
  "parts": [
    {
      "from": "2019-08-24T14:15:22Z",
      "to": "2019-08-24T14:15:22Z",
      "plan": "free",
      "period": {
        "from": "2019-08-24T14:15:22Z",
        "to": "2019-08-24T14:15:22Z"
      },
      "hours": 0,
      "lines": [
        {
          "item": "cpu",
          "unit": "string",
          "quantity": 0,
          "earlier": 0,
          "included": 0,
          "billable": 0,
          "billable_earlier": 0,
          "unit_price_usd": 0,
          "price_per": "vcpu_hour",
          "units_per_price": 0,
          "amount_usd": 0,
          "regions": {
            "na": {
              "used": 0,
              "billable": 0,
              "billable_earlier": 0,
              "unit_price_usd": 0,
              "amount_usd": 0
            },
            "eu": {
              "used": 0,
              "billable": 0,
              "billable_earlier": 0,
              "unit_price_usd": 0,
              "amount_usd": 0
            },
            "ap": {
              "used": 0,
              "billable": 0,
              "billable_earlier": 0,
              "unit_price_usd": 0,
              "amount_usd": 0
            }
          }
        }
      ],
      "list_usd": 0,
      "credit": {
        "granted_usd": 0,
        "moved_usd": 0,
        "used_earlier_usd": 0,
        "used_usd": 0,
        "left_usd": 0,
        "lapses_at": "2019-08-24T14:15:22Z",
        "lapsed_usd": 0
      },
      "usage_usd": 0
    }
  ],
  "earlier_usd": 0,
  "list_usd": 0,
  "credit_used_usd": 0,
  "usage_usd": 0,
  "plan_credit": {
    "granted_usd": 0,
    "used_usd": 0,
    "moved_usd": 0,
    "lapsed_usd": 0
  },
  "fees": [
    {
      "from": "2019-08-24T14:15:22Z",
      "to": "2019-08-24T14:15:22Z",
      "plan": "p20",
      "charge_id": "string",
      "plan_fee_usd": 0,
      "credit_usd": 0,
      "amount_usd": 0
    }
  ],
  "fee_usd": 0,
  "projects": [
    {
      "id": "string",
      "name": "string",
      "cpu_seconds": 0,
      "memory_gib_seconds": 0,
      "requests": 0,
      "state_gb_hours": 0,
      "egress_bytes": 0,
      "storage_gb_hours": 0,
      "log_gb_hours": 0,
      "drive_write_bytes": 0,
      "drive_cold_read_bytes": 0,
      "object_storage_gb_hours": 0,
      "class_a_requests": 0,
      "class_b_requests": 0,
      "browser_awake_seconds": 0,
      "log_bytes": 0,
      "object_egress_bytes": 0
    }
  ],
  "prices": {
    "vcpu_hour_usd": 0,
    "memory_gib_hour_usd": 0,
    "requests_million_usd": 0,
    "state_gb_month_usd": 0,
    "egress_gb_usd": 0,
    "egress_eu_gb_usd": 0,
    "egress_ap_gb_usd": 0,
    "storage_gb_month_usd": 0,
    "logs_gb_month_usd": 0,
    "drive_write_gb_usd": 0,
    "drive_cold_read_gb_usd": 0,
    "object_storage_gb_month_usd": 0,
    "object_class_a_million_usd": 0,
    "object_class_b_million_usd": 0,
    "browser_hour_usd": 0,
    "provisional": false
  },
  "databases": [
    {
      "id": "string",
      "name": "string",
      "project_id": "string",
      "cpu_seconds": 0,
      "memory_gib_seconds": 0,
      "requests": 0,
      "state_gb_hours": 0,
      "egress_bytes": 0,
      "storage_gb_hours": 0,
      "log_gb_hours": 0,
      "drive_write_bytes": 0,
      "drive_cold_read_bytes": 0,
      "object_storage_gb_hours": 0,
      "class_a_requests": 0,
      "class_b_requests": 0,
      "browser_awake_seconds": 0,
      "history_gb_hours": 0,
      "tiered_gb_hours": 0,
      "list_usd": 0
    }
  ],
  "credits_debited": 0,
  "written_off_usd": 0,
  "paid_from": {
    "credit": 0,
    "topup": 0,
    "unpaid": 0,
    "debt_written_off": 0,
    "property1": 0,
    "property2": 0
  },
  "granted": {
    "credit": 0,
    "topup": 0,
    "property1": 0,
    "property2": 0
  },
  "lapsed": {
    "credit": 0,
    "topup": 0,
    "property1": 0,
    "property2": 0
  },
  "restored": {
    "credit": 0,
    "topup": 0,
    "property1": 0,
    "property2": 0
  },
  "taken_back": 0,
  "credits_balance": 0,
  "closed": true
}
```

- `object` (`getBillingStatement.response.200.object`; string, required)
- `account_id` (`getBillingStatement.response.200.account_id`; string, required)
- `period` (`getBillingStatement.response.200.period`; string, required)
- `from` (`getBillingStatement.response.200.from`; string, required)
  - format `date-time`
- `to` (`getBillingStatement.response.200.to`; string, required)
  - format `date-time`
- `ended` (`getBillingStatement.response.200.ended`; boolean, required)
- `hours` (`getBillingStatement.response.200.hours`; integer, required) — The hours the calendar month has.
- `lines` (`getBillingStatement.response.200.lines`; array<object>, required) — One line for each meter, of the whole month: cpu, memory, requests, state, egress, storage, logs, drive_writes, drive_cold_reads, object_storage, object_class_a, object_class_b, browsers.
  - `item` (`getBillingStatement.response.200.lines.item`; string, required)
    - one of `"cpu"`, `"memory"`, `"requests"`, `"state"`, `"egress"`, `"storage"`, `"logs"`, `"drive_writes"`, `"drive_cold_reads"`, `"object_storage"`, `"object_class_a"`, `"object_class_b"`, `"browsers"`
  - `unit` (`getBillingStatement.response.200.lines.unit`; string, required) — What the quantities are in, as `BillingMeter.unit`.
  - `quantity` (`getBillingStatement.response.200.lines.quantity`; number, required) — What the account's projects used in the month.
  - `billable` (`getBillingStatement.response.200.lines.billable`; number, required) — What of it was past what its stretch includes: the parts' added up.
  - `unit_price_usd` (`getBillingStatement.response.200.lines.unit_price_usd`; number, required)
  - `price_per` (`getBillingStatement.response.200.lines.price_per`; string, required)
    - one of `"vcpu_hour"`, `"gib_hour"`, `"million_requests"`, `"gb_month"`, `"gb"`, `"session_hour"`
  - `amount_usd` (`getBillingStatement.response.200.lines.amount_usd`; number, required) — The parts' amounts added up.
  - `regions` (`getBillingStatement.response.200.lines.regions`; object, optional) — Of `egress` alone: the line region by region (the region of the node the traffic left from).
    - `na` (`getBillingStatement.response.200.lines.regions.na`; object, required)
      - `used` (`getBillingStatement.response.200.lines.regions.na.used`; integer, required) — Bytes sent from the region's nodes (of a statement's part: in the part).
        - format `int64`; min 0
      - `billable` (`getBillingStatement.response.200.lines.regions.na.billable`; integer, required) — What of them is past what is included.
        - format `int64`; min 0
      - `unit_price_usd` (`getBillingStatement.response.200.lines.regions.na.unit_price_usd`; number, required) — The region's price of a gigabyte (10^9 bytes).
      - `amount_usd` (`getBillingStatement.response.200.lines.regions.na.amount_usd`; number, required) — What `billable` comes to at that price, to the nearest millionth.
        - min 0
    - `eu` (`getBillingStatement.response.200.lines.regions.eu`; object, required)
      - `used` (`getBillingStatement.response.200.lines.regions.eu.used`; integer, required) — Bytes sent from the region's nodes (of a statement's part: in the part).
        - format `int64`; min 0
      - `billable` (`getBillingStatement.response.200.lines.regions.eu.billable`; integer, required) — What of them is past what is included.
        - format `int64`; min 0
      - `unit_price_usd` (`getBillingStatement.response.200.lines.regions.eu.unit_price_usd`; number, required) — The region's price of a gigabyte (10^9 bytes).
      - `amount_usd` (`getBillingStatement.response.200.lines.regions.eu.amount_usd`; number, required) — What `billable` comes to at that price, to the nearest millionth.
        - min 0
    - `ap` (`getBillingStatement.response.200.lines.regions.ap`; object, required)
      - `used` (`getBillingStatement.response.200.lines.regions.ap.used`; integer, required) — Bytes sent from the region's nodes (of a statement's part: in the part).
        - format `int64`; min 0
      - `billable` (`getBillingStatement.response.200.lines.regions.ap.billable`; integer, required) — What of them is past what is included.
        - format `int64`; min 0
      - `unit_price_usd` (`getBillingStatement.response.200.lines.regions.ap.unit_price_usd`; number, required) — The region's price of a gigabyte (10^9 bytes).
      - `amount_usd` (`getBillingStatement.response.200.lines.regions.ap.amount_usd`; number, required) — What `billable` comes to at that price, to the nearest millionth.
        - min 0
  - `backups_gb_hours` (`getBillingStatement.response.200.lines.backups_gb_hours`; number, optional) — Of the line of `state` alone: how much of `quantity` the backups of the account's volumes kept in the object store (`GET /v1/usage` with `kind=backup` says it for any range); the rest is what its sleeping sandboxes kept. One meter at one price: what is included and what is billable are of both together.
    - min 0
- `parts` (`getBillingStatement.response.200.parts`; array<object>, required) — What the month is made of: the periods of the subscription that have hours in it, the earliest first, and then the hours in no period (left out where the periods cover the month and nothing was used outside them).
  - `from` (`getBillingStatement.response.200.parts.from`; string, required) — Where the part begins in the month: the period's beginning, or the month's.
    - format `date-time`
  - `to` (`getBillingStatement.response.200.parts.to`; string, required)
    - format `date-time`
  - `plan` (`getBillingStatement.response.200.parts.plan`; string, required)
    - one of `"free"`, `"p20"`, `"p100"`, `"p300"`, `"p1000"`, `"p2000"`
  - `period` (`getBillingStatement.response.200.parts.period`; object | null, required) — The period of the subscription the part is of, from its beginning to its end; null for the hours in no period.
    - `from` (`getBillingStatement.response.200.parts.period.from`; string, required)
      - format `date-time`
    - `to` (`getBillingStatement.response.200.parts.period.to`; string, required)
      - format `date-time`
  - `hours` (`getBillingStatement.response.200.parts.hours`; integer, required) — The hours the stretch has (a period: from the hour it begins in up to the hour it ends in; otherwise the calendar month's): what its storage is counted by.
  - `lines` (`getBillingStatement.response.200.parts.lines`; array<object>, required) — One line for each meter: cpu, memory, requests, state, egress, storage, logs, drive_writes, drive_cold_reads, object_storage, object_class_a, object_class_b, browsers.
    - `item` (`getBillingStatement.response.200.parts.lines.item`; string, required)
      - one of `"cpu"`, `"memory"`, `"requests"`, `"state"`, `"egress"`, `"storage"`, `"logs"`, `"drive_writes"`, `"drive_cold_reads"`, `"object_storage"`, `"object_class_a"`, `"object_class_b"`, `"browsers"`
    - `unit` (`getBillingStatement.response.200.parts.lines.unit`; string, required) — What the quantities are in, as `BillingMeter.unit`.
    - `quantity` (`getBillingStatement.response.200.parts.lines.quantity`; number, required) — What was used in the part.
    - `earlier` (`getBillingStatement.response.200.parts.lines.earlier`; number, required) — What was used of the same period in the month before; 0 for a part that is of no period, and for a period that began in this month.
    - `included` (`getBillingStatement.response.200.parts.lines.included`; number | null, required) — What the part's stretch includes of the meter, as `BillingMeter.included`.
    - `billable` (`getBillingStatement.response.200.parts.lines.billable`; number, required) — What of `quantity` is past what is included: `earlier` + `quantity` past `included`, less `earlier` past it. Of `storage`, what the same part's `state` line used counts first.
    - `billable_earlier` (`getBillingStatement.response.200.parts.lines.billable_earlier`; number, required) — What was past what is included of the same period in the month before.
    - `unit_price_usd` (`getBillingStatement.response.200.parts.lines.unit_price_usd`; number, required)
    - `price_per` (`getBillingStatement.response.200.parts.lines.price_per`; string, required)
      - one of `"vcpu_hour"`, `"gib_hour"`, `"million_requests"`, `"gb_month"`, `"gb"`, `"session_hour"`
    - `units_per_price` (`getBillingStatement.response.200.parts.lines.units_per_price`; integer, required) — How many of `unit` the price is for: 3,600 (seconds, GiB-seconds, seconds of a session awake), 1,000,000 (requests of any class), `hours` of the part (GB-hours), 10^9 (bytes).
    - `amount_usd` (`getBillingStatement.response.200.parts.lines.amount_usd`; number, required)
    - `regions` (`getBillingStatement.response.200.parts.lines.regions`; object, optional) — Of `egress` alone: the line region by region (the region of the node the traffic left from), with what of each region was past what is included before the part.
      - `na` (`getBillingStatement.response.200.parts.lines.regions.na`; object, required)
        - `used` (`getBillingStatement.response.200.parts.lines.regions.na.used`; integer, required) — Bytes sent from the region's nodes in the part.
          - format `int64`; min 0
        - `billable` (`getBillingStatement.response.200.parts.lines.regions.na.billable`; integer, required) — What of them is past what is included.
          - format `int64`; min 0
        - `billable_earlier` (`getBillingStatement.response.200.parts.lines.regions.na.billable_earlier`; integer, required) — What of the region's bytes was past what is included of the same stretch before the part (in the month before).
          - format `int64`; min 0
        - `unit_price_usd` (`getBillingStatement.response.200.parts.lines.regions.na.unit_price_usd`; number, required) — The region's price of a gigabyte (10^9 bytes).
        - `amount_usd` (`getBillingStatement.response.200.parts.lines.regions.na.amount_usd`; number, required) — What `billable_earlier` and `billable` cost together at that price, less what `billable_earlier` costs alone, to the nearest millionth.
          - min 0
      - `eu` (`getBillingStatement.response.200.parts.lines.regions.eu`; object, required)
        - `used` (`getBillingStatement.response.200.parts.lines.regions.eu.used`; integer, required) — Bytes sent from the region's nodes in the part.
          - format `int64`; min 0
        - `billable` (`getBillingStatement.response.200.parts.lines.regions.eu.billable`; integer, required) — What of them is past what is included.
          - format `int64`; min 0
        - `billable_earlier` (`getBillingStatement.response.200.parts.lines.regions.eu.billable_earlier`; integer, required) — What of the region's bytes was past what is included of the same stretch before the part (in the month before).
          - format `int64`; min 0
        - `unit_price_usd` (`getBillingStatement.response.200.parts.lines.regions.eu.unit_price_usd`; number, required) — The region's price of a gigabyte (10^9 bytes).
        - `amount_usd` (`getBillingStatement.response.200.parts.lines.regions.eu.amount_usd`; number, required) — What `billable_earlier` and `billable` cost together at that price, less what `billable_earlier` costs alone, to the nearest millionth.
          - min 0
      - `ap` (`getBillingStatement.response.200.parts.lines.regions.ap`; object, required)
        - `used` (`getBillingStatement.response.200.parts.lines.regions.ap.used`; integer, required) — Bytes sent from the region's nodes in the part.
          - format `int64`; min 0
        - `billable` (`getBillingStatement.response.200.parts.lines.regions.ap.billable`; integer, required) — What of them is past what is included.
          - format `int64`; min 0
        - `billable_earlier` (`getBillingStatement.response.200.parts.lines.regions.ap.billable_earlier`; integer, required) — What of the region's bytes was past what is included of the same stretch before the part (in the month before).
          - format `int64`; min 0
        - `unit_price_usd` (`getBillingStatement.response.200.parts.lines.regions.ap.unit_price_usd`; number, required) — The region's price of a gigabyte (10^9 bytes).
        - `amount_usd` (`getBillingStatement.response.200.parts.lines.regions.ap.amount_usd`; number, required) — What `billable_earlier` and `billable` cost together at that price, less what `billable_earlier` costs alone, to the nearest millionth.
          - min 0
  - `list_usd` (`getBillingStatement.response.200.parts.list_usd`; number, required) — The lines' amounts added up: what the part's usage comes to at the list prices.
  - `credit` (`getBillingStatement.response.200.parts.credit`; one of, required) — The credit of the part's stretch (a period of a paid plan): what it was, what of it went to a plan the account moved up to, what of it paid for the period's usage before the part (in the month before) and in it, what is left after the part, and of a period that ends in the part, what lapsed. Null for the hours in no period, and a period of a plan that gives none.
    - one of: `PlanCredit`, `null`
  - `usage_usd` (`getBillingStatement.response.200.parts.usage_usd`; number, required) — What is left to pay of the part: `list_usd` less `credit.used_usd`.
- `earlier_usd` (`getBillingStatement.response.200.earlier_usd`; number, required) — 0. (Of a month in which a store was brought from plans that included use by the month: what the month owed by then, which the lines do not price again.)
- `list_usd` (`getBillingStatement.response.200.list_usd`; number, required) — What the month's lines come to at the list prices: the parts' `list_usd` added up.
- `credit_used_usd` (`getBillingStatement.response.200.credit_used_usd`; number, required) — What of that the credits of the parts' stretches paid: the parts' `credit.used_usd` added up.
- `usage_usd` (`getBillingStatement.response.200.usage_usd`; number, required) — What the month's usage past what is included (the quantities, and the credit) comes to: the parts' `usage_usd` added up (with `earlier_usd`), which is `list_usd` less `credit_used_usd`. This is what the month takes from the account's balance, as far as the balance goes.
- `plan_credit` (`getBillingStatement.response.200.plan_credit`; object, required) — The credit of the paid plan's periods, of the month: so that what each period was given is seen to be used, moved to a plan's fee, lapsed or left, over the months it lies in.
  - `granted_usd` (`getBillingStatement.response.200.plan_credit.granted_usd`; number, required) — The credit of the periods that began in the month.
    - min 0
  - `used_usd` (`getBillingStatement.response.200.plan_credit.used_usd`; number, required) — What credit paid for in the month: `credit_used_usd`.
    - min 0
  - `moved_usd` (`getBillingStatement.response.200.plan_credit.moved_usd`; number, required) — What of the credit of the periods that ended in the month went to the fee of a plan the account moved up to.
    - min 0
  - `lapsed_usd` (`getBillingStatement.response.200.plan_credit.lapsed_usd`; number, required) — What was left of the credit of the periods that ended in the month, by the time it was read: it lapsed.
    - min 0
- `fees` (`getBillingStatement.response.200.fees`; array<object>, required) — One for each period of the subscription that began in the month; empty where none did.
  - `from` (`getBillingStatement.response.200.fees.from`; string, required) — When the period begins.
    - format `date-time`
  - `to` (`getBillingStatement.response.200.fees.to`; string, required) — When it ends: earlier than a month on for a period that ended where one of a plan that stands higher began.
    - format `date-time`
  - `plan` (`getBillingStatement.response.200.fees.plan`; string, required)
    - one of `"p20"`, `"p100"`, `"p300"`, `"p1000"`, `"p2000"`
  - `charge_id` (`getBillingStatement.response.200.fees.charge_id`; string | null, required) — The charge that paid it; null for a period that was given.
  - `plan_fee_usd` (`getBillingStatement.response.200.fees.plan_fee_usd`; number, required) — The plan's fee for the period: `amount_usd` and `credit_usd` together.
  - `credit_usd` (`getBillingStatement.response.200.fees.credit_usd`; number, required) — What was taken off the fee, of a period that began when the account moved up from a period it had paid for: what was left of that one's credit when the plan was asked for, in whole cents rounded in the account's favour (see `Subscription`). 0 otherwise.
  - `amount_usd` (`getBillingStatement.response.200.fees.amount_usd`; number, required) — What was charged for the period: the fee less the credit; 0 for one that was given.
- `fee_usd` (`getBillingStatement.response.200.fee_usd`; number, required) — The fees added up: what was charged to the card for them. It is not in `usage_usd`.
- `projects` (`getBillingStatement.response.200.projects`; array<object>, required) — Every project of the account, in the order they were made, with what it used in the month: the totals `GET /v1/usage` gives that project's key for the month.
  - `id` (`getBillingStatement.response.200.projects.id`; string, required)
  - `name` (`getBillingStatement.response.200.projects.name`; string, required)
  - `cpu_seconds` (`getBillingStatement.response.200.projects.cpu_seconds`; number, required)
  - `memory_gib_seconds` (`getBillingStatement.response.200.projects.memory_gib_seconds`; number, required)
  - `requests` (`getBillingStatement.response.200.projects.requests`; integer, required)
  - `state_gb_hours` (`getBillingStatement.response.200.projects.state_gb_hours`; number, required)
  - `egress_bytes` (`getBillingStatement.response.200.projects.egress_bytes`; integer, required)
  - `storage_gb_hours` (`getBillingStatement.response.200.projects.storage_gb_hours`; number, required) — What the project's volumes and snapshots kept: what `GET /v1/usage?kind=volume` and `?kind=snapshot` add up to for the month.
  - `log_gb_hours` (`getBillingStatement.response.200.projects.log_gb_hours`; number, required) — What the project's apps printed that their nodes kept, times the hours it was kept: the logs' meter.
  - `drive_write_bytes` (`getBillingStatement.response.200.projects.drive_write_bytes`; integer, required) — What was written to the project's volumes.
  - `drive_cold_read_bytes` (`getBillingStatement.response.200.projects.drive_cold_read_bytes`; integer, required) — What was read of the project's volumes from the object store, and of Drives' snapshots through its sandboxes' read-only mounts.
  - `object_storage_gb_hours` (`getBillingStatement.response.200.projects.object_storage_gb_hours`; number, required) — What the project's buckets held.
  - `class_a_requests` (`getBillingStatement.response.200.projects.class_a_requests`; integer, required)
  - `class_b_requests` (`getBillingStatement.response.200.projects.class_b_requests`; integer, required)
  - `browser_awake_seconds` (`getBillingStatement.response.200.projects.browser_awake_seconds`; number, required) — How long the project's Browsers sessions were awake: the meter of the sessions.
  - `log_bytes` (`getBillingStatement.response.200.projects.log_bytes`; integer, required) — What the project's apps printed that their nodes kept, in bytes, in the hours it was printed in: no meter's.
  - `object_egress_bytes` (`getBillingStatement.response.200.projects.object_egress_bytes`; integer, required) — What was read out of the project's buckets to the internet: no meter's (it costs nothing, within fair use).
- `prices` (`getBillingStatement.response.200.prices`; object, required) — In US dollars, with at most six digits after the point.
  - `vcpu_hour_usd` (`getBillingStatement.response.200.prices.vcpu_hour_usd`; number, required) — A busy vCPU-hour.
  - `memory_gib_hour_usd` (`getBillingStatement.response.200.prices.memory_gib_hour_usd`; number, required) — A GiB-hour of memory held while awake, or paused in memory (the pause tier).
  - `requests_million_usd` (`getBillingStatement.response.200.prices.requests_million_usd`; number, required) — A million requests: into apps, and into sandboxes through their preview URLs.
  - `state_gb_month_usd` (`getBillingStatement.response.200.prices.state_gb_month_usd`; number, required) — A GB-month of what sleeping sandboxes keep, and of what the backups of volumes keep in the object store.
  - `egress_gb_usd` (`getBillingStatement.response.200.prices.egress_gb_usd`; number, required) — A gigabyte (10^9 bytes) sent to the internet from a node in North America, or from one with no region: traffic is priced by the region of the node it left from: `na` North America (and a node with no region), `eu` Europe, `ap` Asia-Pacific.
  - `egress_eu_gb_usd` (`getBillingStatement.response.200.prices.egress_eu_gb_usd`; number, required) — A gigabyte sent to the internet from a node in Europe.
  - `egress_ap_gb_usd` (`getBillingStatement.response.200.prices.egress_ap_gb_usd`; number, required) — A gigabyte sent to the internet from a node in Asia-Pacific.
  - `storage_gb_month_usd` (`getBillingStatement.response.200.prices.storage_gb_month_usd`; number, required) — A GB-month of what volumes and snapshots keep: the price of what sleeping sandboxes keep, unless the control plane was started with another (`--price-storage-gb-month`).
  - `logs_gb_month_usd` (`getBillingStatement.response.200.prices.logs_gb_month_usd`; number, required) — A GB-month of what apps print that their nodes keep: the `text` of each line of output kept, counted as it was printed, for the hours it is kept (`--price-logs-gb-month`).
  - `drive_write_gb_usd` (`getBillingStatement.response.200.prices.drive_write_gb_usd`; number, required) — A gigabyte (10^9 bytes) written to volumes (Drives): the bytes of the write requests their block devices served (`--price-drive-write-gb`).
  - `drive_cold_read_gb_usd` (`getBillingStatement.response.200.prices.drive_cold_read_gb_usd`; number, required) — A gigabyte of volumes read cold: fetched from the object store because their node had not got them (a restore from a backup; a block fetched on demand). What is read from the node's own disk costs nothing (`--price-drive-cold-read-gb`).
  - `object_storage_gb_month_usd` (`getBillingStatement.response.200.prices.object_storage_gb_month_usd`; number, required) — A GB-month of what buckets hold (`--price-object-storage-gb-month`). What is read out of them costs nothing, within fair use.
  - `object_class_a_million_usd` (`getBillingStatement.response.200.prices.object_class_a_million_usd`; number, required) — A million requests to buckets of class A: what writes, lists or sets (`--price-object-class-a-million`).
  - `object_class_b_million_usd` (`getBillingStatement.response.200.prices.object_class_b_million_usd`; number, required) — A million requests to buckets of class B: what reads (`--price-object-class-b-million`). What deletes is of neither class and costs nothing.
  - `browser_hour_usd` (`getBillingStatement.response.200.prices.browser_hour_usd`; number, required) — An hour of a Browsers session awake, by the millisecond, in place of its CPU time and its memory: it includes half a vCPU averaged over each hour it is awake, and its CPU time past that is priced at `vcpu_hour_usd`; its memory awake is not priced. Asleep, what it keeps is priced as any sleeping sandbox's (`state_gb_month_usd`, or `memory_gib_hour_usd` while it is paused in memory) (`--price-browser-hour`).
  - `provisional` (`getBillingStatement.response.200.prices.provisional`; boolean, required)
- `databases` (`getBillingStatement.response.200.databases`; array<object>, required) — Every database of the account that used anything in the month (a deleted one too), in the order they were made: a line of its own for each (slice DB7).
  - `id` (`getBillingStatement.response.200.databases.id`; string, required)
  - `name` (`getBillingStatement.response.200.databases.name`; string, required)
  - `project_id` (`getBillingStatement.response.200.databases.project_id`; string, required)
  - `cpu_seconds` (`getBillingStatement.response.200.databases.cpu_seconds`; number, required) — Its branches' instances' CPU time.
  - `memory_gib_seconds` (`getBillingStatement.response.200.databases.memory_gib_seconds`; number, required) — Their memory, awake and paused.
  - `requests` (`getBillingStatement.response.200.databases.requests`; integer, required)
  - `state_gb_hours` (`getBillingStatement.response.200.databases.state_gb_hours`; number, required) — What they kept asleep.
  - `egress_bytes` (`getBillingStatement.response.200.databases.egress_bytes`; integer, required) — What they sent to the internet.
  - `storage_gb_hours` (`getBillingStatement.response.200.databases.storage_gb_hours`; number, required) — What its branches' Drives kept, and its history past its free day (`history_gb_hours`).
  - `log_gb_hours` (`getBillingStatement.response.200.databases.log_gb_hours`; number, required)
  - `drive_write_bytes` (`getBillingStatement.response.200.databases.drive_write_bytes`; integer, required) — What was written to its branches' Drives.
  - `drive_cold_read_bytes` (`getBillingStatement.response.200.databases.drive_cold_read_bytes`; integer, required) — What was read of its branches' Drives from the object store.
  - `object_storage_gb_hours` (`getBillingStatement.response.200.databases.object_storage_gb_hours`; number, required) — What its tiered partitions kept (`tiered_gb_hours`).
  - `class_a_requests` (`getBillingStatement.response.200.databases.class_a_requests`; integer, required)
  - `class_b_requests` (`getBillingStatement.response.200.databases.class_b_requests`; integer, required)
  - `browser_awake_seconds` (`getBillingStatement.response.200.databases.browser_awake_seconds`; number, required)
  - `history_gb_hours` (`getBillingStatement.response.200.databases.history_gb_hours`; number, required) — Of `storage_gb_hours`: what its history kept older than its free last day and within the window it keeps (its root branch's window's old versions and its archived WAL), billed at the price of storage.
    - min 0
  - `tiered_gb_hours` (`getBillingStatement.response.200.databases.tiered_gb_hours`; number, required) — Of `object_storage_gb_hours`: what its tiered partitions kept, by their size before they were moved, billed at the price of Object Storage.
    - min 0
  - `list_usd` (`getBillingStatement.response.200.databases.list_usd`; number, required) — What its quantities come to at the month's list prices: each meter's priced as a line's amount is, to the nearest millionth (traffic region by region), added up.
    - min 0
- `credits_debited` (`getBillingStatement.response.200.credits_debited`; number, required) — What the month's usage took from the account's balance: the month's entry of the ledger, which follows `usage_usd` less `written_off_usd` and is behind by seconds at the most while the month is not closed.
- `written_off_usd` (`getBillingStatement.response.200.written_off_usd`; number, required) — What the month's usage came to that no lot could pay and that is owed by nobody: what an account that held nothing used of the meters that are stopped (CPU time, memory, requests, traffic, logs kept, Drive writes and cold reads, Object Storage's class A and B requests) between what the stretch includes running out (a quantity, or the credit) and the stop taking hold. With `credits_debited` it is `usage_usd`, once a look has brought the ledger up to the statement.
- `paid_from` (`getBillingStatement.response.200.paid_from`; object, required) — Which Credits paid for the month's usage, by the kind of lot (`Lot.kind`), and what none has paid (`unpaid`: it is owed, and the next Credits pay it first). They add up to `credits_debited`. A kind that only a store from before plans included quantities has (`month_grant`, `period_grant`) is there where something of it paid; and `debt_written_off` where what was owed for the month was written off when what the account stored had been deleted (it is among what adds up, and nobody paid it).
  - `credit` (`getBillingStatement.response.200.paid_from.credit`; number, required)
  - `topup` (`getBillingStatement.response.200.paid_from.topup`; number, required)
  - `unpaid` (`getBillingStatement.response.200.paid_from.unpaid`; number, required)
  - `debt_written_off` (`getBillingStatement.response.200.paid_from.debt_written_off`; number, optional)
- `granted` (`getBillingStatement.response.200.granted`; object, required) — The Credits that were granted and bought in the month, by the kind of lot.
  - `credit` (`getBillingStatement.response.200.granted.credit`; number, required)
  - `topup` (`getBillingStatement.response.200.granted.topup`; number, required)
- `lapsed` (`getBillingStatement.response.200.lapsed`; object, required) — What was left of lots that lapsed with the month, by the kind of lot: written off, in entries of this month (`expiry`).
  - `credit` (`getBillingStatement.response.200.lapsed.credit`; number, required)
  - `topup` (`getBillingStatement.response.200.lapsed.topup`; number, required)
- `restored` (`getBillingStatement.response.200.restored`; object, required) — What an operator brought back in the month of lots that had lapsed, in it or before, by the kind of lot (`restore` entries of this month). What lapsed is said in the month it lapsed with all the same.
  - `credit` (`getBillingStatement.response.200.restored.credit`; number, required)
  - `topup` (`getBillingStatement.response.200.restored.topup`; number, required)
- `taken_back` (`getBillingStatement.response.200.taken_back`; number, required) — What was taken from the balance in the month with top-ups that were taken back (`refund` entries).
- `credits_balance` (`getBillingStatement.response.200.credits_balance`; number, required) — What the account held at the month's end, as the ledger has it: the sum of its entries of this month and of the months before. Of the month it is: what it holds. Below zero when the account owes.
- `closed` (`getBillingStatement.response.200.closed`; boolean, required) — The month is over, what its usage comes to was taken from the account's balance as this statement has it (`credits_debited` and `written_off_usd` are `usage_usd`), and what was left of the lots that lapsed in it is written off. False for the month it is; false in the seconds after a month's end, until what was used in it is in the books (ten minutes at the most, when a node is not read); and false again while usage of the month that came in later waits to be taken, which is seconds.

### 400

`invalid_field` (`period`: not a month, or one that has not begun), `unknown_parameter`.

#### Example

```json
{
  "move_id": "string",
  "upgrade_id": "string",
  "move": {
    "object": "move",
    "id": "string",
    "sandbox_id": "string",
    "project_id": "string",
    "from": {
      "id": "string",
      "name": "string"
    },
    "to": {
      "id": "string",
      "name": "string"
    },
    "epoch": 1,
    "step": "string",
    "why": "string",
    "wake": true,
    "from_store": true,
    "release": {},
    "takeover": {},
    "error": {
      "code": "string",
      "message": "string",
      "status": 0,
      "takeover_refused": {
        "code": "string",
        "message": "string",
        "status": 0
      },
      "image": "string",
      "holder": "string",
      "holder_says": "has"
    },
    "attempts": 0,
    "next_attempt_at": "2019-08-24T14:15:22Z",
    "batch": "string",
    "created_at": "2019-08-24T14:15:22Z",
    "updated_at": "2019-08-24T14:15:22Z",
    "ended_at": "2019-08-24T14:15:22Z"
  },
  "lease_until": "2019-08-24T14:15:22Z",
  "active": {
    "name": "string",
    "url": "string",
    "term": 1
  },
  "allowed_hosts": [
    "string"
  ],
  "problems": [
    {
      "at": "string",
      "message": "string"
    }
  ],
  "report": {
    "object": "compose_import",
    "name": "string",
    "dry_run": true,
    "strict": true,
    "profiles": [
      "string"
    ],
    "treatments": {
      "done": 0,
      "adapted": 0,
      "ignored": 0,
      "refused": 0
    },
    "items": [
      {
        "at": "string",
        "treatment": "done",
        "why": "string",
        "change": "string"
      }
    ],
    "services": [
      {
        "name": "string",
        "app_id": "string",
        "status": "created",
        "kind": "service",
        "stateful": true,
        "version": true,
        "items": [
          {
            "at": "string",
            "treatment": "done",
            "why": "string",
            "change": "string"
          }
        ],
        "app": {
          "image": "string",
          "image_pull_secret": "string",
          "start_command": "string",
          "start_args": [
            "string"
          ],
          "port": 0,
          "ready": {
            "http": "string"
          },
          "env": {
            "property1": "string",
            "property2": "string"
          },
          "secrets": {
            "property1": "string",
            "property2": "string"
          },
          "size": {
            "vcpus": 1,
            "memory_bytes": 134217728
          },
          "volumes": [
            {
              "volume": "string",
              "path": "string",
              "read_only": true,
              "nocopy": true
            }
          ],
          "drives": [
            {
              "drive": "string",
              "path": "string",
              "mode": "string"
            }
          ],
          "key_drives": [
            {
              "name": "string",
              "path": "string",
              "size_bytes": 0,
              "nocopy": true
            }
          ],
          "kind": "string",
          "files": [
            {
              "path": "string",
              "content": "string",
              "secret": "string",
              "mode": 0,
              "uid": 0,
              "gid": 0
            }
          ],
          "user": "string",
          "working_dir": "string",
          "stop": {
            "signal": "string",
            "grace_ms": 0
          },
          "hostname": "string",
          "runtime": {
            "ulimits": {
              "property1": {},
              "property2": {}
            },
            "sysctls": {
              "property1": "string",
              "property2": "string"
            },
            "tmpfs": [
              {}
            ],
            "dns": {
              "servers": [
                null
              ],
              "search": [
                null
              ],
              "options": [
                null
              ]
            },
            "shm_size_bytes": 0
          },
          "regions": [
            "string"
          ],
          "scale": {
            "min_instances": 0,
            "max_instances": 1,
            "concurrency": 1,
            "sleep_after_ms": 600000,
            "sleep_notice_ms": 60000,
            "sleep_hold_max_ms": 900000,
            "suspend_after_ms": 1000,
            "wake_daily_at": "string",
            "delete_after_ms": 1000
          },
          "keys": {
            "from": {
              "header": "string"
            },
            "upgrade_on_deploy": true,
            "delete_after_idle_ms": 1000
          },
          "egress": {
            "default": "allow",
            "allow": [
              "string"
            ],
            "deny": [
              "string"
            ],
            "http": [
              {
                "allow": []
              }
            ],
            "inject": [
              {
                "headers": {}
              }
            ],
            "deny_ports": [
              1
            ]
          },
          "metadata": {
            "property1": "string",
            "property2": "string"
          },
          "logs": {
            "output": true,
            "keep": true,
            "requests": {
              "sample_rate": 1,
              "keep_errors": true
            }
          },
          "traces": {
            "sample_rate": 1,
            "trust_incoming": true
          },
          "public": true,
          "depends_on": [
            {
              "service": "string",
              "condition": "string"
            }
          ],
          "network": {
            "aliases": [
              "string"
            ],
            "endpoint_mode": "string"
          }
        }
      }
    ],
    "volumes": [
      {
        "model": "string",
        "name": "string",
        "id": "string",
        "shared": true,
        "status": "to_make",
        "used_by": [
          "string"
        ]
      }
    ],
    "secrets": [
      {
        "model": "string",
        "name": "string",
        "there": true,
        "used_by": [
          "string"
        ]
      }
    ],
    "left_out": [
      {
        "name": "string",
        "profiles": [
          "string"
        ]
      }
    ],
    "absent": [
      "string"
    ],
    "deploy": "string"
  },
  "accounts": [
    {
      "id": "string",
      "name": "string"
    }
  ],
  "error": {
    "type": "string",
    "code": "string",
    "message": "string",
    "param": "string",
    "retryable": true,
    "request_id": "string",
    "docs_url": "string"
  }
}
```

- `error` (`getBillingStatement.response.400.error`; object, required)
  - `type` (`getBillingStatement.response.400.error.type`; string, required)
  - `code` (`getBillingStatement.response.400.error.code`; string, required)
  - `message` (`getBillingStatement.response.400.error.message`; string, required)
  - `param` (`getBillingStatement.response.400.error.param`; string | null, required)
  - `retryable` (`getBillingStatement.response.400.error.retryable`; boolean, required)
  - `request_id` (`getBillingStatement.response.400.error.request_id`; string, required)
  - `docs_url` (`getBillingStatement.response.400.error.docs_url`; string | null, required)
- `move_id` (`getBillingStatement.response.400.move_id`; string, optional) — With `already_moving`: the move of the sandbox that is under way.
- `upgrade_id` (`getBillingStatement.response.400.upgrade_id`; string, optional) — With `upgrade_in_progress` (the key's upgrade that is not over), `upgrade_started` (the upgrade that has begun) and `rollback_gone` (the upgrade whose revert is refused): that upgrade.
  - pattern `^upg-[0-9a-hjkmnp-tv-z]{16}$`
- `move` (`getBillingStatement.response.400.move`; object, optional) — With `move_over`, `move_going_back` and `move_taken_over` (`POST /internal/moves/{id}/cancel`): the move, as it stands.
  - `object` (`getBillingStatement.response.400.move.object`; string, required)
  - `id` (`getBillingStatement.response.400.move.id`; string, required)
    - pattern `^mov-[0-9a-hjkmnp-tv-z]{16}$`
  - `sandbox_id` (`getBillingStatement.response.400.move.sandbox_id`; string, required)
  - `project_id` (`getBillingStatement.response.400.move.project_id`; string, required)
  - `from` (`getBillingStatement.response.400.move.from`; object, required)
    - `id` (`getBillingStatement.response.400.move.from.id`; string, required)
    - `name` (`getBillingStatement.response.400.move.from.name`; string | null, required) — Its name; null for a node that is off the books since.
  - `to` (`getBillingStatement.response.400.move.to`; object, required)
    - `id` (`getBillingStatement.response.400.move.to.id`; string, required)
    - `name` (`getBillingStatement.response.400.move.to.name`; string | null, required) — Its name; null for a node that is off the books since.
  - `epoch` (`getBillingStatement.response.400.move.epoch`; integer, required) — The epoch the table held the sandbox at when the move began: the old node releases it at it, the new one takes it over one on, the old one takes it back two on, and from the object store three on.
    - min 1
  - `step` (`getBillingStatement.response.400.move.step`; string, required) — Where it stands: `releasing` (the old node is asked to release it; the table has it there), `taking_over` (the new node is asked to take it over; the table has it there), `reclaiming` (the new node refused it, and the old one is asked to take it back), `restoring` (the old one kept nothing of it, and takes it over from the object store), `done` (on the new node), `failed` (where it was, or back there, or where a failure no time clears or an operator's cancel found it: `error` says why).
  - `why` (`getBillingStatement.response.400.move.why`; string, required) — What made it: the operator's move, an evacuation, a recovery.
  - `wake` (`getBillingStatement.response.400.move.wake`; boolean, required) — Whether the new node wakes it: as the call said, or as it was (it ran) when the move began.
  - `from_store` (`getBillingStatement.response.400.move.from_store`; boolean, required) — The new node takes it from the object store alone.
  - `release` (`getBillingStatement.response.400.move.release`; object | null, required) — What the old node's release answered (sandboxd/openapi/openapi.json, `releaseSandbox`), without the release's key; null before it answered.
  - `takeover` (`getBillingStatement.response.400.move.takeover`; object | null, required) — What the takeover that ended it answered (`takeoverSandbox` of the node's document): where its disk and memory came from (`source`), how long each took (`ms`), `memory`; null before.
  - `error` (`getBillingStatement.response.400.move.error`; one of, required) — Why it failed, of one that failed (the new node's refusal, where it was taken back to the old node); null, of one that is done; of one under way, what the step it is at was last told where it is asked again.
    - one of: `object`, `null`
  - `attempts` (`getBillingStatement.response.400.move.attempts`; integer, required) — How many times the step it is at was asked without an answer that settles it.
    - min 0
  - `next_attempt_at` (`getBillingStatement.response.400.move.next_attempt_at`; string | null, required) — When that step is asked again; null where it is not waiting.
    - format `date-time`
  - `batch` (`getBillingStatement.response.400.move.batch`; string | null, required) — The evacuation (`evc-…`) or recovery (`rcv-…`) it is of.
  - `created_at` (`getBillingStatement.response.400.move.created_at`; string, required)
    - format `date-time`
  - `updated_at` (`getBillingStatement.response.400.move.updated_at`; string, required)
    - format `date-time`
  - `ended_at` (`getBillingStatement.response.400.move.ended_at`; string | null, required)
    - format `date-time`
- `lease_until` (`getBillingStatement.response.400.lease_until`; string, optional) — With `lease_held`: until when the node may still hold the lease it was granted last, and the time after it for the node to have seen it run out (`recoverNode` is refused until then).
  - format `date-time`
- `active` (`getBillingStatement.response.400.active`; object | null, optional) — With `standby`: the active copy, as the standby last read the lease; null while no copy holds it.
  - `name` (`getBillingStatement.response.400.active.name`; string, required)
  - `url` (`getBillingStatement.response.400.active.url`; string, required)
  - `term` (`getBillingStatement.response.400.active.term`; integer, required)
    - min 1
- `allowed_hosts` (`getBillingStatement.response.400.allowed_hosts`; array | null, optional) — With `secret_host_not_allowed`: the hosts the secret may go to, as the secret has them; null where it was given none (the node's `SecretHosts`).
- `problems` (`getBillingStatement.response.400.problems`; array<object>, optional) — With `invalid_definition`: every problem of the definition, each where it is and what it is.
  - `at` (`getBillingStatement.response.400.problems.at`; string, required) — Where in the definition, a dotted path (`services.web.port`); empty for the whole of it.
  - `message` (`getBillingStatement.response.400.problems.message`; string, required)
- `report` (`getBillingStatement.response.400.report`; object, optional) — With `compose_refused`: the import's report, which says what is refused, why, and what to change.
  - `object` (`getBillingStatement.response.400.report.object`; string, required)
    - one of `"compose_import"`
  - `name` (`getBillingStatement.response.400.report.name`; string | null, required) — The model's `name`: each service's label `compose.project`. Null: it has none.
  - `dry_run` (`getBillingStatement.response.400.report.dry_run`; boolean, required)
  - `strict` (`getBillingStatement.response.400.report.strict`; boolean, required)
  - `profiles` (`getBillingStatement.response.400.report.profiles`; array<string>, required)
  - `treatments` (`getBillingStatement.response.400.report.treatments`; object, required) — How many items of the report have each treatment.
    - `done` (`getBillingStatement.response.400.report.treatments.done`; integer, required)
      - min 0
    - `adapted` (`getBillingStatement.response.400.report.treatments.adapted`; integer, required)
      - min 0
    - `ignored` (`getBillingStatement.response.400.report.treatments.ignored`; integer, required)
      - min 0
    - `refused` (`getBillingStatement.response.400.report.treatments.refused`; integer, required)
      - min 0
  - `items` (`getBillingStatement.response.400.report.items`; array<object>, required) — The model's top-level elements: `name`, each volume, network, config and secret, extensions.
    - `at` (`getBillingStatement.response.400.report.items.at`; string, required) — Where in the model: of a service, its attribute (`ports[0]`, `depends_on.db`, `environment.KEY`), empty for the service as a whole; of the top level, the element (`volumes.db-data`).
    - `treatment` (`getBillingStatement.response.400.report.items.treatment`; string, required) — `done`: it means the same on the platform; `adapted`: the platform does the same another way; `ignored`: it matters to a local run alone (refused with `strict`); `refused`: the platform cannot do it, and doing without it would let the program go wrong quietly.
      - one of `"done"`, `"adapted"`, `"ignored"`, `"refused"`
    - `why` (`getBillingStatement.response.400.report.items.why`; string, required)
    - `change` (`getBillingStatement.response.400.report.items.change`; string | null, required) — Of one that is refused: what to change. Null otherwise.
  - `services` (`getBillingStatement.response.400.report.services`; array<object>, required) — The services the import takes, in the model's order.
    - `name` (`getBillingStatement.response.400.report.services.name`; string, required) — The service's name, which is its app's.
    - `app_id` (`getBillingStatement.response.400.report.services.app_id`; string | null, required) — Its app. Null: a dry run of a service the project does not have.
      - pattern `^app-`
    - `status` (`getBillingStatement.response.400.report.services.status`; string, required) — What the import does (or, in a dry run, would do) to its app: makes it, writes what changed, or nothing.
      - one of `"created"`, `"changed"`, `"unchanged"`
    - `kind` (`getBillingStatement.response.400.report.services.kind`; string, required) — `job`: a service of the model waits for it to complete, and it runs to its end in each deploy that needs it.
      - one of `"service"`, `"job"`
    - `stateful` (`getBillingStatement.response.400.report.services.stateful`; boolean, required) — It mounts a volume of its own: one instance, which has the volume.
    - `version` (`getBillingStatement.response.400.report.services.version`; boolean, required) — Whether the import's deploy makes a version of it: what its version would be made of, its references resolved, is not what its current version is.
    - `items` (`getBillingStatement.response.400.report.services.items`; array<object>, required)
      - `at` (`getBillingStatement.response.400.report.services.items.at`; string, required) — Where in the model: of a service, its attribute (`ports[0]`, `depends_on.db`, `environment.KEY`), empty for the service as a whole; of the top level, the element (`volumes.db-data`).
      - `treatment` (`getBillingStatement.response.400.report.services.items.treatment`; string, required) — `done`: it means the same on the platform; `adapted`: the platform does the same another way; `ignored`: it matters to a local run alone (refused with `strict`); `refused`: the platform cannot do it, and doing without it would let the program go wrong quietly.
        - one of `"done"`, `"adapted"`, `"ignored"`, `"refused"`
      - `why` (`getBillingStatement.response.400.report.services.items.why`; string, required)
      - `change` (`getBillingStatement.response.400.report.services.items.change`; string | null, required) — Of one that is refused: what to change. Null otherwise.
    - `app` (`getBillingStatement.response.400.report.services.app`; object, required) — The fields of the service's app as the import writes them: what its versions are made of, and what holds at once.
      - `image` (`getBillingStatement.response.400.report.services.app.image`; string | null, required) — What the app's next version is made of, with the seven fields after it: its newest version's, with what was changed since. `null`: the app has no image, and no version.
      - `image_pull_secret` (`getBillingStatement.response.400.report.services.app.image_pull_secret`; string | null, required) — The name of the secret that holds the credentials of the image's registry. No answer has its value. `null`: none.
      - `start_command` (`getBillingStatement.response.400.report.services.app.start_command`; any of, required)
        - any of: `StartCommand`, `null`
      - `start_args` (`getBillingStatement.response.400.report.services.app.start_args`; any of, required) — What follows the image's ENTRYPOINT in the place of its CMD. `null`: the image's CMD, or the whole of `start_command`.
        - any of: `array<string>`, `null`
      - `port` (`getBillingStatement.response.400.report.services.app.port`; integer | null, required)
      - `ready` (`getBillingStatement.response.400.report.services.app.ready`; object, required) — How to tell that an instance is up, which a version's template is saved after: exactly one of the three. The first two are asked from outside the instance, so the service has to listen on every address (`0.0.0.0`).
        - `http` (`getBillingStatement.response.400.report.services.app.ready.http`; string, optional) — A path, beginning with `/`: a `GET` of it on the app's port is answered with a status from 200 to 399.
        - `tcp` (`getBillingStatement.response.400.report.services.app.ready.tcp`; boolean, optional) — The app's port takes a connection.
          - one of `true`
        - `command` (`getBillingStatement.response.400.report.services.app.ready.command`; one of, optional) — A command that succeeds in the instance. It is run by the instance's shell: a list of arguments is written as one line for it.
          - one of: `string`, `array<string>`
      - `env` (`getBillingStatement.response.400.report.services.app.env`; map<string>, required)
      - `secrets` (`getBillingStatement.response.400.report.services.app.secrets`; map<string>, required) — Names of secrets. No answer has a value.
      - `size` (`getBillingStatement.response.400.report.services.app.size`; object, required) — What one instance may use at most. It is billed by what it uses.
        - `vcpus` (`getBillingStatement.response.400.report.services.app.size.vcpus`; integer, required)
          - min 1
        - `memory_bytes` (`getBillingStatement.response.400.report.services.app.size.memory_bytes`; integer, required) — An even number of MiB (a whole number of the 2 MiB pages a node loads a machine's memory in), in bytes. Any other size is 400 `invalid_field` (param `size.memory_bytes`): no node would make an instance of it, as none makes a sandbox of it (the node's `SandboxLimitsCreate.memory_bytes`).
          - min 134217728
      - `volumes` (`getBillingStatement.response.400.report.services.app.volumes`; array<object>, required)
        - `volume` (`getBillingStatement.response.400.report.services.app.volumes.volume`; string, required)
        - `path` (`getBillingStatement.response.400.report.services.app.volumes.path`; string, required)
        - `read_only` (`getBillingStatement.response.400.report.services.app.volumes.read_only`; boolean, required)
        - `nocopy` (`getBillingStatement.response.400.report.services.app.volumes.nocopy`; unknown, optional) — There only where it was given as `true`.
      - `kind` (`getBillingStatement.response.400.report.services.app.kind`; string, required)
      - `files` (`getBillingStatement.response.400.report.services.app.files`; array<object>, required)
        - `path` (`getBillingStatement.response.400.report.services.app.files.path`; string, required)
        - `mode` (`getBillingStatement.response.400.report.services.app.files.mode`; integer, required)
        - `uid` (`getBillingStatement.response.400.report.services.app.files.uid`; integer, required)
        - `gid` (`getBillingStatement.response.400.report.services.app.files.gid`; integer, required)
        - `content` (`getBillingStatement.response.400.report.services.app.files.content`; string, optional)
        - `secret` (`getBillingStatement.response.400.report.services.app.files.secret`; string, optional)
      - `user` (`getBillingStatement.response.400.report.services.app.user`; string | null, required)
      - `working_dir` (`getBillingStatement.response.400.report.services.app.working_dir`; string | null, required)
      - `stop` (`getBillingStatement.response.400.report.services.app.stop`; any of, required)
        - any of: `ServiceStop`, `null`
      - `hostname` (`getBillingStatement.response.400.report.services.app.hostname`; string | null, required)
      - `regions` (`getBillingStatement.response.400.report.services.app.regions`; array<string>, required) — In the order na, eu, ap.
      - `scale` (`getBillingStatement.response.400.report.services.app.scale`; object, required)
        - `min_instances` (`getBillingStatement.response.400.report.services.app.scale.min_instances`; integer, required) — How many instances of the app are kept awake in a region, whether a request comes or not: the floor. The nodes of the region that serve the app share it as they share `max_instances` (two nodes and a floor of 2: one on each; a floor of 1: one, on the node that is tried first; a floor of 5: three and two), and a node that is away is made up for by the others. A node makes its part when it is told, not at the first request, and neither stops nor deletes those instances for being idle; they are metered as instances that are awake. 0, which is what it is when nothing is said: none. Lowered, the instances beyond it are idle from that moment, and are stopped and deleted as idle instances are. At most `max_instances`, where that is given, and at most what the account's plan lets an app ask for in a region (`caps.app_instances.limit`: 5, 50 and 500): more is refused, 403 `plan_cap_reached`.
          - min 0
        - `max_instances` (`getBillingStatement.response.400.report.services.app.scale.max_instances`; integer | null, required) — How many instances the app has at the most in a region: the nodes of the region that serve the app share it. At most what the account's plan lets an app ask for (`caps.app_instances.limit`: 5 on the free plan, 50 on `p20`, 200 on `p100`, 500 on `p300`, 1,000 on `p1000`, 2,000 on `p2000`): more is refused, 403 `plan_cap_reached`, and what an app asked for on a plan that let it is kept, and held to the plan's number. `null`: the plan's number for an app that names none (`caps.app_instances.default`: 2, 10, 20, 50, 100 and 200), or `min_instances` where that is more. What the nodes are told is no more than the account has room for awake beside everything else of it that is awake, nor less than the app has awake.
          - min 1
        - `concurrency` (`getBillingStatement.response.400.report.services.app.scale.concurrency`; integer | null, required) — A cap on what one instance has in hand at a time: the requests the edges sent it, and the connections it has open on its project's network (through its service's address, which the node shares out among the instances connection by connection, or to its own). An instance with that many is full, and another is made for more. `null`, which is what it is when nothing is said: no cap. A node then adds an instance when the ones it has are near their size in CPU or memory, and an app does not have to guess a number; a service that takes one request at a time gives one.
          - min 1; max 1000
        - `sleep_after_ms` (`getBillingStatement.response.400.report.services.app.scale.sleep_after_ms`; integer, required) — After how long without a request an instance stops. One that stays stopped is deleted by its node after `delete_after_ms`, and the next request that needs an instance gets a new one; the instances `min_instances` keeps awake are neither stopped nor deleted.
          - min 0; max 600000
        - `sleep_notice_ms` (`getBillingStatement.response.400.report.services.app.scale.sleep_notice_ms`; integer | null, required) — How long before an instance stops for being idle the programs connected to its guest's `/run/sbx/awake` are sent the line `sleep N`, in milliseconds: they flush what they hold, close their connections, or raise a hold, which puts the stop off. The stop comes that long after, whether they answer or not; where nobody is connected, it is not put off. A keyed instance is told as well. 0 or null: not told (the default).
          - min 0; max 60000
        - `sleep_hold_max_ms` (`getBillingStatement.response.400.report.services.app.scale.sleep_hold_max_ms`; integer, required) — How long the holds a program in an instance raises keep it up after its time idle has run out, in milliseconds: a program connects to `/run/sbx/awake` and sends `+` before it answers a request whose work goes on after the answer, and `-` (or closes the connection, or dies) when that work is done; the instance stops `sleep_after_ms` after the last hold is lowered. Past this time it stops whatever holds it, the programs connected told `sleep N cap` first where `sleep_notice_ms` asks for a notice. Held, it runs and is metered as running. 0: holds are not heeded. Null: 30000 (the default).
          - min 0; max 900000
        - `delete_after_ms` (`getBillingStatement.response.400.report.services.app.scale.delete_after_ms`; integer | null, required) — After how long idle an instance is deleted, counted from where its stop is counted from: the next request that needs one gets a new instance, a clone of the version's template, without what the deleted one had gathered in its memory and on its disk (keep what is to last in a volume or a database). A second to an hour, the platform's time, which is the most: more is refused (400 `invalid_field`), and an instance that is to stay warm is one of `min_instances`. `null`, which is what it is when nothing is said: the hour of the nodes (`--app-delete-after-seconds`). A change holds for the instances the app has as for the ones made after: each node judges every instance by the app's time as it is, once a second at the least. Not for the app's keyed instances, which `keys.delete_after_idle_ms` is for.
          - min 1000; max 3600000
        - `suspend_after_ms` (`getBillingStatement.response.400.report.services.app.scale.suspend_after_ms`; integer | null, optional) — How long a stopped instance stays paused before its memory is saved and it sleeps for real, in milliseconds: paused, the next request is answered in a millisecond or two and its memory is metered; asleep, it wakes in a few more and only what it keeps is. Its node holds it to the longest it holds any instance paused (ten minutes); the host's memory running short, a slot another machine needs and a sleep somebody asks for put it to sleep sooner. Null (the default): its node's longest. A database's `suspend_after_seconds` is its app's.
          - min 1000; max 86400000
        - `wake_daily_at` (`getBillingStatement.response.400.report.services.app.scale.wake_daily_at`; string | null, optional) — A time of day in UTC, `HH:MM`, at which the app's keyed instances and its stateful service's instance that rest are woken every day, for work of their own that waits for a wake (a database's maintenance, say); the instances the nodes make and delete by the app's requests are woken by requests alone. The wake is no activity: what runs then is, and once that is done the instance rests again. A stateful service's instance is woken besides for the next run of its PostgreSQL server's `pg_cron` jobs, whatever this says. Null (the default): none. A database's `wake_daily_at` is its app's.
          - pattern `^([01][0-9]|2[0-3]):[0-5][0-9]$`
      - `keys` (`getBillingStatement.response.400.report.services.app.keys`; any of, required)
        - any of: `object`, `null`
      - `egress` (`getBillingStatement.response.400.report.services.app.egress`; object | null, required) — Egress rules as a sandbox has them (`default`, `allow`, `deny`, `http`, `inject`), null when there are none; kept as the calls gave them (a `PATCH` merges them key by key, as a node does). They hold at once and make no version: the nodes that serve the app put them on every instance of its group, the ones there are (one that runs for the connections it has too) and the ones made after; a keyed instance does not have them. The control plane checks only that they are an object of those keys of at most 256 KiB: what the rules say is a node's to check, when it applies them, and an instance whose rules its node cannot read is refused everything (the node's log says why).
        - `default` (`getBillingStatement.response.400.report.services.app.egress.default`; string | null, optional)
          - one of `"allow"`, `"deny"`, `null`
        - `allow` (`getBillingStatement.response.400.report.services.app.egress.allow`; array | null, optional)
        - `deny` (`getBillingStatement.response.400.report.services.app.egress.deny`; array | null, optional)
        - `http` (`getBillingStatement.response.400.report.services.app.egress.http`; array | null, optional)
        - `inject` (`getBillingStatement.response.400.report.services.app.egress.inject`; array | null, optional)
        - `deny_ports` (`getBillingStatement.response.400.report.services.app.egress.deny_ports`; array | null, optional) — Ports no connection reaches, TCP or UDP, wherever it goes and whatever else the rules say. A Browsers session's always hold 25, 465, 587 and the ports mining pools listen on (3333, 4444, 5555, 7777, 14444, 45700): the control plane adds them to whatever a change of its rules gives.
      - `metadata` (`getBillingStatement.response.400.report.services.app.metadata`; map<string>, required)
      - `logs` (`getBillingStatement.response.400.report.services.app.logs`; object, required) — What the app's log has, each part as it was given or at its default (`AppLogSettings`).
        - `output` (`getBillingStatement.response.400.report.services.app.logs.output`; boolean, required)
        - `keep` (`getBillingStatement.response.400.report.services.app.logs.keep`; boolean, required)
        - `requests` (`getBillingStatement.response.400.report.services.app.logs.requests`; object, required)
          - `sample_rate` (`getBillingStatement.response.400.report.services.app.logs.requests.sample_rate`; number, required)
            - min 0; max 1
          - `keep_errors` (`getBillingStatement.response.400.report.services.app.logs.requests.keep_errors`; boolean, required)
      - `public` (`getBillingStatement.response.400.report.services.app.public`; boolean, required) — Whether it answers at its default domain (`url`).
      - `depends_on` (`getBillingStatement.response.400.report.services.app.depends_on`; array<object>, required)
        - `service` (`getBillingStatement.response.400.report.services.app.depends_on.service`; string, required)
        - `condition` (`getBillingStatement.response.400.report.services.app.depends_on.condition`; string, required)
      - `network` (`getBillingStatement.response.400.report.services.app.network`; object, required)
        - `aliases` (`getBillingStatement.response.400.report.services.app.network.aliases`; array<string>, required)
        - `endpoint_mode` (`getBillingStatement.response.400.report.services.app.network.endpoint_mode`; string, required)
      - `drives` (`getBillingStatement.response.400.report.services.app.drives`; array<object>, optional) — The Drives its instance mounts (`AppCreate.drives`): none, `[]`, where it names none.
        - `drive` (`getBillingStatement.response.400.report.services.app.drives.drive`; string, required)
        - `path` (`getBillingStatement.response.400.report.services.app.drives.path`; string, required)
        - `mode` (`getBillingStatement.response.400.report.services.app.drives.mode`; string, required)
      - `key_drives` (`getBillingStatement.response.400.report.services.app.key_drives`; array<object>, optional) — The Drives each key's instance has of its own (`AppCreate.key_drives`): none, `[]`, where it gives none.
        - `name` (`getBillingStatement.response.400.report.services.app.key_drives.name`; string, required)
        - `path` (`getBillingStatement.response.400.report.services.app.key_drives.path`; string, required)
        - `size_bytes` (`getBillingStatement.response.400.report.services.app.key_drives.size_bytes`; integer | null, required)
          - format `int64`
        - `nocopy` (`getBillingStatement.response.400.report.services.app.key_drives.nocopy`; unknown, optional) — There only where it was given as `true`.
      - `runtime` (`getBillingStatement.response.400.report.services.app.runtime`; any of, optional) — Its runtime settings (`AppCreate.runtime`). `null`: none.
        - any of: `Runtime`, `null`
      - `traces` (`getBillingStatement.response.400.report.services.app.traces`; object, optional) — What the app's requests' traces have, each part as it was given or at its default (`AppTraceSettings`): no span where `sample_rate` is 0.
        - `sample_rate` (`getBillingStatement.response.400.report.services.app.traces.sample_rate`; number, required)
          - min 0; max 1
        - `trust_incoming` (`getBillingStatement.response.400.report.services.app.traces.trust_incoming`; boolean, required)
  - `volumes` (`getBillingStatement.response.400.report.volumes`; array<object>, required) — The volumes of the project the services mount.
    - `model` (`getBillingStatement.response.400.report.volumes.model`; string | null, required) — Its name in the model. Null: made for a path a stateful service mounts with no volume named.
    - `name` (`getBillingStatement.response.400.report.volumes.name`; string, required) — Its name in the project.
    - `id` (`getBillingStatement.response.400.report.volumes.id`; string | null, required) — Null: not made yet (`to_make`).
      - pattern `^vol-`
    - `shared` (`getBillingStatement.response.400.report.volumes.shared`; boolean, required) — Several services mount it, or one with several instances: every instance of each mounts it at once.
    - `status` (`getBillingStatement.response.400.report.volumes.status`; string, required) — `to_make`: the import makes it (a dry run says so of what it would make); `made`: this import made it; `there`: an earlier import made it, or a volume of its name was there; `external`: the model names it `external`, and the project has it.
      - one of `"to_make"`, `"made"`, `"there"`, `"external"`
    - `used_by` (`getBillingStatement.response.400.report.volumes.used_by`; array<string>, required)
  - `secrets` (`getBillingStatement.response.400.report.secrets`; array<object>, required) — The secrets of the model that services are granted.
    - `model` (`getBillingStatement.response.400.report.secrets.model`; string, required) — Its name in the model.
    - `name` (`getBillingStatement.response.400.report.secrets.name`; string, required) — The project's secret that holds it: the model's name, with each character a secret's name does not take written as an underscore.
    - `there` (`getBillingStatement.response.400.report.secrets.there`; boolean, required) — Whether the project has it. An import (not a dry run) with one that is not there is refused 404 `secret_not_found`.
    - `used_by` (`getBillingStatement.response.400.report.secrets.used_by`; array<string>, required)
  - `left_out` (`getBillingStatement.response.400.report.left_out`; array<object>, required) — The services of profiles that are not turned on, which the import does not touch.
    - `name` (`getBillingStatement.response.400.report.left_out.name`; string, required)
    - `profiles` (`getBillingStatement.response.400.report.left_out.profiles`; array<string>, required)
  - `absent` (`getBillingStatement.response.400.report.absent`; array<string>, required) — The project's services that the model does not have: kept as they are.
  - `deploy` (`getBillingStatement.response.400.report.deploy`; string | null, required) — The deploy the import made (`GET /v1/deploys/{id}`). Null: a dry run, or nothing would get a version.
    - pattern `^dpl-`
- `accounts` (`getBillingStatement.response.400.accounts`; array<object>, optional) — With `sole_owner`: the accounts the user is the only owner of.
  - `id` (`getBillingStatement.response.400.accounts.id`; string, required)
    - pattern `^acct-[0-9a-hjkmnp-tv-z]{16}$`
  - `name` (`getBillingStatement.response.400.accounts.name`; string, required)

### 401

`missing_api_key`, `invalid_api_key`, `expired_api_key`, `invalid_token`.

#### Example

```json
{
  "move_id": "string",
  "upgrade_id": "string",
  "move": {
    "object": "move",
    "id": "string",
    "sandbox_id": "string",
    "project_id": "string",
    "from": {
      "id": "string",
      "name": "string"
    },
    "to": {
      "id": "string",
      "name": "string"
    },
    "epoch": 1,
    "step": "string",
    "why": "string",
    "wake": true,
    "from_store": true,
    "release": {},
    "takeover": {},
    "error": {
      "code": "string",
      "message": "string",
      "status": 0,
      "takeover_refused": {
        "code": "string",
        "message": "string",
        "status": 0
      },
      "image": "string",
      "holder": "string",
      "holder_says": "has"
    },
    "attempts": 0,
    "next_attempt_at": "2019-08-24T14:15:22Z",
    "batch": "string",
    "created_at": "2019-08-24T14:15:22Z",
    "updated_at": "2019-08-24T14:15:22Z",
    "ended_at": "2019-08-24T14:15:22Z"
  },
  "lease_until": "2019-08-24T14:15:22Z",
  "active": {
    "name": "string",
    "url": "string",
    "term": 1
  },
  "allowed_hosts": [
    "string"
  ],
  "problems": [
    {
      "at": "string",
      "message": "string"
    }
  ],
  "report": {
    "object": "compose_import",
    "name": "string",
    "dry_run": true,
    "strict": true,
    "profiles": [
      "string"
    ],
    "treatments": {
      "done": 0,
      "adapted": 0,
      "ignored": 0,
      "refused": 0
    },
    "items": [
      {
        "at": "string",
        "treatment": "done",
        "why": "string",
        "change": "string"
      }
    ],
    "services": [
      {
        "name": "string",
        "app_id": "string",
        "status": "created",
        "kind": "service",
        "stateful": true,
        "version": true,
        "items": [
          {
            "at": "string",
            "treatment": "done",
            "why": "string",
            "change": "string"
          }
        ],
        "app": {
          "image": "string",
          "image_pull_secret": "string",
          "start_command": "string",
          "start_args": [
            "string"
          ],
          "port": 0,
          "ready": {
            "http": "string"
          },
          "env": {
            "property1": "string",
            "property2": "string"
          },
          "secrets": {
            "property1": "string",
            "property2": "string"
          },
          "size": {
            "vcpus": 1,
            "memory_bytes": 134217728
          },
          "volumes": [
            {
              "volume": "string",
              "path": "string",
              "read_only": true,
              "nocopy": true
            }
          ],
          "drives": [
            {
              "drive": "string",
              "path": "string",
              "mode": "string"
            }
          ],
          "key_drives": [
            {
              "name": "string",
              "path": "string",
              "size_bytes": 0,
              "nocopy": true
            }
          ],
          "kind": "string",
          "files": [
            {
              "path": "string",
              "content": "string",
              "secret": "string",
              "mode": 0,
              "uid": 0,
              "gid": 0
            }
          ],
          "user": "string",
          "working_dir": "string",
          "stop": {
            "signal": "string",
            "grace_ms": 0
          },
          "hostname": "string",
          "runtime": {
            "ulimits": {
              "property1": {},
              "property2": {}
            },
            "sysctls": {
              "property1": "string",
              "property2": "string"
            },
            "tmpfs": [
              {}
            ],
            "dns": {
              "servers": [
                null
              ],
              "search": [
                null
              ],
              "options": [
                null
              ]
            },
            "shm_size_bytes": 0
          },
          "regions": [
            "string"
          ],
          "scale": {
            "min_instances": 0,
            "max_instances": 1,
            "concurrency": 1,
            "sleep_after_ms": 600000,
            "sleep_notice_ms": 60000,
            "sleep_hold_max_ms": 900000,
            "suspend_after_ms": 1000,
            "wake_daily_at": "string",
            "delete_after_ms": 1000
          },
          "keys": {
            "from": {
              "header": "string"
            },
            "upgrade_on_deploy": true,
            "delete_after_idle_ms": 1000
          },
          "egress": {
            "default": "allow",
            "allow": [
              "string"
            ],
            "deny": [
              "string"
            ],
            "http": [
              {
                "allow": []
              }
            ],
            "inject": [
              {
                "headers": {}
              }
            ],
            "deny_ports": [
              1
            ]
          },
          "metadata": {
            "property1": "string",
            "property2": "string"
          },
          "logs": {
            "output": true,
            "keep": true,
            "requests": {
              "sample_rate": 1,
              "keep_errors": true
            }
          },
          "traces": {
            "sample_rate": 1,
            "trust_incoming": true
          },
          "public": true,
          "depends_on": [
            {
              "service": "string",
              "condition": "string"
            }
          ],
          "network": {
            "aliases": [
              "string"
            ],
            "endpoint_mode": "string"
          }
        }
      }
    ],
    "volumes": [
      {
        "model": "string",
        "name": "string",
        "id": "string",
        "shared": true,
        "status": "to_make",
        "used_by": [
          "string"
        ]
      }
    ],
    "secrets": [
      {
        "model": "string",
        "name": "string",
        "there": true,
        "used_by": [
          "string"
        ]
      }
    ],
    "left_out": [
      {
        "name": "string",
        "profiles": [
          "string"
        ]
      }
    ],
    "absent": [
      "string"
    ],
    "deploy": "string"
  },
  "accounts": [
    {
      "id": "string",
      "name": "string"
    }
  ],
  "error": {
    "type": "string",
    "code": "string",
    "message": "string",
    "param": "string",
    "retryable": true,
    "request_id": "string",
    "docs_url": "string"
  }
}
```

- `error` (`getBillingStatement.response.401.error`; object, required)
  - `type` (`getBillingStatement.response.401.error.type`; string, required)
  - `code` (`getBillingStatement.response.401.error.code`; string, required)
  - `message` (`getBillingStatement.response.401.error.message`; string, required)
  - `param` (`getBillingStatement.response.401.error.param`; string | null, required)
  - `retryable` (`getBillingStatement.response.401.error.retryable`; boolean, required)
  - `request_id` (`getBillingStatement.response.401.error.request_id`; string, required)
  - `docs_url` (`getBillingStatement.response.401.error.docs_url`; string | null, required)
- `move_id` (`getBillingStatement.response.401.move_id`; string, optional) — With `already_moving`: the move of the sandbox that is under way.
- `upgrade_id` (`getBillingStatement.response.401.upgrade_id`; string, optional) — With `upgrade_in_progress` (the key's upgrade that is not over), `upgrade_started` (the upgrade that has begun) and `rollback_gone` (the upgrade whose revert is refused): that upgrade.
  - pattern `^upg-[0-9a-hjkmnp-tv-z]{16}$`
- `move` (`getBillingStatement.response.401.move`; object, optional) — With `move_over`, `move_going_back` and `move_taken_over` (`POST /internal/moves/{id}/cancel`): the move, as it stands.
  - `object` (`getBillingStatement.response.401.move.object`; string, required)
  - `id` (`getBillingStatement.response.401.move.id`; string, required)
    - pattern `^mov-[0-9a-hjkmnp-tv-z]{16}$`
  - `sandbox_id` (`getBillingStatement.response.401.move.sandbox_id`; string, required)
  - `project_id` (`getBillingStatement.response.401.move.project_id`; string, required)
  - `from` (`getBillingStatement.response.401.move.from`; object, required)
    - `id` (`getBillingStatement.response.401.move.from.id`; string, required)
    - `name` (`getBillingStatement.response.401.move.from.name`; string | null, required) — Its name; null for a node that is off the books since.
  - `to` (`getBillingStatement.response.401.move.to`; object, required)
    - `id` (`getBillingStatement.response.401.move.to.id`; string, required)
    - `name` (`getBillingStatement.response.401.move.to.name`; string | null, required) — Its name; null for a node that is off the books since.
  - `epoch` (`getBillingStatement.response.401.move.epoch`; integer, required) — The epoch the table held the sandbox at when the move began: the old node releases it at it, the new one takes it over one on, the old one takes it back two on, and from the object store three on.
    - min 1
  - `step` (`getBillingStatement.response.401.move.step`; string, required) — Where it stands: `releasing` (the old node is asked to release it; the table has it there), `taking_over` (the new node is asked to take it over; the table has it there), `reclaiming` (the new node refused it, and the old one is asked to take it back), `restoring` (the old one kept nothing of it, and takes it over from the object store), `done` (on the new node), `failed` (where it was, or back there, or where a failure no time clears or an operator's cancel found it: `error` says why).
  - `why` (`getBillingStatement.response.401.move.why`; string, required) — What made it: the operator's move, an evacuation, a recovery.
  - `wake` (`getBillingStatement.response.401.move.wake`; boolean, required) — Whether the new node wakes it: as the call said, or as it was (it ran) when the move began.
  - `from_store` (`getBillingStatement.response.401.move.from_store`; boolean, required) — The new node takes it from the object store alone.
  - `release` (`getBillingStatement.response.401.move.release`; object | null, required) — What the old node's release answered (sandboxd/openapi/openapi.json, `releaseSandbox`), without the release's key; null before it answered.
  - `takeover` (`getBillingStatement.response.401.move.takeover`; object | null, required) — What the takeover that ended it answered (`takeoverSandbox` of the node's document): where its disk and memory came from (`source`), how long each took (`ms`), `memory`; null before.
  - `error` (`getBillingStatement.response.401.move.error`; one of, required) — Why it failed, of one that failed (the new node's refusal, where it was taken back to the old node); null, of one that is done; of one under way, what the step it is at was last told where it is asked again.
    - one of: `object`, `null`
  - `attempts` (`getBillingStatement.response.401.move.attempts`; integer, required) — How many times the step it is at was asked without an answer that settles it.
    - min 0
  - `next_attempt_at` (`getBillingStatement.response.401.move.next_attempt_at`; string | null, required) — When that step is asked again; null where it is not waiting.
    - format `date-time`
  - `batch` (`getBillingStatement.response.401.move.batch`; string | null, required) — The evacuation (`evc-…`) or recovery (`rcv-…`) it is of.
  - `created_at` (`getBillingStatement.response.401.move.created_at`; string, required)
    - format `date-time`
  - `updated_at` (`getBillingStatement.response.401.move.updated_at`; string, required)
    - format `date-time`
  - `ended_at` (`getBillingStatement.response.401.move.ended_at`; string | null, required)
    - format `date-time`
- `lease_until` (`getBillingStatement.response.401.lease_until`; string, optional) — With `lease_held`: until when the node may still hold the lease it was granted last, and the time after it for the node to have seen it run out (`recoverNode` is refused until then).
  - format `date-time`
- `active` (`getBillingStatement.response.401.active`; object | null, optional) — With `standby`: the active copy, as the standby last read the lease; null while no copy holds it.
  - `name` (`getBillingStatement.response.401.active.name`; string, required)
  - `url` (`getBillingStatement.response.401.active.url`; string, required)
  - `term` (`getBillingStatement.response.401.active.term`; integer, required)
    - min 1
- `allowed_hosts` (`getBillingStatement.response.401.allowed_hosts`; array | null, optional) — With `secret_host_not_allowed`: the hosts the secret may go to, as the secret has them; null where it was given none (the node's `SecretHosts`).
- `problems` (`getBillingStatement.response.401.problems`; array<object>, optional) — With `invalid_definition`: every problem of the definition, each where it is and what it is.
  - `at` (`getBillingStatement.response.401.problems.at`; string, required) — Where in the definition, a dotted path (`services.web.port`); empty for the whole of it.
  - `message` (`getBillingStatement.response.401.problems.message`; string, required)
- `report` (`getBillingStatement.response.401.report`; object, optional) — With `compose_refused`: the import's report, which says what is refused, why, and what to change.
  - `object` (`getBillingStatement.response.401.report.object`; string, required)
    - one of `"compose_import"`
  - `name` (`getBillingStatement.response.401.report.name`; string | null, required) — The model's `name`: each service's label `compose.project`. Null: it has none.
  - `dry_run` (`getBillingStatement.response.401.report.dry_run`; boolean, required)
  - `strict` (`getBillingStatement.response.401.report.strict`; boolean, required)
  - `profiles` (`getBillingStatement.response.401.report.profiles`; array<string>, required)
  - `treatments` (`getBillingStatement.response.401.report.treatments`; object, required) — How many items of the report have each treatment.
    - `done` (`getBillingStatement.response.401.report.treatments.done`; integer, required)
      - min 0
    - `adapted` (`getBillingStatement.response.401.report.treatments.adapted`; integer, required)
      - min 0
    - `ignored` (`getBillingStatement.response.401.report.treatments.ignored`; integer, required)
      - min 0
    - `refused` (`getBillingStatement.response.401.report.treatments.refused`; integer, required)
      - min 0
  - `items` (`getBillingStatement.response.401.report.items`; array<object>, required) — The model's top-level elements: `name`, each volume, network, config and secret, extensions.
    - `at` (`getBillingStatement.response.401.report.items.at`; string, required) — Where in the model: of a service, its attribute (`ports[0]`, `depends_on.db`, `environment.KEY`), empty for the service as a whole; of the top level, the element (`volumes.db-data`).
    - `treatment` (`getBillingStatement.response.401.report.items.treatment`; string, required) — `done`: it means the same on the platform; `adapted`: the platform does the same another way; `ignored`: it matters to a local run alone (refused with `strict`); `refused`: the platform cannot do it, and doing without it would let the program go wrong quietly.
      - one of `"done"`, `"adapted"`, `"ignored"`, `"refused"`
    - `why` (`getBillingStatement.response.401.report.items.why`; string, required)
    - `change` (`getBillingStatement.response.401.report.items.change`; string | null, required) — Of one that is refused: what to change. Null otherwise.
  - `services` (`getBillingStatement.response.401.report.services`; array<object>, required) — The services the import takes, in the model's order.
    - `name` (`getBillingStatement.response.401.report.services.name`; string, required) — The service's name, which is its app's.
    - `app_id` (`getBillingStatement.response.401.report.services.app_id`; string | null, required) — Its app. Null: a dry run of a service the project does not have.
      - pattern `^app-`
    - `status` (`getBillingStatement.response.401.report.services.status`; string, required) — What the import does (or, in a dry run, would do) to its app: makes it, writes what changed, or nothing.
      - one of `"created"`, `"changed"`, `"unchanged"`
    - `kind` (`getBillingStatement.response.401.report.services.kind`; string, required) — `job`: a service of the model waits for it to complete, and it runs to its end in each deploy that needs it.
      - one of `"service"`, `"job"`
    - `stateful` (`getBillingStatement.response.401.report.services.stateful`; boolean, required) — It mounts a volume of its own: one instance, which has the volume.
    - `version` (`getBillingStatement.response.401.report.services.version`; boolean, required) — Whether the import's deploy makes a version of it: what its version would be made of, its references resolved, is not what its current version is.
    - `items` (`getBillingStatement.response.401.report.services.items`; array<object>, required)
      - `at` (`getBillingStatement.response.401.report.services.items.at`; string, required) — Where in the model: of a service, its attribute (`ports[0]`, `depends_on.db`, `environment.KEY`), empty for the service as a whole; of the top level, the element (`volumes.db-data`).
      - `treatment` (`getBillingStatement.response.401.report.services.items.treatment`; string, required) — `done`: it means the same on the platform; `adapted`: the platform does the same another way; `ignored`: it matters to a local run alone (refused with `strict`); `refused`: the platform cannot do it, and doing without it would let the program go wrong quietly.
        - one of `"done"`, `"adapted"`, `"ignored"`, `"refused"`
      - `why` (`getBillingStatement.response.401.report.services.items.why`; string, required)
      - `change` (`getBillingStatement.response.401.report.services.items.change`; string | null, required) — Of one that is refused: what to change. Null otherwise.
    - `app` (`getBillingStatement.response.401.report.services.app`; object, required) — The fields of the service's app as the import writes them: what its versions are made of, and what holds at once.
      - `image` (`getBillingStatement.response.401.report.services.app.image`; string | null, required) — What the app's next version is made of, with the seven fields after it: its newest version's, with what was changed since. `null`: the app has no image, and no version.
      - `image_pull_secret` (`getBillingStatement.response.401.report.services.app.image_pull_secret`; string | null, required) — The name of the secret that holds the credentials of the image's registry. No answer has its value. `null`: none.
      - `start_command` (`getBillingStatement.response.401.report.services.app.start_command`; any of, required)
        - any of: `StartCommand`, `null`
      - `start_args` (`getBillingStatement.response.401.report.services.app.start_args`; any of, required) — What follows the image's ENTRYPOINT in the place of its CMD. `null`: the image's CMD, or the whole of `start_command`.
        - any of: `array<string>`, `null`
      - `port` (`getBillingStatement.response.401.report.services.app.port`; integer | null, required)
      - `ready` (`getBillingStatement.response.401.report.services.app.ready`; object, required) — How to tell that an instance is up, which a version's template is saved after: exactly one of the three. The first two are asked from outside the instance, so the service has to listen on every address (`0.0.0.0`).
        - `http` (`getBillingStatement.response.401.report.services.app.ready.http`; string, optional) — A path, beginning with `/`: a `GET` of it on the app's port is answered with a status from 200 to 399.
        - `tcp` (`getBillingStatement.response.401.report.services.app.ready.tcp`; boolean, optional) — The app's port takes a connection.
          - one of `true`
        - `command` (`getBillingStatement.response.401.report.services.app.ready.command`; one of, optional) — A command that succeeds in the instance. It is run by the instance's shell: a list of arguments is written as one line for it.
          - one of: `string`, `array<string>`
      - `env` (`getBillingStatement.response.401.report.services.app.env`; map<string>, required)
      - `secrets` (`getBillingStatement.response.401.report.services.app.secrets`; map<string>, required) — Names of secrets. No answer has a value.
      - `size` (`getBillingStatement.response.401.report.services.app.size`; object, required) — What one instance may use at most. It is billed by what it uses.
        - `vcpus` (`getBillingStatement.response.401.report.services.app.size.vcpus`; integer, required)
          - min 1
        - `memory_bytes` (`getBillingStatement.response.401.report.services.app.size.memory_bytes`; integer, required) — An even number of MiB (a whole number of the 2 MiB pages a node loads a machine's memory in), in bytes. Any other size is 400 `invalid_field` (param `size.memory_bytes`): no node would make an instance of it, as none makes a sandbox of it (the node's `SandboxLimitsCreate.memory_bytes`).
          - min 134217728
      - `volumes` (`getBillingStatement.response.401.report.services.app.volumes`; array<object>, required)
        - `volume` (`getBillingStatement.response.401.report.services.app.volumes.volume`; string, required)
        - `path` (`getBillingStatement.response.401.report.services.app.volumes.path`; string, required)
        - `read_only` (`getBillingStatement.response.401.report.services.app.volumes.read_only`; boolean, required)
        - `nocopy` (`getBillingStatement.response.401.report.services.app.volumes.nocopy`; unknown, optional) — There only where it was given as `true`.
      - `kind` (`getBillingStatement.response.401.report.services.app.kind`; string, required)
      - `files` (`getBillingStatement.response.401.report.services.app.files`; array<object>, required)
        - `path` (`getBillingStatement.response.401.report.services.app.files.path`; string, required)
        - `mode` (`getBillingStatement.response.401.report.services.app.files.mode`; integer, required)
        - `uid` (`getBillingStatement.response.401.report.services.app.files.uid`; integer, required)
        - `gid` (`getBillingStatement.response.401.report.services.app.files.gid`; integer, required)
        - `content` (`getBillingStatement.response.401.report.services.app.files.content`; string, optional)
        - `secret` (`getBillingStatement.response.401.report.services.app.files.secret`; string, optional)
      - `user` (`getBillingStatement.response.401.report.services.app.user`; string | null, required)
      - `working_dir` (`getBillingStatement.response.401.report.services.app.working_dir`; string | null, required)
      - `stop` (`getBillingStatement.response.401.report.services.app.stop`; any of, required)
        - any of: `ServiceStop`, `null`
      - `hostname` (`getBillingStatement.response.401.report.services.app.hostname`; string | null, required)
      - `regions` (`getBillingStatement.response.401.report.services.app.regions`; array<string>, required) — In the order na, eu, ap.
      - `scale` (`getBillingStatement.response.401.report.services.app.scale`; object, required)
        - `min_instances` (`getBillingStatement.response.401.report.services.app.scale.min_instances`; integer, required) — How many instances of the app are kept awake in a region, whether a request comes or not: the floor. The nodes of the region that serve the app share it as they share `max_instances` (two nodes and a floor of 2: one on each; a floor of 1: one, on the node that is tried first; a floor of 5: three and two), and a node that is away is made up for by the others. A node makes its part when it is told, not at the first request, and neither stops nor deletes those instances for being idle; they are metered as instances that are awake. 0, which is what it is when nothing is said: none. Lowered, the instances beyond it are idle from that moment, and are stopped and deleted as idle instances are. At most `max_instances`, where that is given, and at most what the account's plan lets an app ask for in a region (`caps.app_instances.limit`: 5, 50 and 500): more is refused, 403 `plan_cap_reached`.
          - min 0
        - `max_instances` (`getBillingStatement.response.401.report.services.app.scale.max_instances`; integer | null, required) — How many instances the app has at the most in a region: the nodes of the region that serve the app share it. At most what the account's plan lets an app ask for (`caps.app_instances.limit`: 5 on the free plan, 50 on `p20`, 200 on `p100`, 500 on `p300`, 1,000 on `p1000`, 2,000 on `p2000`): more is refused, 403 `plan_cap_reached`, and what an app asked for on a plan that let it is kept, and held to the plan's number. `null`: the plan's number for an app that names none (`caps.app_instances.default`: 2, 10, 20, 50, 100 and 200), or `min_instances` where that is more. What the nodes are told is no more than the account has room for awake beside everything else of it that is awake, nor less than the app has awake.
          - min 1
        - `concurrency` (`getBillingStatement.response.401.report.services.app.scale.concurrency`; integer | null, required) — A cap on what one instance has in hand at a time: the requests the edges sent it, and the connections it has open on its project's network (through its service's address, which the node shares out among the instances connection by connection, or to its own). An instance with that many is full, and another is made for more. `null`, which is what it is when nothing is said: no cap. A node then adds an instance when the ones it has are near their size in CPU or memory, and an app does not have to guess a number; a service that takes one request at a time gives one.
          - min 1; max 1000
        - `sleep_after_ms` (`getBillingStatement.response.401.report.services.app.scale.sleep_after_ms`; integer, required) — After how long without a request an instance stops. One that stays stopped is deleted by its node after `delete_after_ms`, and the next request that needs an instance gets a new one; the instances `min_instances` keeps awake are neither stopped nor deleted.
          - min 0; max 600000
        - `sleep_notice_ms` (`getBillingStatement.response.401.report.services.app.scale.sleep_notice_ms`; integer | null, required) — How long before an instance stops for being idle the programs connected to its guest's `/run/sbx/awake` are sent the line `sleep N`, in milliseconds: they flush what they hold, close their connections, or raise a hold, which puts the stop off. The stop comes that long after, whether they answer or not; where nobody is connected, it is not put off. A keyed instance is told as well. 0 or null: not told (the default).
          - min 0; max 60000
        - `sleep_hold_max_ms` (`getBillingStatement.response.401.report.services.app.scale.sleep_hold_max_ms`; integer, required) — How long the holds a program in an instance raises keep it up after its time idle has run out, in milliseconds: a program connects to `/run/sbx/awake` and sends `+` before it answers a request whose work goes on after the answer, and `-` (or closes the connection, or dies) when that work is done; the instance stops `sleep_after_ms` after the last hold is lowered. Past this time it stops whatever holds it, the programs connected told `sleep N cap` first where `sleep_notice_ms` asks for a notice. Held, it runs and is metered as running. 0: holds are not heeded. Null: 30000 (the default).
          - min 0; max 900000
        - `delete_after_ms` (`getBillingStatement.response.401.report.services.app.scale.delete_after_ms`; integer | null, required) — After how long idle an instance is deleted, counted from where its stop is counted from: the next request that needs one gets a new instance, a clone of the version's template, without what the deleted one had gathered in its memory and on its disk (keep what is to last in a volume or a database). A second to an hour, the platform's time, which is the most: more is refused (400 `invalid_field`), and an instance that is to stay warm is one of `min_instances`. `null`, which is what it is when nothing is said: the hour of the nodes (`--app-delete-after-seconds`). A change holds for the instances the app has as for the ones made after: each node judges every instance by the app's time as it is, once a second at the least. Not for the app's keyed instances, which `keys.delete_after_idle_ms` is for.
          - min 1000; max 3600000
        - `suspend_after_ms` (`getBillingStatement.response.401.report.services.app.scale.suspend_after_ms`; integer | null, optional) — How long a stopped instance stays paused before its memory is saved and it sleeps for real, in milliseconds: paused, the next request is answered in a millisecond or two and its memory is metered; asleep, it wakes in a few more and only what it keeps is. Its node holds it to the longest it holds any instance paused (ten minutes); the host's memory running short, a slot another machine needs and a sleep somebody asks for put it to sleep sooner. Null (the default): its node's longest. A database's `suspend_after_seconds` is its app's.
          - min 1000; max 86400000
        - `wake_daily_at` (`getBillingStatement.response.401.report.services.app.scale.wake_daily_at`; string | null, optional) — A time of day in UTC, `HH:MM`, at which the app's keyed instances and its stateful service's instance that rest are woken every day, for work of their own that waits for a wake (a database's maintenance, say); the instances the nodes make and delete by the app's requests are woken by requests alone. The wake is no activity: what runs then is, and once that is done the instance rests again. A stateful service's instance is woken besides for the next run of its PostgreSQL server's `pg_cron` jobs, whatever this says. Null (the default): none. A database's `wake_daily_at` is its app's.
          - pattern `^([01][0-9]|2[0-3]):[0-5][0-9]$`
      - `keys` (`getBillingStatement.response.401.report.services.app.keys`; any of, required)
        - any of: `object`, `null`
      - `egress` (`getBillingStatement.response.401.report.services.app.egress`; object | null, required) — Egress rules as a sandbox has them (`default`, `allow`, `deny`, `http`, `inject`), null when there are none; kept as the calls gave them (a `PATCH` merges them key by key, as a node does). They hold at once and make no version: the nodes that serve the app put them on every instance of its group, the ones there are (one that runs for the connections it has too) and the ones made after; a keyed instance does not have them. The control plane checks only that they are an object of those keys of at most 256 KiB: what the rules say is a node's to check, when it applies them, and an instance whose rules its node cannot read is refused everything (the node's log says why).
        - `default` (`getBillingStatement.response.401.report.services.app.egress.default`; string | null, optional)
          - one of `"allow"`, `"deny"`, `null`
        - `allow` (`getBillingStatement.response.401.report.services.app.egress.allow`; array | null, optional)
        - `deny` (`getBillingStatement.response.401.report.services.app.egress.deny`; array | null, optional)
        - `http` (`getBillingStatement.response.401.report.services.app.egress.http`; array | null, optional)
        - `inject` (`getBillingStatement.response.401.report.services.app.egress.inject`; array | null, optional)
        - `deny_ports` (`getBillingStatement.response.401.report.services.app.egress.deny_ports`; array | null, optional) — Ports no connection reaches, TCP or UDP, wherever it goes and whatever else the rules say. A Browsers session's always hold 25, 465, 587 and the ports mining pools listen on (3333, 4444, 5555, 7777, 14444, 45700): the control plane adds them to whatever a change of its rules gives.
      - `metadata` (`getBillingStatement.response.401.report.services.app.metadata`; map<string>, required)
      - `logs` (`getBillingStatement.response.401.report.services.app.logs`; object, required) — What the app's log has, each part as it was given or at its default (`AppLogSettings`).
        - `output` (`getBillingStatement.response.401.report.services.app.logs.output`; boolean, required)
        - `keep` (`getBillingStatement.response.401.report.services.app.logs.keep`; boolean, required)
        - `requests` (`getBillingStatement.response.401.report.services.app.logs.requests`; object, required)
          - `sample_rate` (`getBillingStatement.response.401.report.services.app.logs.requests.sample_rate`; number, required)
            - min 0; max 1
          - `keep_errors` (`getBillingStatement.response.401.report.services.app.logs.requests.keep_errors`; boolean, required)
      - `public` (`getBillingStatement.response.401.report.services.app.public`; boolean, required) — Whether it answers at its default domain (`url`).
      - `depends_on` (`getBillingStatement.response.401.report.services.app.depends_on`; array<object>, required)
        - `service` (`getBillingStatement.response.401.report.services.app.depends_on.service`; string, required)
        - `condition` (`getBillingStatement.response.401.report.services.app.depends_on.condition`; string, required)
      - `network` (`getBillingStatement.response.401.report.services.app.network`; object, required)
        - `aliases` (`getBillingStatement.response.401.report.services.app.network.aliases`; array<string>, required)
        - `endpoint_mode` (`getBillingStatement.response.401.report.services.app.network.endpoint_mode`; string, required)
      - `drives` (`getBillingStatement.response.401.report.services.app.drives`; array<object>, optional) — The Drives its instance mounts (`AppCreate.drives`): none, `[]`, where it names none.
        - `drive` (`getBillingStatement.response.401.report.services.app.drives.drive`; string, required)
        - `path` (`getBillingStatement.response.401.report.services.app.drives.path`; string, required)
        - `mode` (`getBillingStatement.response.401.report.services.app.drives.mode`; string, required)
      - `key_drives` (`getBillingStatement.response.401.report.services.app.key_drives`; array<object>, optional) — The Drives each key's instance has of its own (`AppCreate.key_drives`): none, `[]`, where it gives none.
        - `name` (`getBillingStatement.response.401.report.services.app.key_drives.name`; string, required)
        - `path` (`getBillingStatement.response.401.report.services.app.key_drives.path`; string, required)
        - `size_bytes` (`getBillingStatement.response.401.report.services.app.key_drives.size_bytes`; integer | null, required)
          - format `int64`
        - `nocopy` (`getBillingStatement.response.401.report.services.app.key_drives.nocopy`; unknown, optional) — There only where it was given as `true`.
      - `runtime` (`getBillingStatement.response.401.report.services.app.runtime`; any of, optional) — Its runtime settings (`AppCreate.runtime`). `null`: none.
        - any of: `Runtime`, `null`
      - `traces` (`getBillingStatement.response.401.report.services.app.traces`; object, optional) — What the app's requests' traces have, each part as it was given or at its default (`AppTraceSettings`): no span where `sample_rate` is 0.
        - `sample_rate` (`getBillingStatement.response.401.report.services.app.traces.sample_rate`; number, required)
          - min 0; max 1
        - `trust_incoming` (`getBillingStatement.response.401.report.services.app.traces.trust_incoming`; boolean, required)
  - `volumes` (`getBillingStatement.response.401.report.volumes`; array<object>, required) — The volumes of the project the services mount.
    - `model` (`getBillingStatement.response.401.report.volumes.model`; string | null, required) — Its name in the model. Null: made for a path a stateful service mounts with no volume named.
    - `name` (`getBillingStatement.response.401.report.volumes.name`; string, required) — Its name in the project.
    - `id` (`getBillingStatement.response.401.report.volumes.id`; string | null, required) — Null: not made yet (`to_make`).
      - pattern `^vol-`
    - `shared` (`getBillingStatement.response.401.report.volumes.shared`; boolean, required) — Several services mount it, or one with several instances: every instance of each mounts it at once.
    - `status` (`getBillingStatement.response.401.report.volumes.status`; string, required) — `to_make`: the import makes it (a dry run says so of what it would make); `made`: this import made it; `there`: an earlier import made it, or a volume of its name was there; `external`: the model names it `external`, and the project has it.
      - one of `"to_make"`, `"made"`, `"there"`, `"external"`
    - `used_by` (`getBillingStatement.response.401.report.volumes.used_by`; array<string>, required)
  - `secrets` (`getBillingStatement.response.401.report.secrets`; array<object>, required) — The secrets of the model that services are granted.
    - `model` (`getBillingStatement.response.401.report.secrets.model`; string, required) — Its name in the model.
    - `name` (`getBillingStatement.response.401.report.secrets.name`; string, required) — The project's secret that holds it: the model's name, with each character a secret's name does not take written as an underscore.
    - `there` (`getBillingStatement.response.401.report.secrets.there`; boolean, required) — Whether the project has it. An import (not a dry run) with one that is not there is refused 404 `secret_not_found`.
    - `used_by` (`getBillingStatement.response.401.report.secrets.used_by`; array<string>, required)
  - `left_out` (`getBillingStatement.response.401.report.left_out`; array<object>, required) — The services of profiles that are not turned on, which the import does not touch.
    - `name` (`getBillingStatement.response.401.report.left_out.name`; string, required)
    - `profiles` (`getBillingStatement.response.401.report.left_out.profiles`; array<string>, required)
  - `absent` (`getBillingStatement.response.401.report.absent`; array<string>, required) — The project's services that the model does not have: kept as they are.
  - `deploy` (`getBillingStatement.response.401.report.deploy`; string | null, required) — The deploy the import made (`GET /v1/deploys/{id}`). Null: a dry run, or nothing would get a version.
    - pattern `^dpl-`
- `accounts` (`getBillingStatement.response.401.accounts`; array<object>, optional) — With `sole_owner`: the accounts the user is the only owner of.
  - `id` (`getBillingStatement.response.401.accounts.id`; string, required)
    - pattern `^acct-[0-9a-hjkmnp-tv-z]{16}$`
  - `name` (`getBillingStatement.response.401.accounts.name`; string, required)

### 403

`key_scope`: the key does not allow the scope the call takes (the message names it); `needs_api_key`: the operator's key, or the SSH gateway's; `account_held`: the account is held for its payments, and every call of its keys but `GET /v1/account` is refused so, before the scopes are looked at (`x-error-codes`); `installation_key_scope`: a key held to an installation of a Managed Application, on a call that is not about that installation's own things. (A sandbox token is passed to its node, which answers what it has no call for with 404 `no_such_route`.)

#### Example

```json
{
  "move_id": "string",
  "upgrade_id": "string",
  "move": {
    "object": "move",
    "id": "string",
    "sandbox_id": "string",
    "project_id": "string",
    "from": {
      "id": "string",
      "name": "string"
    },
    "to": {
      "id": "string",
      "name": "string"
    },
    "epoch": 1,
    "step": "string",
    "why": "string",
    "wake": true,
    "from_store": true,
    "release": {},
    "takeover": {},
    "error": {
      "code": "string",
      "message": "string",
      "status": 0,
      "takeover_refused": {
        "code": "string",
        "message": "string",
        "status": 0
      },
      "image": "string",
      "holder": "string",
      "holder_says": "has"
    },
    "attempts": 0,
    "next_attempt_at": "2019-08-24T14:15:22Z",
    "batch": "string",
    "created_at": "2019-08-24T14:15:22Z",
    "updated_at": "2019-08-24T14:15:22Z",
    "ended_at": "2019-08-24T14:15:22Z"
  },
  "lease_until": "2019-08-24T14:15:22Z",
  "active": {
    "name": "string",
    "url": "string",
    "term": 1
  },
  "allowed_hosts": [
    "string"
  ],
  "problems": [
    {
      "at": "string",
      "message": "string"
    }
  ],
  "report": {
    "object": "compose_import",
    "name": "string",
    "dry_run": true,
    "strict": true,
    "profiles": [
      "string"
    ],
    "treatments": {
      "done": 0,
      "adapted": 0,
      "ignored": 0,
      "refused": 0
    },
    "items": [
      {
        "at": "string",
        "treatment": "done",
        "why": "string",
        "change": "string"
      }
    ],
    "services": [
      {
        "name": "string",
        "app_id": "string",
        "status": "created",
        "kind": "service",
        "stateful": true,
        "version": true,
        "items": [
          {
            "at": "string",
            "treatment": "done",
            "why": "string",
            "change": "string"
          }
        ],
        "app": {
          "image": "string",
          "image_pull_secret": "string",
          "start_command": "string",
          "start_args": [
            "string"
          ],
          "port": 0,
          "ready": {
            "http": "string"
          },
          "env": {
            "property1": "string",
            "property2": "string"
          },
          "secrets": {
            "property1": "string",
            "property2": "string"
          },
          "size": {
            "vcpus": 1,
            "memory_bytes": 134217728
          },
          "volumes": [
            {
              "volume": "string",
              "path": "string",
              "read_only": true,
              "nocopy": true
            }
          ],
          "drives": [
            {
              "drive": "string",
              "path": "string",
              "mode": "string"
            }
          ],
          "key_drives": [
            {
              "name": "string",
              "path": "string",
              "size_bytes": 0,
              "nocopy": true
            }
          ],
          "kind": "string",
          "files": [
            {
              "path": "string",
              "content": "string",
              "secret": "string",
              "mode": 0,
              "uid": 0,
              "gid": 0
            }
          ],
          "user": "string",
          "working_dir": "string",
          "stop": {
            "signal": "string",
            "grace_ms": 0
          },
          "hostname": "string",
          "runtime": {
            "ulimits": {
              "property1": {},
              "property2": {}
            },
            "sysctls": {
              "property1": "string",
              "property2": "string"
            },
            "tmpfs": [
              {}
            ],
            "dns": {
              "servers": [
                null
              ],
              "search": [
                null
              ],
              "options": [
                null
              ]
            },
            "shm_size_bytes": 0
          },
          "regions": [
            "string"
          ],
          "scale": {
            "min_instances": 0,
            "max_instances": 1,
            "concurrency": 1,
            "sleep_after_ms": 600000,
            "sleep_notice_ms": 60000,
            "sleep_hold_max_ms": 900000,
            "suspend_after_ms": 1000,
            "wake_daily_at": "string",
            "delete_after_ms": 1000
          },
          "keys": {
            "from": {
              "header": "string"
            },
            "upgrade_on_deploy": true,
            "delete_after_idle_ms": 1000
          },
          "egress": {
            "default": "allow",
            "allow": [
              "string"
            ],
            "deny": [
              "string"
            ],
            "http": [
              {
                "allow": []
              }
            ],
            "inject": [
              {
                "headers": {}
              }
            ],
            "deny_ports": [
              1
            ]
          },
          "metadata": {
            "property1": "string",
            "property2": "string"
          },
          "logs": {
            "output": true,
            "keep": true,
            "requests": {
              "sample_rate": 1,
              "keep_errors": true
            }
          },
          "traces": {
            "sample_rate": 1,
            "trust_incoming": true
          },
          "public": true,
          "depends_on": [
            {
              "service": "string",
              "condition": "string"
            }
          ],
          "network": {
            "aliases": [
              "string"
            ],
            "endpoint_mode": "string"
          }
        }
      }
    ],
    "volumes": [
      {
        "model": "string",
        "name": "string",
        "id": "string",
        "shared": true,
        "status": "to_make",
        "used_by": [
          "string"
        ]
      }
    ],
    "secrets": [
      {
        "model": "string",
        "name": "string",
        "there": true,
        "used_by": [
          "string"
        ]
      }
    ],
    "left_out": [
      {
        "name": "string",
        "profiles": [
          "string"
        ]
      }
    ],
    "absent": [
      "string"
    ],
    "deploy": "string"
  },
  "accounts": [
    {
      "id": "string",
      "name": "string"
    }
  ],
  "error": {
    "type": "string",
    "code": "string",
    "message": "string",
    "param": "string",
    "retryable": true,
    "request_id": "string",
    "docs_url": "string"
  }
}
```

- `error` (`getBillingStatement.response.403.error`; object, required)
  - `type` (`getBillingStatement.response.403.error.type`; string, required)
  - `code` (`getBillingStatement.response.403.error.code`; string, required)
  - `message` (`getBillingStatement.response.403.error.message`; string, required)
  - `param` (`getBillingStatement.response.403.error.param`; string | null, required)
  - `retryable` (`getBillingStatement.response.403.error.retryable`; boolean, required)
  - `request_id` (`getBillingStatement.response.403.error.request_id`; string, required)
  - `docs_url` (`getBillingStatement.response.403.error.docs_url`; string | null, required)
- `move_id` (`getBillingStatement.response.403.move_id`; string, optional) — With `already_moving`: the move of the sandbox that is under way.
- `upgrade_id` (`getBillingStatement.response.403.upgrade_id`; string, optional) — With `upgrade_in_progress` (the key's upgrade that is not over), `upgrade_started` (the upgrade that has begun) and `rollback_gone` (the upgrade whose revert is refused): that upgrade.
  - pattern `^upg-[0-9a-hjkmnp-tv-z]{16}$`
- `move` (`getBillingStatement.response.403.move`; object, optional) — With `move_over`, `move_going_back` and `move_taken_over` (`POST /internal/moves/{id}/cancel`): the move, as it stands.
  - `object` (`getBillingStatement.response.403.move.object`; string, required)
  - `id` (`getBillingStatement.response.403.move.id`; string, required)
    - pattern `^mov-[0-9a-hjkmnp-tv-z]{16}$`
  - `sandbox_id` (`getBillingStatement.response.403.move.sandbox_id`; string, required)
  - `project_id` (`getBillingStatement.response.403.move.project_id`; string, required)
  - `from` (`getBillingStatement.response.403.move.from`; object, required)
    - `id` (`getBillingStatement.response.403.move.from.id`; string, required)
    - `name` (`getBillingStatement.response.403.move.from.name`; string | null, required) — Its name; null for a node that is off the books since.
  - `to` (`getBillingStatement.response.403.move.to`; object, required)
    - `id` (`getBillingStatement.response.403.move.to.id`; string, required)
    - `name` (`getBillingStatement.response.403.move.to.name`; string | null, required) — Its name; null for a node that is off the books since.
  - `epoch` (`getBillingStatement.response.403.move.epoch`; integer, required) — The epoch the table held the sandbox at when the move began: the old node releases it at it, the new one takes it over one on, the old one takes it back two on, and from the object store three on.
    - min 1
  - `step` (`getBillingStatement.response.403.move.step`; string, required) — Where it stands: `releasing` (the old node is asked to release it; the table has it there), `taking_over` (the new node is asked to take it over; the table has it there), `reclaiming` (the new node refused it, and the old one is asked to take it back), `restoring` (the old one kept nothing of it, and takes it over from the object store), `done` (on the new node), `failed` (where it was, or back there, or where a failure no time clears or an operator's cancel found it: `error` says why).
  - `why` (`getBillingStatement.response.403.move.why`; string, required) — What made it: the operator's move, an evacuation, a recovery.
  - `wake` (`getBillingStatement.response.403.move.wake`; boolean, required) — Whether the new node wakes it: as the call said, or as it was (it ran) when the move began.
  - `from_store` (`getBillingStatement.response.403.move.from_store`; boolean, required) — The new node takes it from the object store alone.
  - `release` (`getBillingStatement.response.403.move.release`; object | null, required) — What the old node's release answered (sandboxd/openapi/openapi.json, `releaseSandbox`), without the release's key; null before it answered.
  - `takeover` (`getBillingStatement.response.403.move.takeover`; object | null, required) — What the takeover that ended it answered (`takeoverSandbox` of the node's document): where its disk and memory came from (`source`), how long each took (`ms`), `memory`; null before.
  - `error` (`getBillingStatement.response.403.move.error`; one of, required) — Why it failed, of one that failed (the new node's refusal, where it was taken back to the old node); null, of one that is done; of one under way, what the step it is at was last told where it is asked again.
    - one of: `object`, `null`
  - `attempts` (`getBillingStatement.response.403.move.attempts`; integer, required) — How many times the step it is at was asked without an answer that settles it.
    - min 0
  - `next_attempt_at` (`getBillingStatement.response.403.move.next_attempt_at`; string | null, required) — When that step is asked again; null where it is not waiting.
    - format `date-time`
  - `batch` (`getBillingStatement.response.403.move.batch`; string | null, required) — The evacuation (`evc-…`) or recovery (`rcv-…`) it is of.
  - `created_at` (`getBillingStatement.response.403.move.created_at`; string, required)
    - format `date-time`
  - `updated_at` (`getBillingStatement.response.403.move.updated_at`; string, required)
    - format `date-time`
  - `ended_at` (`getBillingStatement.response.403.move.ended_at`; string | null, required)
    - format `date-time`
- `lease_until` (`getBillingStatement.response.403.lease_until`; string, optional) — With `lease_held`: until when the node may still hold the lease it was granted last, and the time after it for the node to have seen it run out (`recoverNode` is refused until then).
  - format `date-time`
- `active` (`getBillingStatement.response.403.active`; object | null, optional) — With `standby`: the active copy, as the standby last read the lease; null while no copy holds it.
  - `name` (`getBillingStatement.response.403.active.name`; string, required)
  - `url` (`getBillingStatement.response.403.active.url`; string, required)
  - `term` (`getBillingStatement.response.403.active.term`; integer, required)
    - min 1
- `allowed_hosts` (`getBillingStatement.response.403.allowed_hosts`; array | null, optional) — With `secret_host_not_allowed`: the hosts the secret may go to, as the secret has them; null where it was given none (the node's `SecretHosts`).
- `problems` (`getBillingStatement.response.403.problems`; array<object>, optional) — With `invalid_definition`: every problem of the definition, each where it is and what it is.
  - `at` (`getBillingStatement.response.403.problems.at`; string, required) — Where in the definition, a dotted path (`services.web.port`); empty for the whole of it.
  - `message` (`getBillingStatement.response.403.problems.message`; string, required)
- `report` (`getBillingStatement.response.403.report`; object, optional) — With `compose_refused`: the import's report, which says what is refused, why, and what to change.
  - `object` (`getBillingStatement.response.403.report.object`; string, required)
    - one of `"compose_import"`
  - `name` (`getBillingStatement.response.403.report.name`; string | null, required) — The model's `name`: each service's label `compose.project`. Null: it has none.
  - `dry_run` (`getBillingStatement.response.403.report.dry_run`; boolean, required)
  - `strict` (`getBillingStatement.response.403.report.strict`; boolean, required)
  - `profiles` (`getBillingStatement.response.403.report.profiles`; array<string>, required)
  - `treatments` (`getBillingStatement.response.403.report.treatments`; object, required) — How many items of the report have each treatment.
    - `done` (`getBillingStatement.response.403.report.treatments.done`; integer, required)
      - min 0
    - `adapted` (`getBillingStatement.response.403.report.treatments.adapted`; integer, required)
      - min 0
    - `ignored` (`getBillingStatement.response.403.report.treatments.ignored`; integer, required)
      - min 0
    - `refused` (`getBillingStatement.response.403.report.treatments.refused`; integer, required)
      - min 0
  - `items` (`getBillingStatement.response.403.report.items`; array<object>, required) — The model's top-level elements: `name`, each volume, network, config and secret, extensions.
    - `at` (`getBillingStatement.response.403.report.items.at`; string, required) — Where in the model: of a service, its attribute (`ports[0]`, `depends_on.db`, `environment.KEY`), empty for the service as a whole; of the top level, the element (`volumes.db-data`).
    - `treatment` (`getBillingStatement.response.403.report.items.treatment`; string, required) — `done`: it means the same on the platform; `adapted`: the platform does the same another way; `ignored`: it matters to a local run alone (refused with `strict`); `refused`: the platform cannot do it, and doing without it would let the program go wrong quietly.
      - one of `"done"`, `"adapted"`, `"ignored"`, `"refused"`
    - `why` (`getBillingStatement.response.403.report.items.why`; string, required)
    - `change` (`getBillingStatement.response.403.report.items.change`; string | null, required) — Of one that is refused: what to change. Null otherwise.
  - `services` (`getBillingStatement.response.403.report.services`; array<object>, required) — The services the import takes, in the model's order.
    - `name` (`getBillingStatement.response.403.report.services.name`; string, required) — The service's name, which is its app's.
    - `app_id` (`getBillingStatement.response.403.report.services.app_id`; string | null, required) — Its app. Null: a dry run of a service the project does not have.
      - pattern `^app-`
    - `status` (`getBillingStatement.response.403.report.services.status`; string, required) — What the import does (or, in a dry run, would do) to its app: makes it, writes what changed, or nothing.
      - one of `"created"`, `"changed"`, `"unchanged"`
    - `kind` (`getBillingStatement.response.403.report.services.kind`; string, required) — `job`: a service of the model waits for it to complete, and it runs to its end in each deploy that needs it.
      - one of `"service"`, `"job"`
    - `stateful` (`getBillingStatement.response.403.report.services.stateful`; boolean, required) — It mounts a volume of its own: one instance, which has the volume.
    - `version` (`getBillingStatement.response.403.report.services.version`; boolean, required) — Whether the import's deploy makes a version of it: what its version would be made of, its references resolved, is not what its current version is.
    - `items` (`getBillingStatement.response.403.report.services.items`; array<object>, required)
      - `at` (`getBillingStatement.response.403.report.services.items.at`; string, required) — Where in the model: of a service, its attribute (`ports[0]`, `depends_on.db`, `environment.KEY`), empty for the service as a whole; of the top level, the element (`volumes.db-data`).
      - `treatment` (`getBillingStatement.response.403.report.services.items.treatment`; string, required) — `done`: it means the same on the platform; `adapted`: the platform does the same another way; `ignored`: it matters to a local run alone (refused with `strict`); `refused`: the platform cannot do it, and doing without it would let the program go wrong quietly.
        - one of `"done"`, `"adapted"`, `"ignored"`, `"refused"`
      - `why` (`getBillingStatement.response.403.report.services.items.why`; string, required)
      - `change` (`getBillingStatement.response.403.report.services.items.change`; string | null, required) — Of one that is refused: what to change. Null otherwise.
    - `app` (`getBillingStatement.response.403.report.services.app`; object, required) — The fields of the service's app as the import writes them: what its versions are made of, and what holds at once.
      - `image` (`getBillingStatement.response.403.report.services.app.image`; string | null, required) — What the app's next version is made of, with the seven fields after it: its newest version's, with what was changed since. `null`: the app has no image, and no version.
      - `image_pull_secret` (`getBillingStatement.response.403.report.services.app.image_pull_secret`; string | null, required) — The name of the secret that holds the credentials of the image's registry. No answer has its value. `null`: none.
      - `start_command` (`getBillingStatement.response.403.report.services.app.start_command`; any of, required)
        - any of: `StartCommand`, `null`
      - `start_args` (`getBillingStatement.response.403.report.services.app.start_args`; any of, required) — What follows the image's ENTRYPOINT in the place of its CMD. `null`: the image's CMD, or the whole of `start_command`.
        - any of: `array<string>`, `null`
      - `port` (`getBillingStatement.response.403.report.services.app.port`; integer | null, required)
      - `ready` (`getBillingStatement.response.403.report.services.app.ready`; object, required) — How to tell that an instance is up, which a version's template is saved after: exactly one of the three. The first two are asked from outside the instance, so the service has to listen on every address (`0.0.0.0`).
        - `http` (`getBillingStatement.response.403.report.services.app.ready.http`; string, optional) — A path, beginning with `/`: a `GET` of it on the app's port is answered with a status from 200 to 399.
        - `tcp` (`getBillingStatement.response.403.report.services.app.ready.tcp`; boolean, optional) — The app's port takes a connection.
          - one of `true`
        - `command` (`getBillingStatement.response.403.report.services.app.ready.command`; one of, optional) — A command that succeeds in the instance. It is run by the instance's shell: a list of arguments is written as one line for it.
          - one of: `string`, `array<string>`
      - `env` (`getBillingStatement.response.403.report.services.app.env`; map<string>, required)
      - `secrets` (`getBillingStatement.response.403.report.services.app.secrets`; map<string>, required) — Names of secrets. No answer has a value.
      - `size` (`getBillingStatement.response.403.report.services.app.size`; object, required) — What one instance may use at most. It is billed by what it uses.
        - `vcpus` (`getBillingStatement.response.403.report.services.app.size.vcpus`; integer, required)
          - min 1
        - `memory_bytes` (`getBillingStatement.response.403.report.services.app.size.memory_bytes`; integer, required) — An even number of MiB (a whole number of the 2 MiB pages a node loads a machine's memory in), in bytes. Any other size is 400 `invalid_field` (param `size.memory_bytes`): no node would make an instance of it, as none makes a sandbox of it (the node's `SandboxLimitsCreate.memory_bytes`).
          - min 134217728
      - `volumes` (`getBillingStatement.response.403.report.services.app.volumes`; array<object>, required)
        - `volume` (`getBillingStatement.response.403.report.services.app.volumes.volume`; string, required)
        - `path` (`getBillingStatement.response.403.report.services.app.volumes.path`; string, required)
        - `read_only` (`getBillingStatement.response.403.report.services.app.volumes.read_only`; boolean, required)
        - `nocopy` (`getBillingStatement.response.403.report.services.app.volumes.nocopy`; unknown, optional) — There only where it was given as `true`.
      - `kind` (`getBillingStatement.response.403.report.services.app.kind`; string, required)
      - `files` (`getBillingStatement.response.403.report.services.app.files`; array<object>, required)
        - `path` (`getBillingStatement.response.403.report.services.app.files.path`; string, required)
        - `mode` (`getBillingStatement.response.403.report.services.app.files.mode`; integer, required)
        - `uid` (`getBillingStatement.response.403.report.services.app.files.uid`; integer, required)
        - `gid` (`getBillingStatement.response.403.report.services.app.files.gid`; integer, required)
        - `content` (`getBillingStatement.response.403.report.services.app.files.content`; string, optional)
        - `secret` (`getBillingStatement.response.403.report.services.app.files.secret`; string, optional)
      - `user` (`getBillingStatement.response.403.report.services.app.user`; string | null, required)
      - `working_dir` (`getBillingStatement.response.403.report.services.app.working_dir`; string | null, required)
      - `stop` (`getBillingStatement.response.403.report.services.app.stop`; any of, required)
        - any of: `ServiceStop`, `null`
      - `hostname` (`getBillingStatement.response.403.report.services.app.hostname`; string | null, required)
      - `regions` (`getBillingStatement.response.403.report.services.app.regions`; array<string>, required) — In the order na, eu, ap.
      - `scale` (`getBillingStatement.response.403.report.services.app.scale`; object, required)
        - `min_instances` (`getBillingStatement.response.403.report.services.app.scale.min_instances`; integer, required) — How many instances of the app are kept awake in a region, whether a request comes or not: the floor. The nodes of the region that serve the app share it as they share `max_instances` (two nodes and a floor of 2: one on each; a floor of 1: one, on the node that is tried first; a floor of 5: three and two), and a node that is away is made up for by the others. A node makes its part when it is told, not at the first request, and neither stops nor deletes those instances for being idle; they are metered as instances that are awake. 0, which is what it is when nothing is said: none. Lowered, the instances beyond it are idle from that moment, and are stopped and deleted as idle instances are. At most `max_instances`, where that is given, and at most what the account's plan lets an app ask for in a region (`caps.app_instances.limit`: 5, 50 and 500): more is refused, 403 `plan_cap_reached`.
          - min 0
        - `max_instances` (`getBillingStatement.response.403.report.services.app.scale.max_instances`; integer | null, required) — How many instances the app has at the most in a region: the nodes of the region that serve the app share it. At most what the account's plan lets an app ask for (`caps.app_instances.limit`: 5 on the free plan, 50 on `p20`, 200 on `p100`, 500 on `p300`, 1,000 on `p1000`, 2,000 on `p2000`): more is refused, 403 `plan_cap_reached`, and what an app asked for on a plan that let it is kept, and held to the plan's number. `null`: the plan's number for an app that names none (`caps.app_instances.default`: 2, 10, 20, 50, 100 and 200), or `min_instances` where that is more. What the nodes are told is no more than the account has room for awake beside everything else of it that is awake, nor less than the app has awake.
          - min 1
        - `concurrency` (`getBillingStatement.response.403.report.services.app.scale.concurrency`; integer | null, required) — A cap on what one instance has in hand at a time: the requests the edges sent it, and the connections it has open on its project's network (through its service's address, which the node shares out among the instances connection by connection, or to its own). An instance with that many is full, and another is made for more. `null`, which is what it is when nothing is said: no cap. A node then adds an instance when the ones it has are near their size in CPU or memory, and an app does not have to guess a number; a service that takes one request at a time gives one.
          - min 1; max 1000
        - `sleep_after_ms` (`getBillingStatement.response.403.report.services.app.scale.sleep_after_ms`; integer, required) — After how long without a request an instance stops. One that stays stopped is deleted by its node after `delete_after_ms`, and the next request that needs an instance gets a new one; the instances `min_instances` keeps awake are neither stopped nor deleted.
          - min 0; max 600000
        - `sleep_notice_ms` (`getBillingStatement.response.403.report.services.app.scale.sleep_notice_ms`; integer | null, required) — How long before an instance stops for being idle the programs connected to its guest's `/run/sbx/awake` are sent the line `sleep N`, in milliseconds: they flush what they hold, close their connections, or raise a hold, which puts the stop off. The stop comes that long after, whether they answer or not; where nobody is connected, it is not put off. A keyed instance is told as well. 0 or null: not told (the default).
          - min 0; max 60000
        - `sleep_hold_max_ms` (`getBillingStatement.response.403.report.services.app.scale.sleep_hold_max_ms`; integer, required) — How long the holds a program in an instance raises keep it up after its time idle has run out, in milliseconds: a program connects to `/run/sbx/awake` and sends `+` before it answers a request whose work goes on after the answer, and `-` (or closes the connection, or dies) when that work is done; the instance stops `sleep_after_ms` after the last hold is lowered. Past this time it stops whatever holds it, the programs connected told `sleep N cap` first where `sleep_notice_ms` asks for a notice. Held, it runs and is metered as running. 0: holds are not heeded. Null: 30000 (the default).
          - min 0; max 900000
        - `delete_after_ms` (`getBillingStatement.response.403.report.services.app.scale.delete_after_ms`; integer | null, required) — After how long idle an instance is deleted, counted from where its stop is counted from: the next request that needs one gets a new instance, a clone of the version's template, without what the deleted one had gathered in its memory and on its disk (keep what is to last in a volume or a database). A second to an hour, the platform's time, which is the most: more is refused (400 `invalid_field`), and an instance that is to stay warm is one of `min_instances`. `null`, which is what it is when nothing is said: the hour of the nodes (`--app-delete-after-seconds`). A change holds for the instances the app has as for the ones made after: each node judges every instance by the app's time as it is, once a second at the least. Not for the app's keyed instances, which `keys.delete_after_idle_ms` is for.
          - min 1000; max 3600000
        - `suspend_after_ms` (`getBillingStatement.response.403.report.services.app.scale.suspend_after_ms`; integer | null, optional) — How long a stopped instance stays paused before its memory is saved and it sleeps for real, in milliseconds: paused, the next request is answered in a millisecond or two and its memory is metered; asleep, it wakes in a few more and only what it keeps is. Its node holds it to the longest it holds any instance paused (ten minutes); the host's memory running short, a slot another machine needs and a sleep somebody asks for put it to sleep sooner. Null (the default): its node's longest. A database's `suspend_after_seconds` is its app's.
          - min 1000; max 86400000
        - `wake_daily_at` (`getBillingStatement.response.403.report.services.app.scale.wake_daily_at`; string | null, optional) — A time of day in UTC, `HH:MM`, at which the app's keyed instances and its stateful service's instance that rest are woken every day, for work of their own that waits for a wake (a database's maintenance, say); the instances the nodes make and delete by the app's requests are woken by requests alone. The wake is no activity: what runs then is, and once that is done the instance rests again. A stateful service's instance is woken besides for the next run of its PostgreSQL server's `pg_cron` jobs, whatever this says. Null (the default): none. A database's `wake_daily_at` is its app's.
          - pattern `^([01][0-9]|2[0-3]):[0-5][0-9]$`
      - `keys` (`getBillingStatement.response.403.report.services.app.keys`; any of, required)
        - any of: `object`, `null`
      - `egress` (`getBillingStatement.response.403.report.services.app.egress`; object | null, required) — Egress rules as a sandbox has them (`default`, `allow`, `deny`, `http`, `inject`), null when there are none; kept as the calls gave them (a `PATCH` merges them key by key, as a node does). They hold at once and make no version: the nodes that serve the app put them on every instance of its group, the ones there are (one that runs for the connections it has too) and the ones made after; a keyed instance does not have them. The control plane checks only that they are an object of those keys of at most 256 KiB: what the rules say is a node's to check, when it applies them, and an instance whose rules its node cannot read is refused everything (the node's log says why).
        - `default` (`getBillingStatement.response.403.report.services.app.egress.default`; string | null, optional)
          - one of `"allow"`, `"deny"`, `null`
        - `allow` (`getBillingStatement.response.403.report.services.app.egress.allow`; array | null, optional)
        - `deny` (`getBillingStatement.response.403.report.services.app.egress.deny`; array | null, optional)
        - `http` (`getBillingStatement.response.403.report.services.app.egress.http`; array | null, optional)
        - `inject` (`getBillingStatement.response.403.report.services.app.egress.inject`; array | null, optional)
        - `deny_ports` (`getBillingStatement.response.403.report.services.app.egress.deny_ports`; array | null, optional) — Ports no connection reaches, TCP or UDP, wherever it goes and whatever else the rules say. A Browsers session's always hold 25, 465, 587 and the ports mining pools listen on (3333, 4444, 5555, 7777, 14444, 45700): the control plane adds them to whatever a change of its rules gives.
      - `metadata` (`getBillingStatement.response.403.report.services.app.metadata`; map<string>, required)
      - `logs` (`getBillingStatement.response.403.report.services.app.logs`; object, required) — What the app's log has, each part as it was given or at its default (`AppLogSettings`).
        - `output` (`getBillingStatement.response.403.report.services.app.logs.output`; boolean, required)
        - `keep` (`getBillingStatement.response.403.report.services.app.logs.keep`; boolean, required)
        - `requests` (`getBillingStatement.response.403.report.services.app.logs.requests`; object, required)
          - `sample_rate` (`getBillingStatement.response.403.report.services.app.logs.requests.sample_rate`; number, required)
            - min 0; max 1
          - `keep_errors` (`getBillingStatement.response.403.report.services.app.logs.requests.keep_errors`; boolean, required)
      - `public` (`getBillingStatement.response.403.report.services.app.public`; boolean, required) — Whether it answers at its default domain (`url`).
      - `depends_on` (`getBillingStatement.response.403.report.services.app.depends_on`; array<object>, required)
        - `service` (`getBillingStatement.response.403.report.services.app.depends_on.service`; string, required)
        - `condition` (`getBillingStatement.response.403.report.services.app.depends_on.condition`; string, required)
      - `network` (`getBillingStatement.response.403.report.services.app.network`; object, required)
        - `aliases` (`getBillingStatement.response.403.report.services.app.network.aliases`; array<string>, required)
        - `endpoint_mode` (`getBillingStatement.response.403.report.services.app.network.endpoint_mode`; string, required)
      - `drives` (`getBillingStatement.response.403.report.services.app.drives`; array<object>, optional) — The Drives its instance mounts (`AppCreate.drives`): none, `[]`, where it names none.
        - `drive` (`getBillingStatement.response.403.report.services.app.drives.drive`; string, required)
        - `path` (`getBillingStatement.response.403.report.services.app.drives.path`; string, required)
        - `mode` (`getBillingStatement.response.403.report.services.app.drives.mode`; string, required)
      - `key_drives` (`getBillingStatement.response.403.report.services.app.key_drives`; array<object>, optional) — The Drives each key's instance has of its own (`AppCreate.key_drives`): none, `[]`, where it gives none.
        - `name` (`getBillingStatement.response.403.report.services.app.key_drives.name`; string, required)
        - `path` (`getBillingStatement.response.403.report.services.app.key_drives.path`; string, required)
        - `size_bytes` (`getBillingStatement.response.403.report.services.app.key_drives.size_bytes`; integer | null, required)
          - format `int64`
        - `nocopy` (`getBillingStatement.response.403.report.services.app.key_drives.nocopy`; unknown, optional) — There only where it was given as `true`.
      - `runtime` (`getBillingStatement.response.403.report.services.app.runtime`; any of, optional) — Its runtime settings (`AppCreate.runtime`). `null`: none.
        - any of: `Runtime`, `null`
      - `traces` (`getBillingStatement.response.403.report.services.app.traces`; object, optional) — What the app's requests' traces have, each part as it was given or at its default (`AppTraceSettings`): no span where `sample_rate` is 0.
        - `sample_rate` (`getBillingStatement.response.403.report.services.app.traces.sample_rate`; number, required)
          - min 0; max 1
        - `trust_incoming` (`getBillingStatement.response.403.report.services.app.traces.trust_incoming`; boolean, required)
  - `volumes` (`getBillingStatement.response.403.report.volumes`; array<object>, required) — The volumes of the project the services mount.
    - `model` (`getBillingStatement.response.403.report.volumes.model`; string | null, required) — Its name in the model. Null: made for a path a stateful service mounts with no volume named.
    - `name` (`getBillingStatement.response.403.report.volumes.name`; string, required) — Its name in the project.
    - `id` (`getBillingStatement.response.403.report.volumes.id`; string | null, required) — Null: not made yet (`to_make`).
      - pattern `^vol-`
    - `shared` (`getBillingStatement.response.403.report.volumes.shared`; boolean, required) — Several services mount it, or one with several instances: every instance of each mounts it at once.
    - `status` (`getBillingStatement.response.403.report.volumes.status`; string, required) — `to_make`: the import makes it (a dry run says so of what it would make); `made`: this import made it; `there`: an earlier import made it, or a volume of its name was there; `external`: the model names it `external`, and the project has it.
      - one of `"to_make"`, `"made"`, `"there"`, `"external"`
    - `used_by` (`getBillingStatement.response.403.report.volumes.used_by`; array<string>, required)
  - `secrets` (`getBillingStatement.response.403.report.secrets`; array<object>, required) — The secrets of the model that services are granted.
    - `model` (`getBillingStatement.response.403.report.secrets.model`; string, required) — Its name in the model.
    - `name` (`getBillingStatement.response.403.report.secrets.name`; string, required) — The project's secret that holds it: the model's name, with each character a secret's name does not take written as an underscore.
    - `there` (`getBillingStatement.response.403.report.secrets.there`; boolean, required) — Whether the project has it. An import (not a dry run) with one that is not there is refused 404 `secret_not_found`.
    - `used_by` (`getBillingStatement.response.403.report.secrets.used_by`; array<string>, required)
  - `left_out` (`getBillingStatement.response.403.report.left_out`; array<object>, required) — The services of profiles that are not turned on, which the import does not touch.
    - `name` (`getBillingStatement.response.403.report.left_out.name`; string, required)
    - `profiles` (`getBillingStatement.response.403.report.left_out.profiles`; array<string>, required)
  - `absent` (`getBillingStatement.response.403.report.absent`; array<string>, required) — The project's services that the model does not have: kept as they are.
  - `deploy` (`getBillingStatement.response.403.report.deploy`; string | null, required) — The deploy the import made (`GET /v1/deploys/{id}`). Null: a dry run, or nothing would get a version.
    - pattern `^dpl-`
- `accounts` (`getBillingStatement.response.403.accounts`; array<object>, optional) — With `sole_owner`: the accounts the user is the only owner of.
  - `id` (`getBillingStatement.response.403.accounts.id`; string, required)
    - pattern `^acct-[0-9a-hjkmnp-tv-z]{16}$`
  - `name` (`getBillingStatement.response.403.accounts.name`; string, required)


Source: https://glac.ai/docs/api/billing/get-statement/index.md
