Choose a PIN-entry flow
For hosted PIN entry, callPOST /cards/{id}/pin/session with the canonical HTTPS targetOrigin of your frontend. Include the scheme, host, and optional port, without a path, trailing slash, credentials, query, or fragment.
Install the lithic-embed frontend SDK. Initialize LithicEmbed with the returned environment (Environment.SANDBOX or Environment.PRODUCTION), call pinSetting(sessionToken), mount the control, and call its submit() method when the cardholder confirms. Follow Lithic’s embed integration guide for SDK usage and error handling. The control accepts four digits. The cardholder’s plaintext PIN goes directly to Lithic.
The token expires at expiresAt and permits one successful submission. Request a new session for another change or after expiration. Treat the token as a secret: never persist, cache, log, or send it to analytics. Use the SDK’s submission result to confirm success. An OK status alone cannot prove that an already configured PIN was changed.
If you own the PIN-entry UI, call POST /cards/{id}/pin with encryptedPinBlock. Encrypt immediately in the frontend using Lithic’s encrypted PIN block specification and public key. The same public key serves sandbox and production. Use a fresh random nonce for each request and keep both plaintext and ciphertext out of logs and analytics. Grid forwards the encrypted block without decrypting it. A rejected block returns 400 INVALID_INPUT.
Check and recover a PIN
CallGET /cards/{id}/pin to read the processor’s current pinStatus and pendingCommands:
Three consecutive incorrect attempts block an online PIN. Call
POST /cards/{id}/pin/unblock to keep the same PIN, or use either PIN-entry flow to choose a new one. Unblocking a PIN that is already OK is safe; a card with no PIN returns 409 CONFLICT.
There is no PIN-reveal API. If the cardholder forgets the PIN, let them set a new one. Setting a PIN does not activate a closed or frozen card or change its spending limits.
Card.pinStatus is the last observed processor status. It can be absent before the first observation or for a provider without PIN management; absence does not mean NOT_SET. Use the dedicated status endpoint when current state matters.