# Records

> Records, newest first, a year back.

Source: https://firmtape.com/docs/developers/geo/items

Records, newest first, a year back.

`GET https://geo.firmtape.com/v1/items`

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; default 7 days ago |  |  |
| `until` query, string | ISO 8601 UTC end; default now |  |  |
| `sector` query, gov \| air \| gps \| sea \| internet \| ground \| space \| attention | Sector |  |  |
| `country` query, string | ISO 3166-1 alpha-2 |  |  |
| `feed` query, string | One feed id or several, comma separated |  |  |
| `min_severity` query, integer | 2 notable and above, 3 critical only |  |  |
| `q` query, string | Words in the title |  |  |
| `uid` query, string | One record id, or several comma separated; ignores the time window |  |  |
| `limit` query, integer | 1 to 1000 | 200 |  |
| `cursor` query, integer | From next in the previous answer |  |  |

## Response

Records; next holds the URL of the next page when more match

| Field | Meaning | Unit |
| --- | --- | --- |
| `count` (integer) |  |  |
| `next` (string \| null) |  |  |
| `history_days` (integer) |  |  |
| `items` (array) |  |  |
| `items[].uid` (string) | Stable id of the record |  |
| `items[].feed` (string) | Feed id, see /v1/sources or https://firmtape.com/geo/sources |  |
| `items[].sector` (gov \| air \| gps \| sea \| internet \| ground \| space \| attention) |  |  |
| `items[].type` (string) | new, update, level_raise, level_lower, cancel, spike, keyword or no_data |  |
| `items[].category` (string) |  |  |
| `items[].severity` (integer) | 0 info, 1 routine, 2 notable, 3 critical |  |
| `items[].routine` (boolean) | True for the records the pages hide by default |  |
| `items[].countries` (array) | ISO 3166-1 alpha-2 |  |
| `items[].region` (string \| null) |  |  |
| `items[].title` (string) |  |  |
| `items[].summary` (string) |  |  |
| `items[].published_utc` (string) | When the source published it |  |
| `items[].event_utc` (string \| null) | When the activity happens or starts, when the record says |  |
| `items[].first_seen_utc` (string) | When FirmTape first read it |  |
| `items[].backfill` (boolean) | Found in the source's own history rather than caught live |  |
| `items[].source` (string) | The publisher to credit |  |
| `items[].url` (string) | The record at its source |  |
| `items[].attribution` (string \| null) | Paid API only: the citation the source asks for |  |
| `items[].value` (number \| null) | Spikes: what was measured |  |
| `items[].baseline` (number \| null) | Spikes: its own normal |  |
| `items[].score` (number \| null) | Spikes: value against the normal |  |
| `items[].lat` (number \| null) | Paid API only |  |
| `items[].lon` (number \| null) | Paid API only |  |
| `items[].facts` (object) | Paid API only: source-specific details |  |

## Errors

| Status | Code | What to do |
| --- | --- | --- |
| 400 |  | A parameter is wrong; no call is counted Fix the parameter `error` names. |
| 401 |  | No key, unknown key or revoked key Send a `geo` key. |
| 403 |  | No active API or Team plan, or a key beyond the plan's count Check the plan on the account page. |
| 429 |  | This month's calls are used; Retry-After says when the count resets Wait for `Retry-After`, the start of the next UTC month. |

## Request

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

```python
import os, requests

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

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

## Example response

```json
{
  "count": 1,
  "next": null,
  "history_days": 365,
  "items": [
    {
      "uid": "8f1c2a90d4b7e613",
      "feed": "faa_tfr",
      "sector": "air",
      "type": "new",
      "category": "TFR",
      "severity": 2,
      "routine": false,
      "countries": [
        "US"
      ],
      "region": null,
      "title": "Temporary flight restriction",
      "summary": "...",
      "published_utc": "2026-09-17T12:58:00Z",
      "event_utc": null,
      "first_seen_utc": "2026-09-17T13:02:00Z",
      "backfill": false,
      "source": "FAA",
      "url": "https://example.org/notice"
    }
  ]
}
```

## Changes

- 2026-09-17: Added.
