# Exchange Pod Svid

> Exchange a scheduled pod's JWT-SVID for a short-lived runtime session.

Canonical URL: https://docs.botyard.io/docs/api/device-enrollment/exchange_pod_svid_v1_public_device_assertion_svid_exchange_post

`POST /v1/public/device-assertion/svid-exchange`

Exchange a scheduled pod's JWT-SVID for a short-lived runtime session.

The pod twin of :func:`exchange_device_assertion`: no enrollment token,
no device key, no custody row. Attestation is the SVID itself, verified
against the SPIRE OIDC discovery JWKS; the entry that lets SPIRE mint it
is the scope control. Each SVID buys exactly one session (replay loses on
the session row's unique index), so a pod fetches fresh per exchange and
entry deletion stops new sessions within one SVID lifetime.

## Request body

`application/json`: SvidExchangeRequest (required)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `svid` | string | yes | A compact JWT-SVID minted by the pod's in-guest SPIRE agent, 'sub' is 'spiffe://<trust-domain>/ns/<namespace>/sa/bot-<bot-id>', 'aud' is 'botyard:pod-session'. Each SVID buys exactly one session: presenting one twice loses as a replay |

## Responses

| Status | Description | Body |
| --- | --- | --- |
| `201` | Successful Response | DeviceAssertionExchangeResponse |
| `default` | RFC 9457 Problem Details error response | ProblemDetails |

Full schemas: operation `exchange_pod_svid_v1_public_device_assertion_svid_exchange_post` in the OpenAPI spec at https://api.botyard.io/openapi.json.
