You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs!: single external timestamp (delivery, OpticOdds-parity) — reverse #256 (SHA-1048)
BREAKING (OpenAPI 3.0.0): the Odds response exposes a single `timestamp` field;
`odds_changed_at`, `last_seen_at`, and `wire_received_at` are removed. `timestamp`
is the delivery / last-refreshed stamp (advances every ingest cycle — feed
freshness, matching OpticOdds' `timestamp`), NOT a price-last-changed time;
SharpAPI no longer exposes a when-the-price-moved field. Mirrors sharp-api-go #751.
- openapi.json: Odds schema → single `timestamp` (delivery description); removed
the 3 fields; info.version 2.3.0 → 3.0.0 + CHANGELOG entry. FutureOdds/Splits
`timestamp`/`ts` untouched.
- mdx × 4 langs (en/es/pt-BR/de): field tables collapsed to one `timestamp` row;
examples updated; cross-links to the concept page kept (anchor text → `timestamp`);
concepts/pinnacle-odds-changed-at repurposed to explain `timestamp` (slug kept) +
_meta.js label; migration callout on odds.mdx. Removed the phantom
`all_books[].timestamp` (the API's per-book entries carry no timestamp).
- Residual `odds_changed_at`/`last_seen_at`/`wire_received_at` mentions are
intentional (migration callouts + concept-page explanation only).
Refs SHA-1048
Type: docs
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,6 +6,10 @@ to bump. Every change to API paths or response schemas gets a one-line entry her
6
6
the [OpenAPI Version Check](.github/workflows/openapi-version-check.yml) CI job
7
7
enforces that a bump has a matching entry.
8
8
9
+
## 3.0.0 — 2026-06-02
10
+
11
+
-**BREAKING:** the `Odds` response now exposes a single per-odd `timestamp` field and no longer emits `odds_changed_at`, `last_seen_at`, or `wire_received_at`. `timestamp` is the **delivery / last-refreshed** stamp (advances every ingest cycle — a feed-freshness/liveness signal, matching OpticOdds' `timestamp`), **not** a price-last-changed time. **Migration:** anyone reading `odds_changed_at` / `last_seen_at` / `wire_received_at` should read `timestamp`. Note there is no longer a field for *when the price last moved* (CLV / line-movement) — full OpticOdds-parity. Supersedes the 2.3.0 deprecations. SHA-1048.
12
+
9
13
## 2.3.0 — 2026-06-01
10
14
11
15
- Add `odds_changed_at` to the `Odds` schema — the canonical per-row freshness field (previously undocumented; also the only per-odd freshness timestamp OpticOdds exposes). Deprecate `last_seen_at`, `wire_received_at`, and the stale `timestamp` prop (`deprecated: true`) — being internalized; read `odds_changed_at` for freshness. Removal tracked in sharp-api-go #743.
Copy file name to clipboardExpand all lines: content/de/api-reference/events-odds.mdx
+6-7Lines changed: 6 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -61,8 +61,7 @@ Alle Antworten enthalten Standard-Header für Rate Limit und Metadaten:
61
61
|`odds.american`| number | American Odds (z. B. -110, +150) |
62
62
|`odds.decimal`| number | Dezimalquoten (z. B. 1.909) |
63
63
|`odds.probability`| number | Implizite Wahrscheinlichkeit (z. B. 0.5238) |
64
-
|`last_seen_at`| string | ISO-8601-Zeitstempel, wann unsere Pipeline diese Zeile zuletzt beobachtet hat. Verwenden Sie diesen als Aktualitätssignal der Pipeline. |
65
-
|`odds_changed_at`| string | ISO-8601-Zeitstempel, wann sich der Preis, die Linie oder das `is_live`-Flag zuletzt tatsächlich geändert hat. Vom Sportsbook bereitgestellt, sofern verfügbar; bei Pinnacle wird er über unveränderte Refreshes hinweg fortgeschrieben — siehe [Pinnacles `odds_changed_at` verstehen](/de/concepts/pinnacle-odds-changed-at/). |
64
+
|`timestamp`| string | ISO-8601-Zeitpunkt, zu dem SharpAPI diese Quote zuletzt durch seine Pipeline aktualisiert hat — wird in jedem Ingest-Zyklus weitergeschaltet. Ein Feed-Aktualitäts- / Liveness-Signal (entspricht OpticOdds' `timestamp`); es ist NICHT der Zeitpunkt, zu dem sich der Preis zuletzt geändert hat. Siehe [`timestamp` verstehen](/de/concepts/pinnacle-odds-changed-at/). |
66
65
67
66
## Beispielanfragen
68
67
@@ -221,7 +220,7 @@ print(f"Fetched all {len(all_odds)} odds")
221
220
"decimal": 1.556,
222
221
"odds_probability": 0.643
223
222
},
224
-
"last_seen_at": "2026-02-08T12:05:00Z"
223
+
"timestamp": "2026-02-08T12:05:00Z"
225
224
},
226
225
{
227
226
"id": "dk_evt_nba_bos_lal_20260208_ml_away",
@@ -236,7 +235,7 @@ print(f"Fetched all {len(all_odds)} odds")
236
235
"decimal": 2.55,
237
236
"odds_probability": 0.392
238
237
},
239
-
"last_seen_at": "2026-02-08T12:05:00Z"
238
+
"timestamp": "2026-02-08T12:05:00Z"
240
239
},
241
240
{
242
241
"id": "pin_evt_nba_bos_lal_20260208_ml_home",
@@ -251,7 +250,7 @@ print(f"Fetched all {len(all_odds)} odds")
251
250
"decimal": 1.571,
252
251
"odds_probability": 0.636
253
252
},
254
-
"last_seen_at": "2026-02-08T12:03:00Z"
253
+
"timestamp": "2026-02-08T12:03:00Z"
255
254
},
256
255
{
257
256
"id": "dk_evt_nba_bos_lal_20260208_spread_home",
@@ -266,7 +265,7 @@ print(f"Fetched all {len(all_odds)} odds")
266
265
"decimal": 1.909,
267
266
"odds_probability": 0.524
268
267
},
269
-
"last_seen_at": "2026-02-08T12:05:00Z"
268
+
"timestamp": "2026-02-08T12:05:00Z"
270
269
},
271
270
{
272
271
"id": "dk_evt_nba_bos_lal_20260208_total_over",
@@ -281,7 +280,7 @@ print(f"Fetched all {len(all_odds)} odds")
Copy file name to clipboardExpand all lines: content/de/api-reference/odds-batch.mdx
+4-5Lines changed: 4 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -140,7 +140,7 @@ if result['data']['missing_events']:
140
140
"odds_american": -210,
141
141
"odds_decimal": 1.476,
142
142
"line": null,
143
-
"last_seen_at": "2026-01-26T10:15:00.000Z"
143
+
"timestamp": "2026-01-26T10:15:00.000Z"
144
144
},
145
145
{
146
146
"sportsbook": "draftkings",
@@ -150,7 +150,7 @@ if result['data']['missing_events']:
150
150
"odds_american": 175,
151
151
"odds_decimal": 2.75,
152
152
"line": null,
153
-
"last_seen_at": "2026-01-26T10:15:00.000Z"
153
+
"timestamp": "2026-01-26T10:15:00.000Z"
154
154
}
155
155
]
156
156
},
@@ -170,7 +170,7 @@ if result['data']['missing_events']:
170
170
"odds_american": -130,
171
171
"odds_decimal": 1.769,
172
172
"line": null,
173
-
"last_seen_at": "2026-01-26T10:15:05.000Z"
173
+
"timestamp": "2026-01-26T10:15:05.000Z"
174
174
}
175
175
]
176
176
}
@@ -289,8 +289,7 @@ Jedes Element im `data.events`-Array ist ein Event-Objekt mit verschachtelten Qu
289
289
|`odds_american`| number | Amerikanische Quoten |
290
290
|`odds_decimal`| number | Dezimalquoten |
291
291
|`line`| number \| null | Linienwert |
292
-
|`last_seen_at`| string | ISO 8601 Zeitstempel, wann unsere Pipeline diese Zeile zuletzt beobachtet hat. Verwenden Sie dies als Frische-Signal für die Pipeline. |
293
-
|`odds_changed_at`| string | ISO 8601 Zeitstempel, wann sich der Preis, die Linie oder das `is_live`-Flag zuletzt tatsächlich geändert haben. Wird vom Sportsbook bereitgestellt, sofern verfügbar; bei Pinnacle wird er über unveränderte Aktualisierungen hinweg übertragen — siehe [Understanding Pinnacle's `odds_changed_at`](/de/concepts/pinnacle-odds-changed-at/). |
292
+
|`timestamp`| string | ISO-8601-Zeitpunkt, zu dem SharpAPI diese Quote zuletzt durch seine Pipeline aktualisiert hat — wird in jedem Ingest-Zyklus weitergeschaltet. Ein Feed-Aktualitäts- / Liveness-Signal (entspricht OpticOdds' `timestamp`); es ist NICHT der Zeitpunkt, zu dem sich der Preis zuletzt geändert hat. Siehe [`timestamp` verstehen](/de/concepts/pinnacle-odds-changed-at/). |
|`all_books[].edge`| number | Edge gegenüber den schlechtesten verfügbaren Quoten (Prozentpunkte) |
213
209
|`all_books[].line`| number \| null | Linie bei diesem Sportwettenanbieter |
214
-
|`all_books[].last_seen_at`| string | Wann unsere Pipeline die Zeile dieses Buches zuletzt beobachtet hat — Aktualitätssignal der Pipeline |
215
-
|`all_books[].odds_changed_at`| string | Wann sich der Preis, die Linie oder das `is_live`-Flag dieses Buches zuletzt tatsächlich geändert hat. Bei Pinnacle wird dies über unveränderte Aktualisierungen hinweg fortgeführt — siehe [Pinnacles `odds_changed_at` verstehen](/de/concepts/pinnacle-odds-changed-at/). |
216
-
|`last_seen_at`| string | ISO-8601-Zeitstempel der Best-Odds-Bestimmung |
210
+
|`timestamp`| string | ISO-8601-Zeitstempel der Best-Odds-Bestimmung |
217
211
|`player_name`| string\|undefined | Spielername (nur bei Player-Prop-Märkten) |
218
212
|`stat_category`| string\|undefined | Statistik-Kategorie, z. B. `points`, `rebounds` (nur bei Player-Prop-Märkten) |
Copy file name to clipboardExpand all lines: content/de/api-reference/odds-comparison.mdx
+10-11Lines changed: 10 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -127,22 +127,22 @@ for market in event['markets']:
127
127
"fanduel": {
128
128
"odds_american": -145,
129
129
"odds_decimal": 1.690,
130
-
"last_seen_at": "2026-01-26T02:10:20.000Z"
130
+
"timestamp": "2026-01-26T02:10:20.000Z"
131
131
},
132
132
"draftkings": {
133
133
"odds_american": -150,
134
134
"odds_decimal": 1.667,
135
-
"last_seen_at": "2026-01-26T02:10:24.000Z"
135
+
"timestamp": "2026-01-26T02:10:24.000Z"
136
136
},
137
137
"betmgm": {
138
138
"odds_american": -155,
139
139
"odds_decimal": 1.645,
140
-
"last_seen_at": "2026-01-26T02:10:18.000Z"
140
+
"timestamp": "2026-01-26T02:10:18.000Z"
141
141
},
142
142
"pinnacle": {
143
143
"odds_american": -148,
144
144
"odds_decimal": 1.676,
145
-
"last_seen_at": "2026-01-26T02:10:15.000Z"
145
+
"timestamp": "2026-01-26T02:10:15.000Z"
146
146
}
147
147
},
148
148
"best_book": "fanduel",
@@ -159,22 +159,22 @@ for market in event['markets']:
159
159
"draftkings": {
160
160
"odds_american": 130,
161
161
"odds_decimal": 2.300,
162
-
"last_seen_at": "2026-01-26T02:10:24.000Z"
162
+
"timestamp": "2026-01-26T02:10:24.000Z"
163
163
},
164
164
"fanduel": {
165
165
"odds_american": 125,
166
166
"odds_decimal": 2.250,
167
-
"last_seen_at": "2026-01-26T02:10:20.000Z"
167
+
"timestamp": "2026-01-26T02:10:20.000Z"
168
168
},
169
169
"betmgm": {
170
170
"odds_american": 128,
171
171
"odds_decimal": 2.280,
172
-
"last_seen_at": "2026-01-26T02:10:18.000Z"
172
+
"timestamp": "2026-01-26T02:10:18.000Z"
173
173
},
174
174
"pinnacle": {
175
175
"odds_american": 126,
176
176
"odds_decimal": 2.260,
177
-
"last_seen_at": "2026-01-26T02:10:15.000Z"
177
+
"timestamp": "2026-01-26T02:10:15.000Z"
178
178
}
179
179
},
180
180
"best_book": "draftkings",
@@ -253,8 +253,7 @@ Jeder Eintrag im `books`-Objekt:
253
253
|-------|------|-------------|
254
254
|`odds_american`| number | American Odds |
255
255
|`odds_decimal`| number | Dezimal-Quoten |
256
-
|`last_seen_at`| string | Wann unsere Pipeline die Zeile dieses Buchmachers zuletzt beobachtet hat — Pipeline-Aktualitätssignal |
257
-
|`odds_changed_at`| string | Wann sich der Preis, die Linie oder das `is_live`-Flag dieses Buchmachers zuletzt tatsächlich geändert hat. Bei Pinnacle wird dieser Wert über unveränderte Aktualisierungen hinweg fortgeführt — siehe [Pinnacles `odds_changed_at` verstehen](/de/concepts/pinnacle-odds-changed-at/). |
256
+
|`timestamp`| string | ISO-8601-Zeitpunkt, zu dem SharpAPI die Quote dieses Buchmachers zuletzt durch seine Pipeline aktualisiert hat — wird in jedem Ingest-Zyklus weitergeschaltet. Ein Feed-Aktualitäts- / Liveness-Signal (entspricht OpticOdds' `timestamp`); es ist NICHT der Zeitpunkt, zu dem sich der Preis zuletzt geändert hat. Siehe [`timestamp` verstehen](/de/concepts/pinnacle-odds-changed-at/). |
Suchen Sie nach Buchmachern, die ihre Quoten kürzlich nicht aktualisiert haben, indem Sie das `last_seen_at` jedes Buchmachers prüfen. Ein Buchmacher mit veralteten Quoten reagiert möglicherweise langsam auf Anpassungen und schafft so vorübergehenden Wert.
295
+
Suchen Sie nach Buchmachern, die ihre Quoten kürzlich nicht aktualisiert haben, indem Sie das `timestamp` jedes Buchmachers prüfen. Ein Buchmacher mit veralteten Quoten reagiert möglicherweise langsam auf Anpassungen und schafft so vorübergehenden Wert.
Copy file name to clipboardExpand all lines: content/de/api-reference/odds.mdx
+9-7Lines changed: 9 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,6 +20,10 @@ Erfordert einen API key. Verfügbar für **alle Tarife**.
20
20
Welche Sportwettenanbieter in Ihren Ergebnissen zurückgegeben werden, hängt von Ihrem Abonnement-Tarif ab. Nutzer des Free-Tarifs erhalten ausschließlich Quoten von DraftKings und FanDuel. Siehe [Anbieterzugang nach Tarif](#book-access-by-tier) weiter unten.
21
21
</Callout>
22
22
23
+
<Callouttype="warning">
24
+
Geändert in v3.0.0: Die Quotenantwort führt jetzt ein einziges `timestamp`-Feld (Auslieferung / Feed-Aktualität, passend zu OpticOdds). Die früheren Felder `odds_changed_at`, `last_seen_at` und `wire_received_at` wurden entfernt — lesen Sie stattdessen `timestamp`. Es gibt kein Feld mehr dafür, wann sich der Preis zuletzt bewegt hat.
25
+
</Callout>
26
+
23
27
## Query-Parameter
24
28
25
29
| Parameter | Typ | Standard | Beschreibung |
@@ -195,7 +199,7 @@ Cursor sind undurchsichtig — parsen oder konstruieren Sie sie nicht. Sie kodie
195
199
"odds_probability": 0.60,
196
200
"line": null,
197
201
"event_start_time": "2026-01-26T19:00:00Z",
198
-
"last_seen_at": "2026-01-26T02:10:24.125Z",
202
+
"timestamp": "2026-01-26T02:10:24.125Z",
199
203
"is_live": false
200
204
},
201
205
{
@@ -214,7 +218,7 @@ Cursor sind undurchsichtig — parsen oder konstruieren Sie sie nicht. Sie kodie
|`line`| number \| null | Spread- oder Total-Linienwert (`null` bei Moneyline) |
315
319
|`is_alternate_line`| boolean\|undefined |`true`, wenn das `line` dieser Zeile von der kanonischen Hauptlinie für ihre `(event, market_type, player)`-Gruppe abweicht. Immer `false` für Märkte ohne Linie (Moneyline, Outright). Stabil auf [`/opportunities/ev`](/de/api-reference/opportunities-ev/) heute; Rollout auf `/odds`-Zeilen läuft. Verwenden Sie es, um Haupt- und Alternativlinien-Snapshots zu trennen. |
316
320
|`event_start_time`| string | ISO 8601 Event-Startzeit |
317
-
|`last_seen_at`| string | ISO 8601 Zeitstempel der letzten Beobachtung dieser Zeile durch unseren Adapter. Wird in jedem Ingest-Zyklus aktualisiert — dies ist das Pipeline-Frische-Signal. |
318
-
|`odds_changed_at`| string | ISO 8601 Zeitstempel der quelleneigenen Aktualisierung des Sportwettenanbieters für diese Linie, sofern verfügbar. Bei Pinnacle wird er fortgeführt, solange Preis/Linie/`is_live`-Flag unverändert bleiben (siehe [Pinnacles `odds_changed_at` verstehen](/de/concepts/pinnacle-odds-changed-at/)). Verwenden Sie `last_seen_at` für die Pipeline-Frische. |
319
-
|`wire_received_at`| string\|undefined | ISO 8601 Zeitstempel des Zeitpunkts, an dem sharp-api-go zuletzt eine Inhaltshash-Änderung für diese Zeile beobachtet hat — der Pipeline-Eingangsstempel. Unterschiedlich von `last_seen_at` (Adapter-Beobachtung) und `odds_changed_at` (quelleneigene Aktualisierung des Sportwettenanbieters). |
321
+
|`timestamp`| string | ISO-8601-Zeitpunkt, zu dem SharpAPI diese Quote zuletzt durch seine Pipeline aktualisiert hat — wird in jedem Ingest-Zyklus weitergeschaltet. Ein Feed-Aktualitäts- / Liveness-Signal (entspricht OpticOdds' `timestamp`); es ist NICHT der Zeitpunkt, zu dem sich der Preis zuletzt geändert hat. |
320
322
|`is_live`| boolean | Ob das Event derzeit live läuft |
321
323
|`event_uuid`| string\|undefined | Stabile kanonische Event-UUID aus dem SharpAPI-Atlas, sofern das Event gemappt ist. Während `event_id` die primäre Event-Kennung des Adapters trägt (oft die des ursprünglichen Sportwettenanbieters), ist `event_uuid` ein feed-stabiler Hash für Cross-Feed-Joins. Fehlt bei nicht gemappten Events. |
322
324
|`external_event_id`| string\|undefined | Die native Event-ID des Sportwettenanbieters, sofern sie sich von `event_id` unterscheidet. Nützlich, um Zeilen in die UI oder API des Sportwettenanbieters zurückzuverknüpfen. |
Copy file name to clipboardExpand all lines: content/de/api-reference/sportsbooks.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -400,7 +400,7 @@ Das Feld `requires_tier` gibt die Mindest-Abonnementstufe an, die benötigt wird
400
400
{/* AUTO:END:sharp-books */}
401
401
402
402
<Callouttype="info">
403
-
**Pinnacle-Zeitstempel lesen.**`odds_changed_at` in einer Pinnacle-Zeile ist der Zeitstempel ihres Trading-Desks, nicht der unserer Pipeline. Pinnacle hält die Linien stabil, wenn sich der Markt nicht bewegt hat — ein Leerlaufwert von 30+ Minuten ist bei MLB-Spieler-Props und NBA-Märkten üblich. Verwenden Sie `last_seen_at` für die Pipeline-Aktualität. Siehe [Pinnacles `odds_changed_at` verstehen](/de/concepts/pinnacle-odds-changed-at/) dafür, was "veraltet" in ihrem Feed tatsächlich bedeutet.
403
+
**Pinnacle-Zeitstempel lesen.**`timestamp` in einer Pinnacle-Zeile ist der Auslieferungs- / Feed-Aktualitätsstempel — wann SharpAPI diese Quote zuletzt durch seine Pipeline aktualisiert hat —, nicht der Zeitpunkt, zu dem sich der Preis zuletzt bewegt hat. Pinnacle hält die Linien stabil, wenn sich der Markt nicht bewegt hat, aber `timestamp` wird trotzdem in jedem Ingest-Zyklus weitergeschaltet. Siehe [`timestamp` verstehen](/de/concepts/pinnacle-odds-changed-at/) dafür, wie SharpAPI Feed-Aktualität bereitstellt.
0 commit comments