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
SDK:
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.
API key adapter
Custom verifier
Implement theEndUserAuthVerifier interface for any custom auth scheme:
Webhook environment variables
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