Mint & transfer tokens

Passify checks compliance, then returns an unsigned transaction. Your user signs it in their own wallet — Passify never holds keys or moves funds.

The signing model

Token endpoints return a base64-encoded unsigned transaction. Your application passes it to the user's wallet (Phantom, Solflare, or a wallet-as-a-service provider) for signing, then submits the signed transaction to the network. This keeps a hard boundary: Passify enforces policy and assembles instructions but can never sign on a user's behalf.

Mint to a verified wallet

Minting requires a valid attestation that satisfies the asset's compliance rules:

bash
curl -X POST https://passify.biz/api/v1/token/mint \
  -H "Authorization: Bearer passify_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "user_pubkey": "7xKXtg2...",
    "mint_config": "us_real_estate_fund_v1",
    "amount": "1000"
  }'
200 OK
{ "status": "success", "unsigned_transaction_base64": "AQABA..." }

Transfer between wallets

Transfers check the sender's attestation and any runtime rules — jurisdiction, holder caps, and transfer locks — before returning an unsigned transaction:

bash
curl -X POST https://passify.biz/api/v1/token/transfer \
  -H "Authorization: Bearer passify_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "mint_config": "us_real_estate_fund_v1",
    "sender": "7xKXtg2...",
    "recipient": "4mNp...",
    "amount": "500"
  }'

Compliance errors

If a check fails, Passify returns 403 with a specific reason and no transaction:

errorCause
attestation_requiredThe wallet has no valid attestation.
attestation_expiredThe attestation has lapsed; renew it.
rule_violationA rule failed; detail names which (e.g. min_investment_usd_100).

Integration checklist

  • Confirm a verified status before offering a mint or transfer in the UI.
  • Handle 403 reasons explicitly so users know exactly what to fix.
  • Submit the signed transaction and confirm it on-chain before updating your own records.
  • For confidential assets, transfers may route through a privacy provider — the API contract is unchanged.

Last updated