Develop
API keys
Create, scope, and rotate API keys for SDK, CLI, and webhook signing.
Test and live modes
Every API key is in either test or live mode. Test mode has its own marketplace, balance, and webhook secret; nothing crosses over.
| Prefix | Mode | Charges | Webhook secret |
|---|---|---|---|
nd_test_… | Test | None — Stripe test cards only | whsec_test_… |
nd_live_… | Live | Real charges and payouts | whsec_live_… |
Create a key
Generate keys at Dashboard → API keys. Each key has a name, mode, scope set, and optional expiry. The secret is shown once at creation — copy it immediately and store it in a secrets manager.
Try it right away by calling /v1/me:
curl https://api.nodedata.dev/v1/me \
-H "Authorization: Bearer nd_test_..."Restricted (scoped) keys
Default keys can perform any action your account can. Restricted keys narrow that surface. Use them for CI, edge devices, and any environment that does not need full account access.
node-data keys create \
--name "ci-deploys" \
--mode live \
--scope "models:read" \
--scope "models:upload" \
--expires 90dAvailable scopes
models:read— list and download licensed modelsmodels:upload— create and update models you owndatasets:read/datasets:uploadlistings:read/listings:writepayouts:read— read-only access to revenuedeploy:write— create and update deploymentswebhooks:write— configure webhook endpoints
Rotation
Rotate keys at least every 90 days, immediately after a teammate offboards, or any time a key is suspected to be compromised. The safe pattern is to overlap: create the new key, deploy it, then revoke the old one.
# Issue a new key and overlap-rotate
new_key = node.keys.create(name="ci-deploys-2026q3", mode="live")
# Deploy new key to production secrets
# ...
node.keys.revoke("nd_live_oldkey1234")Never commit secrets
Storing keys
- Local dev:
.env.local, never.envtracked in git - CI: secrets manager (GitHub Actions secrets, Vercel env, AWS Secrets Manager)
- Edge devices: write-once secrets in a TPM, then reference by handle