Skip to content

Changelog

Every integrator-visible change to the Partner API, newest first.

Versioning policy. The v1 API only changes additively: new endpoints, new optional parameters, new response fields, new event types, new error codes. Nothing documented is removed or repurposed within v1. A breaking change means a new versioned base path, announced here with a migration window first.

2026-07-17: Fresh items list immediately, hard caps stop overshooting

Fixed

  • Full item listings (no updatedAfter) no longer trail a write-safety lag: an item created moments ago now appears in its own listing immediately. Incremental polls keep the lagged, convergent window.
  • meta.syncWindowEnd on a FULL listing is now conservatively lagged so the switch to incremental polling stays gapless: rows updated in the final seconds of the sweep can appear again on your first incremental poll, so upsert by id. Incremental sweeps themselves remain gapless and overlap-free.
  • Monthly hard caps are enforced atomically: concurrent requests can no longer jointly overshoot the configured allowance before the cap engages. At the boundary you may see 429 quota_exceeded one request sooner than before.

2026-07-16: Convergent incremental sync, durable idempotency, delivery-log pagination

Changed

  • Item listings now sweep a FIXED window: meta.syncWindowStart / meta.syncWindowEnd report the range each poll covered, and feeding syncWindowEnd back as the next updatedAfter is gapless and overlap-free. meta.fullResyncRequired tells you explicitly when incremental sync can no longer converge (your updatedAfter predates deletion-tombstone retention, or the deletion list overflowed), replacing guesswork against a documented retention number.
  • Pagination cursors are now signed and bound to the filters that issued them. Reusing a cursor with different filters returns 400 cursor_filter_mismatch instead of a silently different page. Cursors issued before this change are invalid: restart pagination once.
  • status can no longer be combined with updatedAfter on item listings: a status-filtered incremental feed would silently miss items that leave the filtered status. Sync unfiltered and filter client-side.
  • Idempotency-Key records are now durable (they survive infrastructure restarts) and bound to the operation and request body: reusing a key for a different request returns 409 idempotency_key_conflict instead of ever replaying the wrong response.
  • GET /partner/webhook-deliveries is now cursor-paginated with the same {data, meta.nextCursor} envelope as every other list endpoint, so the full retention window is walkable instead of only the newest 100 rows.
  • Webhook events that fire while a restaurant's subscription is lapsed are now retained for 72 hours and delivered on renewal, instead of being dropped.

2026-07-16: Test mode, cost ceilings, and hardening

Added

  • Test keys: create a key in the Test environment to get a tp_sk_test_ / tp_pk_test_ token that hits the same data with the same permissions but is never billed and runs under fixed caps (60 requests/minute, 5,000/day). Every response now carries X-TruePlate-Environment: live|test.
  • New 429 error code quota_exceeded: returned once a restaurant's monthly request allowance plus its overage budget is exhausted (and, separately, when embed views pass their serving ceiling). Previously over-quota traffic was served and billed without bound.
  • The embed viewer script now authenticates with the Authorization header instead of a ?key= query parameter (the query form still works). It also renders a visible Test mode badge for tp_pk_test_ keys.
  • Item lookups by id now return 404 for items your key cannot access, indistinguishable from a missing id. Previously an unauthorized id returned 403, confirming the item existed.

2026-07-15: Partner API v1

Added

  • REST API: /partner/me, restaurants, menus, item listings with cursor pagination + updatedAfter incremental sync (deletion tombstones included), item detail with short-TTL signed USDZ/GLB URLs, and asset URL refresh.
  • Webhooks: signed deliveries (X-TruePlate-Signature, Stripe-style t/v1 scheme), 8 retries with exponential backoff, delivery log + redelivery, endpoint auto-disable on sustained failure.
  • Embeddable viewer: <trueplate-viewer> web component with publishable keys and per-key Origin allowlists; AR on phones (Quick Look / Scene Viewer), inline 3D on the web.
  • Idempotency-Key support on mutating endpoints (24h replay window, Stripe semantics).
  • Rate-limit headers (X-RateLimit-Limit/Remaining/Reset, Retry-After) on every response.