One API for the
physical world.
Identities, assets, identifiers, relationships, organizations, webhooks and usage — machine access through scoped credentials, never a human login. First call in under 10 minutes.
From zero to your first asset
1 · Create an organization
Sign in normally, then create your organization — the tenant for everything that follows.
2 · Generate API credentials
One application per integration; secrets are shown once and stored hashed.
3 · Create identities
Bulk pre-provision with external-reference idempotency — resending a batch creates nothing twice.
4 · Attach identifiers & relationships
Many QR/NFC/serial identifiers → one identity. Link systems, components and organizations.
5 · Subscribe to events
Signed, replay-protected webhooks with topic + per-asset filtering.
6 · Meter & verify
Value-based usage per organization, idempotent by reference.
Who is calling, and what can they do?
Machine access
Client credentials → scoped Bearer token. Organization comes from the credential — never from the request body.
Scopes (least privilege)
identity:read · identity:writeassets:read · assets:writerelationship:read · relationship:createfleet / drivers / custody / maintenancewebhooks:read · webhooks:writeusage:read · billing:read · warranty:create · service:write
The full surface (live)
POST /organizations/{o}/assets/bulk— factory provisioningPOST /assets/{u}/identifiers— many QR/NFC/serial → one identityPOST /assets/{u}/allocate·GET /inventory— supply chainGET /assets/{u}/passport·/network·/dppPOST /assets/{u}/warranty·POST /recallsPOST /assets/{u}/organizations·/grants+ consentGET /customers·GET /console— connected users + factory KPIsPOST /identifiers/resolve— universal resolutionGET /scim/v2/Users— directory provisioning
Every response
X-Request-ID header + machine-readable errors {error:{code,message,request_id}}. Idempotency-Key on writes; 429 with Retry-After.
Tenant isolation
Organization A can never read or modify Organization B — enforced at the middleware, service and query layers, not the UI.
Webhook verification
Signatures are computed over the raw payload: sha256=HMAC_SHA256(timestamp + "." + raw_body, webhook_secret) with X-GrowLeafy-Event / -Delivery / -Timestamp / -Request-ID / -Signature headers. Reject timestamps outside your tolerance; delivery IDs are globally unique.
Events
- identity.created · identity.activated
- asset.created · asset.updated · asset.transferred
- identifier.attached · identifier.replaced
- service.request_created · service.completed
- maintenance.created · custody.changed
- qr.activated · qr.revoked · qr.replaced
Delivery
Retry with exponential backoff, delivery ledger, asset-filtered subscriptions, transactional outbox for reliability.
One API — every role's workflow
🏭 Manufacturer
Identity at the factory → distribute → warranty → recall → authorized events.
🚚 Distributor
Receive authorized inventory, transfer onward — custody changes, identity never does.
🔧 Installer / Dealer
Record installation, link components, hand the asset to the owner.
🛠 Service provider
Asset-contextual cases, append-only timeline, provider-owned pricing.
🛡 Insurer
A participant, never an owner: authorized domains only, consent-gated.
🧑 User
Your physical world + your network — one account, consent in your hands.
Same engine, every industry
🔋 Battery
Bulk provision 1M → serial+batch → distributor inventory → installed_in vehicle/solar → owner claims → service cases → warranty/recall → recycler window.
☀️ Solar
Site → array → panels → inverter → battery → gateway as one graph (COMPONENT_OF); each panel keeps its own identity, warranty and DPP record.
🚗 Automotive
Vehicle with windshield QR + service QR + NFC + VIN — many identifiers, one identity; components replace historically (battery A removed_from, battery B installed_in).
📦 Logistics
Container/shipment/package as related levels; custody events with effective dates; warehouse/carrier/customer each see their window.
🩺 Medical
Equipment identity strictly separate from patient/clinical data — service partners see authorized maintenance data only.
🏢 Facilities & rental
Building → floor → room → equipment graph; rental = owner ≠ custodian — custody changes, identity stays.
Error catalogue & limits
Standard errors
VALIDATION_ERROR·UNAUTHENTICATEDFORBIDDEN·NOT_FOUND·RATE_LIMITEDSCOPE_REQUIRED·EXISTING_ASSET_FOUNDASSET_NOT_CLAIMED·INTERNAL_ERROR
Limits & idempotency
- Bulk provisioning: 2,000/call (queued millions pipeline next)
Idempotency-Keyon writes — repeat = original result- 429 with
Retry-After; scopes are least-privilege - SCIM: org-scoped token, 60 req/min
Sandbox
Create a sandbox organization for experiments — same API, same tooling, isolated from production. Credentials are environment-scoped; secrets shown once.
Build on the identity layer.
Sandbox organizations keep experiments away from production — same API, same tooling, zero risk.