# Versioning and changelog

> A path carries its major version where it has one (/api/v1, geo.firmtape.com/v1); a webhook body carries version. Within a version a change only adds: a new field, a new endpoint, a new event type. Ignore fields you do not know.

Source: https://firmtape.com/docs/developers/versioning

A path carries its major version where it has one (`/api/v1`, `geo.firmtape.com/v1`); a webhook body carries `version`. Within a version a change only adds: a new field, a new endpoint, a new event type. Ignore fields you do not know.

- A field that is removed or renamed is first marked deprecated here with a removal date at least 30 days out, and keeps its value until that date.
- A breaking change gets a new version and the old one keeps answering for at least 90 days.
- Every change is a dated line on its endpoint's page (Changes) and in the list below.

## Deprecated

| What | Use | Since | Removed after |
| --- | --- | --- | --- |
| `levels.put_support` in the level alerts webhook body | `levels.put_wall` | 2026-10-11 | 2026-11-30 |
| `X-FirmTape-Signature-V0` on the POSITIONS webhook | `X-FirmTape-Signature` with `X-FirmTape-Timestamp` | 2026-10-11 | 2026-11-30 |

## Changes

| Date | Product | Change |
| --- | --- | --- |
| 2026-10-12 | LIVE | The developer hub: every API, webhook and MCP tool documented from one source at /docs/developers. |
| 2026-10-11 | LIVE | Levels API: a finished day answers with its closing levels, read at 15:45 ET (12:45 on a 13:00 close), and adds `levels_at` and `last_second`. |
| 2026-10-11 | LIVE | Level alerts webhook: version 1; `levels.put_wall` added beside `levels.put_support` (the same number, deprecated). |
| 2026-10-11 | ORDERS | POSITIONS webhook: signed as the alerts are (`X-FirmTape-Timestamp`, signature over `<timestamp>.<raw body>`); the old body-only signature moved to `X-FirmTape-Signature-V0` (deprecated). |
| 2026-10-11 | LIVE | Levels API: RTY and M2K. |
| 2026-10-05 | LIVE | Levels API: history answers the last 90 days for an account key; older days with DATASET. |
| 2026-09-30 | LIVE | Levels API v1: symbols, levels, gamma, history, levels.txt, bookmap.csv, key. |

## Planned

### One webhook format

POSITIONS and Geo move to the alerts' envelope (`type`, `id`, `version`, `ts`), header set (`X-FirmTape-Event`, `X-FirmTape-Event-Id`, `X-FirmTape-Timestamp`, `X-FirmTape-Signature: sha256=`) and delivery policy (3 seconds, retries after 1 s and 4 s, switch-off after 10 failures). Plan: (1) send the new format beside the old one, each request carrying both header sets, for 30 days from the day it starts, announced on this page and by mail to every account with a webhook; (2) `event` stays in the body beside `type` for the same 30 days; (3) Geo's `t=,v1=` signature stays in its own header, `X-FirmTape-Signature-Geo`, for those 30 days; (4) then the old format stops. Not started; no live sender changes before the start is announced here.

### A key of its own for the dataset

The DATASET files open with a `dataset` scope key made on the account page, rather than the `lab` key. The `lab` key keeps working for the files for 30 days after the new key ships.

### A delivery log for the alerts webhook

Every delivery of the level alerts webhook in the account, with status, tries and a resend button, as Geo has.

### One error envelope

`{"error": {"code", "message", "docs"}}` on every API, LAB and Geo included, `docs` linking the code's row on the errors page.

### Alert lines from a key

`/api/alerts` stays session-only until a customer asks for it from code.
