> ## Documentation Index
> Fetch the complete documentation index at: https://docs.digitalseaservice.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Every change to the DSS Public API. Breaking changes ship under /v2 with at least 12 months of /v1 overlap.

We version this API at the URL path. `/v1/*` runs **at least 12 months past
/v2 launch**, with the deprecation schedule announced on this page and via
email to every active partner contact.

What counts as a breaking change:

* Removing or renaming any field, endpoint, header, error code, or scope.
* Tightening a validation rule on an existing field.
* Changing the shape of a webhook payload.
* Removing or changing the meaning of an event type.

What does **not** count as a breaking change:

* Adding a new endpoint, field, header, error code, or scope.
* Adding a new event type.
* Loosening a validation rule.
* Adding a new optional query parameter.

We try to be conservative about additive changes too — every new field is
something partners may end up depending on by accident. We announce them
here first.

***

## 2026-09-12 — New members use normal DSS signup

`POST /v1/partners/sponsorships` no longer creates a Digital Sea Service
account. An unknown email returns
[`account_requires_signup`](/errors/account_requires_signup) (409) with
`signup_url`. Send **Set up my DSS account** to
`/signin?intent=signup&partner=ywc&…`. Premium is granted on Connect.

## 2026-09-12 — Account exists is enough

Additive / loosening. Partners that already handled `404` still work.

A Connected member with a DSS account is a valid member even with **no
vessel and no crew list**. They add vessels and discharge dates inside the
DSS app. Do not treat an empty record as unreachable or incomplete.

`GET /v1/me/sea-time` and `/recent` therefore return **200** with zero
totals (and an empty `months` array) when the member exists but has no
qualifying sea days yet. `GET /v1/me/vessels` returns **200** with an empty
list. A true `404` means the token's user is unknown to DSS.

The **DSS Homepage** button for an already-Connected YWC member must mint
`POST /v1/partners/sso/tickets` and redirect to `login_url`. That opens the
app signed in; with no fleet they land on add-vessel. Do not link
`https://digitalseaservice.com`.

## 2026-09-09 — YWC partner SSO

Additive. Nothing existing changed shape.

### Endpoints

* `POST /v1/partners/sso/tickets` — Yacht Workers Council only. Mint a 60-second,
  single-use login URL so an already-Connected member opens the DSS app signed
  in. HTTP Basic. Body: `{ "user_id": "<dss uid>" }`. Requires live Connect
  consent. See [Open DSS (YWC SSO)](/sponsorships/sso).

***

## 2026-09-09 — YWC member-left

Additive. Nothing existing changed shape.

### Endpoints

* `POST /v1/partners/members/left` — Yacht Workers Council only. Close the
  Connect-billed Crew Premium seat when a member leaves, lapses, or deletes
  their YWC account. HTTP Basic (`client_id:client_secret`). Body: `user_id`
  (DSS Firebase uid from Connect), optional `external_ref` (`ywc-user-{id}`),
  optional `reason` (`account_deleted` | `membership_lapsed`). Idempotent.
  See [Member left (YWC)](/sponsorships/member-left).

***

## 2026-08-29 — Membership status on `/v1/me`

Additive. Nothing existing changed shape.

### Endpoints

* `GET /v1/me` now returns a **`membership`** block — `tier`, `source`
  (`self` / `sponsored` / `vessel`), `since`, plus `expires_at` and
  `sponsored_by_you` when you are the member's sponsor. See
  [Membership status](/membership).
* It rides on the existing `profile:read` scope. **No reconsent needed** —
  tokens you already hold can read it.

Until now there was no way to tell whether a crew member already held DSS
Premium, so partners mirroring DSS content had no signal to gate an upgrade
prompt on and showed it to everyone, including members they were sponsoring
themselves.

<Warning>
  `/v1/me` now depends on a downstream membership lookup, so it can return
  [`service_unavailable` (503)](/errors/service_unavailable) where it previously
  could not. Treat that as *unknown*, not as `"free"` — retry with backoff and
  leave any upgrade prompt hidden.
</Warning>

### Errors

* Documented [`service_unavailable` (503)](/errors/service_unavailable). The
  type is not new — `/v1/me/sea-time`, `/v1/me/sea-time/recent` and
  `/v1/me/vessels` have always been able to return it — but it was missing from
  this catalog.
* Added [`entitlement_write_failed` (502)](/errors/entitlement_write_failed) to
  the partner Sponsorship API. Returned when we cannot grant Premium to a crew
  member; the reserved seat is credited back before we respond, so nothing is
  billed and the request is safe to retry.

***

## 2026-05-28 — V1 launch

First public release of the DSS Public API.

### Authentication

* OAuth 2.0 Authorization Code flow with PKCE (`S256` required).
* Opaque access tokens (1-hour TTL) and rotating refresh tokens (90-day TTL).
* RFC 7009 token revocation.

### Endpoints

* `GET /v1/me` — basic profile (`profile:read`).
* `GET /v1/me/sea-time` — totals, by-role breakdown, verified split (`seatime:read`).
* `GET /v1/me/sea-time/recent` — rolling 12-month trend (`seatime:read`).
* `GET /v1/me/vessels` — paginated vessel history (`vessels:read`).
* `GET /v1/webhooks/test` — fires a `webhook.test` event to your registered URL.

### Caching

* ETag + `If-None-Match` on every resource.
* `Last-Modified` + `If-Modified-Since` on every resource.

### Rate limits

* 600 / minute, 10,000 / day, per `client_id`.
* `X-RateLimit-*` headers on every authenticated response.

### Webhooks

* Event types: `user.profile.updated`, `user.sea_time.updated`,
  `user.vessels.updated`, `user.consent.revoked`, `webhook.test`.
* HMAC-SHA256 signing with a 5-minute replay window.
* Retry schedule: `+1m, +5m, +30m, +2h, +6h`. Give up after 24h.

### Errors

* Resource endpoints: RFC 7807 Problem Details with stable `type` URLs.
* OAuth endpoints: RFC 6749 §5.2 shape.

### Docs

* Mintlify docs site live at [docs.digitalseaservice.com](https://docs.digitalseaservice.com).
* `llms.txt`, `llms-full.txt`, and every page as `.md` for AI agents.
* OpenAPI 3.1 spec at `/openapi.json` and `/openapi.yaml`.

***

## Subscribing to changes

We email every partner contact at the address you gave us during onboarding
when anything ships here. We will not surprise you with a breaking change —
the V1 → V2 transition will have its own announcement, its own dedicated
docs section, and at least 12 months of overlap.

For the truly paranoid:
[`https://docs.digitalseaservice.com/llms-full.txt`](https://docs.digitalseaservice.com/llms-full.txt)
is the entire docs tree as a single file. Diff it.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.