# Submit ETF Data Export

> Submit an asynchronous export job for this account's ETF data.

`POST https://api.bavest.co/v2/etfs/exports`

Group: ETFs. Route id: `v2_etfs_export_submit`. Included in: Pro, Growth.

## Description

Submit an asynchronous export job for this account's ETF data. `dataset` selects the source: `metrics` (default), `countries`, `sectors`, or `holdings`. Choose symbols and/or isins (at least one, at most 100 together) and a from/to window (`metrics` also accepts a metric-name list); a batch worker materialises the Parquet export, then poll GET /etfs/exports/{exportId} for signed download links. symbols and isins union. A request with neither is a 400. Scoped to the caller's API key.

## Authentication

Send your API key in the `x-api-key` header on every request. No key yet? Sign up at https://dashboard.bavest.co/sign-up (free trial). The examples read the key from the `BAVEST_API_KEY` environment variable.

## Parameters

None.

## Request body

JSON, optional.

| Field | Type | Always present | Description |
|---|---|---|---|
| `dataset` | string | no | Which ETF dataset to export. One of `metrics`, `countries`, `sectors`, `holdings`. |
| `metrics` | array of string | no | Metric-name filter (dataset=metrics only). |
| `symbols` | array of string | no |  |
| `isins` | array of string | no |  |
| `from` | string (date) | no |  |
| `to` | string (date) | no |  |

## Response

200 Job accepted (`application/json`).

| Field | Type | Always present | Description |
|---|---|---|---|
| `data` | object | no |  |
| `data.exportId` | string | no |  |
| `data.assetClass` | string | no | Example: `etf`. |
| `data.status` | string | no | Example: `pending`. |
| `data.poll` | string | no | Poll this path for status and links. |
| `meta` | ResponseMeta | no | Response envelope metadata. Always present on a 200: `time` is set by `core/response.py` on every successful response. Errors carry the same block, built by the same code, so a client parses one meta shape whether the call succeeded or failed. |
| `meta.time` | integer | no | Server-side processing time in milliseconds. Example: `17`. |
| `meta.parameters` | object | no | Echo of the request parameters the endpoint resolved. |

## Example request

```bash
curl -X POST 'https://api.bavest.co/v2/etfs/exports' \
  -H "x-api-key: $BAVEST_API_KEY" \
  -H 'content-type: application/json' \
  --data '{"dataset":"metrics","metrics":["string"],"symbols":["string"],"isins":["string"],"from":"2026-01-02","to":"2026-01-02"}'
```

## Errors

| Status | Meaning |
|---|---|
| 400 | Invalid request parameters. Returned when required query parameters are missing, have invalid types, or violate constraints (e.g., providing both symbol and isin when they are mutually exclusive). |
| 401 | Missing or invalid API key. |
| 429 | Rate limit exceeded. Retry after the `Retry-After` header interval. |

- `403` from the gateway: the API key is invalid or switched off.
- `429` with message `Limit Exceeded`: the monthly quota of the key is used up. With `Too Many Requests`: the key is throttled, or this route is not in the key's plan. Wait for `Retry-After` when it is sent.

## Links

- HTML page: https://dashboard.bavest.co/docs/v2_etfs_export_submit
- OpenAPI: https://dashboard.bavest.co/openapi.json (YAML: https://dashboard.bavest.co/openapi.yaml)
- Authentication: https://dashboard.bavest.co/docs/authentication.md
- MCP server for AI agents: https://dashboard.bavest.co/docs/mcp.md
- All routes: https://dashboard.bavest.co/llms.txt
