For Developers
Deploy a zkApp on Mina that handles licensing for your software. Set your price, payment address, and we generate the smart contract. Terms and conditions, compiled.
📄 Read the Docs · SDK Reference · Listing Requirements · 📊 Vendor Dashboard
Step 1 of 4
This wallet will be the zkApp's admin key — it can update pricing and withdraw funds. Keep it safe.
Step 2 of 5
Your legal identity, billing details, and Terms of Service acceptance are collected in one step and signed with a single wallet signature. Required to meet legal obligations for tax reporting and vendor identification. On devnet, you're approved automatically.
Required. Bound cryptographically to your ToS acceptance signature. Not shown on your public listing.
Step 3 of 5
zkappUri that buyers check against your domain from a Mina explorer (see Trust anchor). Set only once during init. This domain also becomes the origin for the Terms, Privacy, Refund policy, Buy, Renew, Refund, and Verifier URLs below — each of those fields is a path only, so buyers can trust that every SDK endpoint lives at the same origin as your listing.
Shown to buyers before purchase (EU Consumer Rights Directive Art. 6). Terms, Privacy, and the Refund/withdrawal policy govern your product and must point at pages you publish. Enter paths only — the domain comes from App Website above. If you leave both App Website and these fields blank, the marketplace uses the zklicensing.com defaults.
Where the SDK renders buy / renew / refund pages and where the verifier lives. Enter paths only — the domain always comes from App Website above, so buyers can trust that the endpoint origin matches the vendor origin they see in the marketplace listing. If you leave App Website blank, the marketplace falls back to zklicensing.com-hosted buy.html, renew.html, refund.html, and api/verify — those are devnet only, so for mainnet you must set App Website. The marketplace appends ?app=<zkAppAddress>&network=<net> at link time.
Step 4 of 5
Hard cap on how many devices your buyer can bind to a single license — enforced on-chain by the circuit itself, not by your server. Buyers sign every bind/unbind with their passphrase-derived key; nobody else (not you, not the platform) can add or remove a device. Defaults to 0 (binding disabled); max 5 (the on-chain slot array is fixed-width). Locked once you register this app — the value is committed to every issued license leaf as a public circuit input, so changing it later would desync existing buyers. Set it correctly now, or redeploy as a new app if you need a different cap. See Device binding docs for the full non-custodial model and its limits.
Step 5 of 5
Terms and conditions, compiled. Every license deployed on zkLicensing includes the following on-chain protections, enforced by the shared zkApp circuit:
These terms are compiled into the verification key; they apply to every deployment and cannot be toggled per-app.
Sign your App ID to prove you control the vendor address.
Waiting for your zkApp to land on Mina Devnet.
Inclusion typically takes ~45 seconds, but can be up to 10 minutes in slow blocks. You can read the integration docs below while you wait — there's nothing more to sign.
buy.html?app=<your zkApp address>). Renewals work the same way against renew.html. See Buying and renewing by zkApp address.
| Tier | Price | Duration |
|---|
packages/sdk/examples/ to try the buy / renew / refund examples.
npm install zklicensing and follow the SDK README.apps.json above into packages/sdk/examples/ as a starting point. See the SDK README. Optional on devnet, mandatory on mainnet.