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

# Export usage with the FOCUS API

> Pull hourly CoreWeave usage in FOCUS 1.2 JSON or CSV format (Public Preview)

The FOCUS Billing Export API lets you pull your CoreWeave usage data in [FinOps Open Cost and Usage Specification (FOCUS) 1.2](https://focus.finops.org/) format. Use it to load CoreWeave usage into a data warehouse or FinOps tool alongside exports from other cloud providers.

This page shows you how to make a request, set query parameters, and interpret the JSON or CSV response.

The API returns the same billable usage you see in [Billing insights](/billing/billing-insights), at hourly grain, as JSON or CSV.

<Warning>
  The FOCUS Billing Export API is in public preview. Schema details and behavior may change before general availability. If you receive unexpected values, numbers that don't reconcile with [Billing insights](/billing/billing-insights), errors, or slow responses, [contact Support](/support).
</Warning>

## Scope

This public preview includes the following:

* Usage quantities at hourly grain (for example, GPU-hours, GiB-hours, and IP-hours)
* Filters for time range, product family, cluster, and zone
* JSON and CSV response formats
* Pagination for large results

This public preview doesn't include the following:

* Cost or dollar amounts. This release returns usage quantities only. Cost fields such as billed or effective cost are planned for a later release on the same schema.
* Project-level attribution or resource tags.
* Per-resource or per-node rows. Usage is aggregated. See [Data grain](#data-grain).

The following FOCUS fields are blank in this release: `BillingAccountName`, `ChargeClass`, `ChargeDescription`, `RegionName`, and `ResourceType`.

## Prerequisites

Before you call the API, make sure you have the following:

* A [CoreWeave API access token](/security/authn-authz/manage-api-access-tokens#create-a-new-api-access-token). Store the token securely.
* FOCUS export enabled for your organization. If you receive a `403 Forbidden` response, [contact Support](/support) to request access.

The token is scoped to your organization, so you don't pass an organization identifier in the request. The API returns results for the account associated with the token.

## Make your first request

The export endpoint is:

```text theme={"system"}
GET https://api.coreweave.com/v1/billing/focus
```

To confirm access and inspect the response shape, send a request to the export endpoint. This default example without any parameters returns the last seven days of usage grouped by location, as JSON.

In the `Authorization` header, pass your token. Replace `[API-ACCESS-TOKEN]` with your CoreWeave API access token:

```bash theme={"system"}
export CW_FOCUS_TOKEN="[API-ACCESS-TOKEN]"

curl -sS \
  -H "Authorization: Bearer $CW_FOCUS_TOKEN" \
  "https://api.coreweave.com/v1/billing/focus"
```

The following example requests a specific month, groups by capacity plan, and saves CSV output to a file:

```bash theme={"system"}
curl -sS -G "https://api.coreweave.com/v1/billing/focus" \
  -H "Authorization: Bearer $CW_FOCUS_TOKEN" \
  --data-urlencode "start_time=2026-07-01T00:00:00Z" \
  --data-urlencode "end_time=2026-08-01T00:00:00Z" \
  --data-urlencode "group_by=capacity_plan" \
  --data-urlencode "format=csv" \
  -o coreweave-focus-2026-07.csv
```

A successful request returns FOCUS usage rows for the window you requested.

## Query parameters

All parameters are optional. Times use ISO 8601 in UTC.

| Parameter        | Type                   | Default                           | Notes                                                                                 |
| ---------------- | ---------------------- | --------------------------------- | ------------------------------------------------------------------------------------- |
| `start_time`     | ISO 8601 (UTC)         | Now minus 7 days, top of the hour | Start of the window.                                                                  |
| `end_time`       | ISO 8601 (UTC)         | Now, top of the hour              | Must be after `start_time`.                                                           |
| `group_by`       | `enum`                 | `location`                        | `location` or `capacity_plan`. See [Data grain](#data-grain).                         |
| `product_family` | `enum`                 | all                               | One of `GPU Compute`, `CPU Compute`, `Storage`, or `Network`.                         |
| `cluster`        | `string`               | all                               | Matches `x_ClusterId`. Valid only with `group_by=location`.                           |
| `zone`           | `string`               | all                               | Matches `RegionId` (for example, `us-east-01a`). Valid only with `group_by=location`. |
| `format`         | `enum`                 | `json`                            | `json` or `csv`.                                                                      |
| `page_size`      | `integer` (1 to 1,000) | `100`                             | Rows per page. The API clamps values outside the range to `[1, 1000]`.                |
| `page_token`     | `string`               | (first page)                      | Cursor for the next page. See [Pagination](#pagination).                              |

The following constraints apply:

* The time range can't exceed 90 days per request.
* Historical data is available from January 1, 2026 onward. Requests for earlier periods return no data for that portion of the range.

## Response

A successful response includes metadata and usage rows as JSON. When you set `format=csv`, the response is a CSV file. The following sections describe the JSON envelope, the row schema, data grain, and pagination.

### JSON envelope

A successful JSON response has this shape:

```json theme={"system"}
{
  "spec_version": "1.2",
  "provider": "CoreWeave",
  "data_as_of": "2026-08-25T15:00:00Z",
  "query": {
    "start_time": "2026-07-01T00:00:00Z",
    "end_time": "2026-08-01T00:00:00Z",
    "group_by": "capacity_plan",
    "product_family": null,
    "cluster": null,
    "zone": null,
    "format": "json"
  },
  "next_page_token": "CgYIARACGAo=",
  "data": []
}
```

| Field             | Description                                                                                                                                                                                       |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `spec_version`    | The FOCUS specification version (`1.2`).                                                                                                                                                          |
| `data_as_of`      | The timestamp through which data is complete. Hourly aggregates lag the underlying data slightly. If you pull the same recent window twice, you may get small differences until the data settles. |
| `query`           | The effective parameters after defaults and validation. Unset filters echo as `null`. `group_by` always shows the active view.                                                                    |
| `next_page_token` | Present when more pages exist. See [Pagination](#pagination).                                                                                                                                     |
| `data`            | The usage rows.                                                                                                                                                                                   |

### Row schema (FOCUS 1.2)

Each row is one hourly usage bucket. Columns follow FOCUS 1.2 naming. CoreWeave-specific columns use the `x_` prefix per the FOCUS convention.

| Column                                                 | Meaning                                                                                                                                                            |
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `BillingAccountId` / `BillingAccountName`              | Your CoreWeave organization ID / name.                                                                                                                             |
| `BillingPeriodStart` / `BillingPeriodEnd`              | The monthly invoice period this usage falls in (UTC). CoreWeave's invoice boundary is 5:00 PM ET on the last day of the month.                                     |
| `ChargePeriodStart` / `ChargePeriodEnd`                | The hourly usage window, `[start, end)`, aligned to the top of the hour in UTC.                                                                                    |
| `ChargeCategory`                                       | `Usage` for all rows in this release.                                                                                                                              |
| `ChargeClass`                                          | `null` in this release.                                                                                                                                            |
| `ChargeFrequency`                                      | `Usage-Based` for all rows in this release.                                                                                                                        |
| `PricingQuantity`                                      | Total units consumed in this bucket for the hour, summed across all nodes and resources, after exclusions.                                                         |
| `PricingUnit`                                          | The unit for `PricingQuantity` (for example, `GPU-Hour`, `Instance-Hour`, `GiB-Hour`, or `IP-Hour`). Comes from SKU metadata.                                      |
| `PricingCategory`                                      | Rate class derived from capacity plan: `Standard` (`On-Demand`), `Committed` (`Reservation` and `Flex-Usage`), or `Dynamic` (`Spot`). `null` in the location view. |
| `ServiceCategory` / `ServiceName`                      | For example, `Compute` / `GPU Compute`, or `Storage` / `Object Storage`.                                                                                           |
| `SkuId`                                                | The CoreWeave SKU (for example, `gd-8xh100ib-i128`).                                                                                                               |
| `RegionId` / `RegionName`                              | Zone identifier / human-readable name. `null` in the `capacity_plan` view.                                                                                         |
| `ResourceType`                                         | Hardware descriptor for the SKU.                                                                                                                                   |
| `InvoiceIssuerName` / `ProviderName` / `PublisherName` | Constants: `CoreWeave, Inc.` / `CoreWeave` / `CoreWeave`.                                                                                                          |
| `x_CapacityPlan`                                       | CoreWeave extension: `On-Demand`, `Reservation`, `Spot`, or `Flex-Usage`. `null` in the location view.                                                             |
| `x_ClusterId` / `x_ClusterName`                        | CoreWeave extension: cluster identifier / name. `null` in the `capacity_plan` view.                                                                                |
| `x_ProductFamily`                                      | CoreWeave extension: `GPU Compute`, `CPU Compute`, `Storage`, or `Network`.                                                                                        |

If source metadata isn't available, some fields may be `null` during the public preview. If a field you need is empty, [contact Support](/support).

### Data grain

The API offers the following mutually exclusive views. Use `group_by` to select one:

* `group_by=location` (default): one row per `(hour, zone, cluster, SKU)`. Location is a physical property of the usage. `x_CapacityPlan` and `PricingCategory` are `null` in this view.
* `group_by=capacity_plan`: one row per `(hour, SKU, capacity plan)`. Capacity plan (`On-Demand`, `Reservation`, `Spot`, or `Flex`) is a rating-time property of your organization's usage. It can't be tied to a specific location, so `RegionId`, `RegionName`, `x_ClusterId`, and `x_ClusterName` are `null` in this view.

Every value is a sum across all nodes and resources in the bucket. The API never emits per-node rows.

The two views are pivots of the same underlying usage. For any given hour and SKU, the total `PricingQuantity` is identical across both views.

### Pagination

The API paginates results (default 100 rows per page, maximum 1,000). When more data exists, the JSON response includes `next_page_token`. Pass that value back as `page_token` until the token is absent.

To fetch the next page:

* Replace `[PAGE-TOKEN]` with the `next_page_token` value from the previous response.

```bash theme={"system"}
curl -sS -G "https://api.coreweave.com/v1/billing/focus" \
  -H "Authorization: Bearer $CW_FOCUS_TOKEN" \
  --data-urlencode "start_time=2026-07-01T00:00:00Z" \
  --data-urlencode "end_time=2026-08-01T00:00:00Z" \
  --data-urlencode "page_size=1000" \
  --data-urlencode "page_token=[PAGE-TOKEN]"
```

For CSV, the pagination metadata is in the response headers instead of the body: `X-Next-Page-Token`, `X-Page-Size`, `X-FOCUS-Version`, and `X-Data-As-Of`.

## CSV format

When you set `format=csv`, the API returns the following:

* The response `Content-Type` is `text/csv; charset=utf-8`, delivered as a file attachment.
* The first row is a header that uses exact FOCUS column names. All columns appear in both views. Columns that don't apply to the active view are left empty (not omitted), so the layout is stable.
* Fields that contain commas, quotes, or newlines are double-quoted per RFC 4180.
* Pagination works the same as JSON: one page per request. Use the `X-Next-Page-Token` header for the next page.

## Errors

All error responses use this shape:

```json theme={"system"}
{
  "error": "[ERROR-CODE]",
  "message": "[HUMAN-READABLE-EXPLANATION]"
}
```

| HTTP status              | `error`              | When                                                                                                                                                                                     |
| ------------------------ | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400 Bad Request`        | `invalid_parameter`  | Unparseable dates, `start_time` greater than or equal to `end_time`, range greater than 90 days, invalid `group_by`, or a `cluster` or `zone` filter used with `group_by=capacity_plan`. |
| `401 Unauthorized`       | `unauthorized`       | Missing or invalid API token.                                                                                                                                                            |
| `403 Forbidden`          | `forbidden`          | FOCUS isn't enabled for your organization. [Contact Support](/support) to request access.                                                                                                |
| `405 Method Not Allowed` | `method_not_allowed` | The API supports only `GET`.                                                                                                                                                             |
| `429 Too Many Requests`  | `rate_limited`       | Rate limit exceeded. If the `Retry-After` header is present, retry after that value. Per-org rate limiting is still being deployed during the public preview.                            |

## Related resources

For more information about billing usage and API access, see the following resources:

* [Billing insights](/billing/billing-insights): View the same billable usage in the Cloud Console.
* [Manage API access tokens](/security/authn-authz/manage-api-access-tokens): Create and manage tokens for API authentication.
* [Usage by Product and Zone](/observability/managed-grafana/cost-usage/usage-product-zone): Grafana dashboards for cost and usage monitoring.
* [FOCUS](https://focus.finops.org/): The FinOps Open Cost and Usage Specification.
