Skip to main content
Direct signer integration uses:
  1. GET .../signer/routing — fetch the DMZ URL and webhook URL for your app.
  2. @pymthouse/builder-sdk/signer/server — proxy signing requests directly to the remote signer DMZ with JWT minting.
  3. @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

Returns the remote DMZ URL, JWKS URL, webhook URL, and metering mode for the app. Response:
SDK:

Direct DMZ proxy (@pymthouse/builder-sdk/signer/server)

Use createDirectSignerProxyHandler to build an HTTP handler in your backend that:
  1. Mints a user JWT (or signer session) via the Builder API or OIDC.
  2. Forwards the original signing request to the remote DMZ with the JWT as the Bearer token.
  3. 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

Set IDENTITY_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_SECRET authenticates that the signing request came from your go-livepeer DMZ instance. Rotate it if the DMZ is compromised.
  • The end-user EndUserAuthVerifier authenticates 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 -remoteSignerWebhookUrl pointing to your webhook path (/webhooks/remote-signer when embedded in PymtHouse, /authorize for the standalone sidecar) and -remoteSignerWebhookSecret matching WEBHOOK_SECRET.
  • The DMZ validates JWTs against the JWKS URL from getSignerRouting() — ensure jwksUrl is reachable from the DMZ host.