GET .../signer/routing— fetch the DMZ URL and webhook URL for your app.@pymthouse/builder-sdk/signer/server— proxy signing requests directly to the remote signer DMZ with JWT minting.@pymthouse/builder-sdk/signer/webhook— handle go-livepeer identity webhook calls (POST /authorize) to authenticate end-users.
Token lifecycle
The following diagram shows how a signing request flows from the app backend through PymtHouse to the remote signer DMZ:Fetch signer routing config
| Field | Description |
|---|---|
dmzUrl | The remote signer DMZ base URL. Forward signing requests here. |
jwksUrl | PymtHouse JWKS endpoint for the DMZ to validate JWTs. |
webhookUrl | The identity webhook URL configured on the go-livepeer DMZ (-remoteSignerWebhookUrl). |
meteringMode | "kafka" (async Kafka collector) or "direct". |
Direct DMZ proxy (@pymthouse/builder-sdk/signer/server)
Use createDirectSignerProxyHandler to build an HTTP handler in your backend that:
- Mints a user JWT (or signer session) via the Builder API or OIDC.
- Forwards the original signing request to the remote DMZ with the JWT as the Bearer token.
- Streams the response back to the caller.
Low-level helpers
For custom forwarding logic:Device and API key exchange handlers
For CLI device flows and API key integrations, builder-sdk provides purpose-built handlers:Identity webhook (@pymthouse/builder-sdk/signer/webhook)
go-livepeer calls POST /authorize (configured via -remoteSignerWebhookUrl) for every signing request to verify the end-user’s credentials and receive an auth_id for usage attribution.
Setup
End-user auth adapters
The webhook handler is split into two layers:- Transport auth — validates the go-livepeer shared secret (
WEBHOOK_SECRET) that proves the request came from your DMZ, not an arbitrary caller. - End-user auth (
EndUserAuthVerifier) — validates the end-user’s credential in the signing request and resolves it to aUsageIdentity.
| Adapter | Import | Use case |
|---|---|---|
| OIDC (default) | @pymthouse/builder-sdk/signer/webhook/adapters/oidc | PymtHouse-issued JWTs or Auth0/OIDC tokens |
| API key | @pymthouse/builder-sdk/signer/webhook/adapters/api-key | Resolve pmth_* API keys to a UsageIdentity |
| Trusted headers | @pymthouse/builder-sdk/signer/webhook/adapters/trusted-headers | Reverse proxy that injects pre-authenticated user id |
| Composite | @pymthouse/builder-sdk/signer/webhook/adapters/composite | First-match across multiple verifiers |
API key adapter
Custom verifier
Implement theEndUserAuthVerifier interface for any custom auth scheme:
Webhook environment variables
| Variable | Description |
|---|---|
WEBHOOK_SECRET | Shared secret between go-livepeer DMZ and your webhook handler. Set on the DMZ via -remoteSignerWebhookSecret. |
JWT_ISSUER | OIDC issuer URL for JWT validation (e.g. https://your-pymthouse.example/api/v1/oidc). |
JWT_AUDIENCE | Expected aud claim in end-user JWTs. |
CLAIM_CLIENT_ID | JWT claim to use as the client id (default azp; for Auth0 set to azp). |
Security guidance
WEBHOOK_SECRETauthenticates that the signing request came from your go-livepeer DMZ instance. Rotate it if the DMZ is compromised.- The end-user
EndUserAuthVerifierauthenticates the user making the signing request. Keep the two auth layers separate — webhook secret is transport; end-user auth is identity. - Configure the go-livepeer DMZ with
-remoteSignerWebhookUrlpointing to your/authorizeendpoint and-remoteSignerWebhookSecretmatchingWEBHOOK_SECRET. - The DMZ validates JWTs against the JWKS URL from
getSignerRouting()— ensurejwksUrlis reachable from the DMZ host.
Related guides
- Token exchange — minting JWTs and signer sessions
- API keys — exchanging
pmth_*keys for signer sessions - Builder SDK —
createDirectSignerProxyHandler,getSignerRouting - Deprecated routes — migration from the removed
/api/signer/*proxy