# CSV export

> Every matching record in one CSV: up to 7 days a call on API, 31 on Team.

Source: https://firmtape.com/docs/developers/geo/export-csv

Every matching record in one CSV: up to 7 days a call on API, 31 on Team.

`GET https://geo.firmtape.com/v1/export.csv`

Plan GEO · Key scope geo · Limit 20,000 calls a month on Geo API, 100,000 on Geo Team · Version 1.0.0 · Since 2026-09-17

**This endpoint serves:** [GEO: The API, webhooks and MCP](https://firmtape.com/docs/geo#geo-api). **Plan:** [GEO](https://firmtape.com/features/geo). Free to read, no account. Geo alerts, the API and Team are Geo's own plans: Geo plans.

## Parameters

| Name | What it does | Default | Error |
| --- | --- | --- | --- |
| `since` query, string | ISO 8601 UTC start |  |  |
| `until` query, string | ISO 8601 UTC end |  |  |
| `sector` query, gov \| air \| gps \| sea \| internet \| ground \| space \| attention | Sector |  |  |
| `country` query, string | ISO 3166-1 alpha-2 |  |  |
| `feed` query, string | Feed ids |  |  |
| `min_severity` query, integer | Severity floor |  |  |

## Response

CSV

## Errors

| Status | Code | What to do |
| --- | --- | --- |
| 400 |  | Window longer than the plan allows Fix the parameter `error` names. |

## Request

```sh
curl \
  -H "Authorization: Bearer $FIRMTAPE_GEO_KEY" \
  "https://geo.firmtape.com/v1/export.csv"
```

```python
import os, requests

H = {"Authorization": f"Bearer {os.environ['FIRMTAPE_GEO_KEY']}"}
r = requests.get("https://geo.firmtape.com/v1/export.csv", headers=H)
print(r.status_code, r.text[:500])
```

```js
const r = await fetch("https://geo.firmtape.com/v1/export.csv", {
  method: "GET",
  headers: { Authorization: `Bearer ${process.env.FIRMTAPE_GEO_KEY}` },
});
console.log(r.status, await r.text());
```

## Changes

- 2026-09-17: Added.
