Skip to content

Pybara Signer

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.

EnvironmentURL
Productionhttps://signer.pybara.com
Staginghttps://signer.staging.pybara.com
StandardMethods
ICRC-25icrc25_supported_standards, icrc25_request_permissions, icrc25_permissions
ICRC-27icrc27_accounts — returns the user’s principal
ICRC-29icrc29_status — heartbeat / popup lifecycle
ICRC-34icrc34_delegation — returns a DelegationChain scoped to your requested canisters
Terminal window
npm install @icp-sdk/signer
import { 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 principal
const 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 popups
  1. Your dApp opens signer.pybara.com in a popup via PostMessageTransport.
  2. The signer signals status: pending (ICRC-29) while the user authenticates with Internet Identity.
  3. On successful login the signer signals status: ready — your transport unblocks.
  4. You call requestDelegation() — the signer returns a DelegationChain restricted to the canisters you specified.
  5. The popup closes. You now hold a DelegationIdentity and can sign on-chain calls for the duration of the session (up to 8 hours).
EnvironmentCanister ID
Productionk57rn-byaaa-aaaac-bfcra-cai
Stagingytat7-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
});