Utility 05 / 05
Sell anywhereKeep the keys
Scoped API keys for shops and bots, a reseller desk paid in credit, signed webhooks
Seller APIResell and stay in charge
How it works
- 01
Create an API key
Pick its scopes, its apps and the IPs allowed to use it
- 02
Connect the shop
An order calls the API, the key is made in one step
- 03
Invite resellers
You grant credit, they make keys in a desk of their own
Everything in it
- Scopes per keyEach key does only what it was given
- No double salesAn Idempotency-Key keeps one order one sale
- Clear limits120 requests a minute, 600 on Premium
- Credit ledgerEvery reseller key is paid from credit and written down
- Signed webhooksHMAC-SHA256, retried about 15 times over 3 days
- Full OpenAPIGenerated from the schemas that validate requests
In code
curl -X POST https://<api host>/seller/v1/apps/app_…/licenses \
-H "Authorization: Bearer $CLAVIS_KEY" \
-H "Idempotency-Key: order-1042" \
-H "Content-Type: application/json" \
-d '{ "policyId": "pol_…", "count": 1, "email": "buyer@example.com" }'
const res = await fetch(`${host}/seller/v1/apps/${appId}/licenses`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CLAVIS_KEY}`,
"Idempotency-Key": "order-1042", // a retry never sells twice
"Content-Type": "application/json",
},
body: JSON.stringify({ policyId, count: 1, email: "buyer@example.com" }),
});
const { data } = await res.json(); // data.keys: shown once
import os, requests
res = requests.post(
f"{host}/seller/v1/apps/{app_id}/licenses",
headers={
"Authorization": f"Bearer {os.environ['CLAVIS_KEY']}",
"Idempotency-Key": "order-1042",
},
json={"policyId": policy_id, "count": 1, "email": "buyer@example.com"},
)
keys = res.json()["data"]["keys"]
Which plan has it
- Basic
- 2 API keys, 1 webhook
- Premium
- Resellers, 25 API keys, 50 webhooks
Read more in Protect Hub