Get the user's principal
One popup. User authenticates with Internet Identity. You receive their principal and a session delegation.
signer.pybara.com is Pybara Wallet exposed as a standard ICRC signer endpoint. Any ICP dApp can connect to it using @icp-sdk/signer — the same library used to connect to Oisy, Plug, or any other ICRC-compliant wallet.
Get the user's principal
One popup. User authenticates with Internet Identity. You receive their principal and a session delegation.
Sign calls silently
ICRC-34 delegation — after connect, transfers execute without additional popups for the session lifetime.
| Environment | URL |
|---|---|
| Production | https://signer.pybara.com |
| Staging | https://signer.staging.pybara.com |
| Standard | Methods |
|---|---|
| ICRC-25 | icrc25_supported_standards, icrc25_request_permissions, icrc25_permissions |
| ICRC-27 | icrc27_accounts — returns the user’s principal |
| ICRC-29 | icrc29_status — heartbeat / popup lifecycle |
| ICRC-34 | icrc34_delegation — returns a DelegationChain scoped to your requested canisters |
npm install @icp-sdk/signerimport { Signer } from '@icp-sdk/signer';import { PostMessageTransport } from '@icp-sdk/signer/web';
const signer = new Signer({ transport: new PostMessageTransport({ url: 'https://signer.pybara.com' })});
// 1. Get the user's principalconst accounts = await signer.getAccounts();const principal = accounts[0].owner;
// 2. Request a session delegation scoped to your canister(s)const delegation = await signer.requestDelegation({ publicKey: sessionPublicKey, // your session Ed25519 key targets: ['ryjl3-tyaaa-aaaaa-aaaba-cai'], // restrict to specific canisters maxTimeToLive: 8n * 3_600_000_000_000n // 8 hours});
// 3. Use the delegation to sign calls directly — no more popupsnpm install @dfinity/oisy-wallet-signerimport { IcrcWallet } from '@dfinity/oisy-wallet-signer/icrc-wallet';
const wallet = await IcrcWallet.connect({ url: 'https://signer.pybara.com', host: 'https://ic0.app'});
const accounts = await wallet.accounts();signer.pybara.com in a popup via PostMessageTransport.status: pending (ICRC-29) while the user authenticates with Internet Identity.status: ready — your transport unblocks.requestDelegation() — the signer returns a DelegationChain restricted to the canisters you specified.DelegationIdentity and can sign on-chain calls for the duration of the session (up to 8 hours).| Environment | Canister ID |
|---|---|
| Production | k57rn-byaaa-aaaac-bfcra-cai |
| Staging | ytat7-haaaa-aaaae-agusa-cai |
When calling requestDelegation(), specify the canisters your dApp needs to call. The delegation is cryptographically restricted to those targets — Pybara Wallet cannot be used to sign calls to canisters you did not request.
const delegation = await signer.requestDelegation({ publicKey: sessionPublicKey, targets: [ 'ryjl3-tyaaa-aaaaa-aaaba-cai', // ICP ledger 'mxzaz-hqaaa-aaaar-qaada-cai', // ckBTC ledger ], maxTimeToLive: 8n * 3_600_000_000_000n});