> ## 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.

# Open DSS (YWC SSO)

> POST /v1/partners/sso/tickets — mint a one-time login URL so an already-Connected member opens the DSS app signed in.

<Note>
  **Yacht Workers Council only.** Other partners receive
  [`insufficient_scope` (403)](/errors/insufficient_scope). Auth is HTTP Basic,
  same as the rest of `/v1/partners/*`.
</Note>

```http theme={null}
POST /v1/partners/sso/tickets
Authorization: Basic <base64(client_id:client_secret)>
Content-Type: application/json
```

Use this when a member is **already Connected** and taps DSS in your app —
including the **DSS Homepage** button. Do **not** link that button to
`https://digitalseaservice.com` (marketing site, no session). Do **not** put
`user_id` on a public URL. Your **server** mints a ticket, then you 302 the
browser to `login_url`.

No vessel or crew list is required. The member opens the DSS app signed in
and adds their vessel there. Empty sea-time on Refresh is a valid 200, not
a reason to block Homepage.

## Set up a DSS account

**Set up my DSS account** is normal DSS signup. Do **not** call
`POST /v1/partners/sponsorships` on that click (that used to create a
passwordless account and send “account is ready”).

Send the browser to:

```
https://app.digitalseaservice.com/signin?intent=signup&partner=ywc&email={email}&first_name={first}&last_name={last}
```

They set a password, accept terms, and receive **Verify your email**. After
they verify, run **Connect**. Premium is granted on Connect. They add a
vessel inside the DSS app if they do not have one yet.

Members who already have a DSS account should **Connect** or use Homepage
SSO above — not signup.

The ticket is opaque, hashed at rest, **single use**, and valid for **60
seconds**. A new mint for the same member invalidates any unused previous
ticket. We only issue a ticket when that member has a **live YWC Connect
consent**.

## Request

| Field | Type | Required | Notes |
| - | - | - | - |
| `user_id` | string | Yes | DSS user id from Connect (Firebase uid). |

```json theme={null}
{ "user_id": "aQ0mtT8kRgVv7C3o1p2q3r4s5t6u" }
```

```bash theme={null}
curl -u "$DSS_CLIENT_ID:$DSS_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"user_id":"<dss-uid>"}' \
  https://api.digitalseaservice.com/v1/partners/sso/tickets
```

## Response

`200 OK`

| Field | Type | Notes |
| - | - | - |
| `login_url` | string | Send the member's browser here immediately. Host is `app.digitalseaservice.com`. |
| `expires_in` | integer | Always `60`. |

```json theme={null}
{
  "login_url": "https://app.digitalseaservice.com/auth/partner?ticket=…",
  "expires_in": 60
}
```

Sandbox login URLs use the sandbox app host from that environment's sign-in URL.

## Errors

| Status | `type` | When |
| - | - | - |
| 400 | [`invalid_request`](/errors/invalid_request) | Missing `user_id`. |
| 401 | [`invalid_token`](/errors/invalid_token) | Missing or bad Basic credentials. |
| 403 | [`insufficient_scope`](/errors/insufficient_scope) | Not YWC, partner suspended, or the member has no live Connect consent. |
| 429 | [`rate_limit_exceeded`](/errors/rate_limit_exceeded) | Per-client budget exhausted. |

## Related

* [Member left (YWC)](/sponsorships/member-left)
* [Authentication](/authentication)


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