Five types are supported. Every request requires the common fields described on the Payload format page, plus the type-specific fields below.
Ask the user to pair their wallet with your app and optionally pre-grant permissions so future requests of those types don't need per-call approval.
| Field | Type | Notes |
|---|---|---|
| type * | string | "connect" |
| permissions | string[] | Any subset of "transfer", "sc_call", "sign_message". Omit to connect without pre-granting. |
{
"type": "connect",
"nonce": "a1b2c3d4e5f6g7h8",
"dapp": { "name": "Acme", "origin": "https://acme.example" },
"permissions": ["transfer", "sign_message"]
}{
"status": "connected",
"type": "connect",
"nonce": "a1b2c3d4e5f6g7h8",
"identity": "<60-char Qubic identity>",
"permissions": ["transfer", "sign_message"]
}Send an amount of QU from the user's selected account to a recipient.
| Field | Type | Notes |
|---|---|---|
| type * | string | "transfer" |
| to * | string | Exactly 60 uppercase A–Z letters — Qubic identity format with checksum |
| amount * | number | string | Positive whole QU units |
| from | string | Prefer a specific account identity. User can override. |
| tick_offset | integer | Target tick offset from current. Advanced use. |
{
"type": "transfer",
"nonce": "f3a8b2c1d0e9...",
"dapp": { "name": "Acme", "origin": "https://acme.example" },
"to": "NQZBXKZP4MTLDUVWXYZK8MFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"amount": 1500000
// optional: "from": "<identity>", "tick_offset": 5
}{
"status": "signed",
"type": "transfer",
"nonce": "f3a8b2c1d0e9...",
"identity": "<signing identity>",
"tx_hash": "<transaction hash>",
"target_tick": 14872123
}Call a Qubic smart contract procedure. Sigil constructs the invocation transaction and signs it.
| Field | Type | Notes |
|---|---|---|
| type * | string | "sc_call" |
| contract_index * | integer | 0–63 |
| input_type * | integer | Non-negative. The procedure number on the contract. |
| payload | string | Base64-encoded input bytes for the call (if the procedure takes input) |
| amount | number | string | QU attached to the call, if any |
| from | string | Prefer a specific account identity |
{
"type": "sc_call",
"nonce": "...",
"dapp": { "name": "Acme", "origin": "https://acme.example" },
"contract_index": 6, // Qearn
"input_type": 1, // lock procedure
"amount": 10000000
// optional: "payload": "<base64 input bytes>", "from": "...", "tick_offset": 5
}The approve callback has the same shape as transfer: { status: 'signed', identity, tx_hash, target_tick }.
Ask the user to sign a message without sending a transaction. Useful for off-chain authentication, proving address ownership, or session tokens.
| Field | Type | Notes |
|---|---|---|
| type * | string | "sign_message" |
| message * | string | Non-empty, max 2 048 characters. Shown verbatim to the user. |
| from | string | Prefer a specific account identity |
| data | string | Extra opaque string passed through to the callback. Not shown to the user. |
{
"type": "sign_message",
"nonce": "...",
"dapp": { "name": "Acme", "origin": "https://acme.example" },
"message": "Sign in to Acme · 2026-05-30T10:00:00Z"
// optional: "from": "<identity>", "data": "<extra string>"
// max message length: 2 048 characters
}{
"status": "signed",
"type": "sign_message",
"nonce": "...",
"identity": "<signing identity>",
"signature": "<ECDSA signature, base64>",
"public_key": "<public key, base64>"
}Hand Sigil a message + signature + public key; get back whether the signature is valid. No private key is involved — Sigil just runs the verification math.
| Field | Type | Notes |
|---|---|---|
| type * | string | "verify_message" |
| message * | string | The original message that was signed |
| signature * | string | The signature to verify |
| public_key * | string | The public key to verify against |
{
"type": "verify_message",
"nonce": "...",
"dapp": { "name": "Acme", "origin": "https://acme.example" },
"message": "<original message>",
"signature": "<signature to verify>",
"public_key": "<public key>"
}{
"status": "verified",
"type": "verify_message",
"nonce": "...",
"valid": true,
"identity": "<derived identity, or empty string>"
}