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.@livepeer/clearinghouse-identity-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 (@livepeer/clearinghouse-identity-webhook)
go-livepeer calls your identity webhook (configured via -remoteSignerWebhookUrl) for every signing request to verify the end-user’s credentials and receive an auth_id for usage attribution. Set the flag to the exact path for your deployment:
PymtHouse embeds the clearinghouse package at
POST /webhooks/remote-signer. The same package runs as a standalone sidecar (listening at POST /authorize) in the clearinghouse compose stack.
Setup (embedded in your app)
End-user auth modes
SetIDENTITY_AUTH_MODE when running the standalone sidecar (api_key or oidc). For embedded Pymthouse routes, createLegacyWebhookConfigFromEnv maps legacy JWT_* / CLAIM_* env vars to OIDC verification.
API key mode (sidecar)
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 webhook path (/webhooks/remote-signerwhen embedded in PymtHouse,/authorizefor the standalone sidecar) 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