1. Platform
  2. Features
  3. API & Integrations
Feature Developer Platform

Canopy is built around its API

Every action available in the Developer Console is available programmatically: no hidden functionality, no UI-only features. Authenticate with API keys, react to changes with webhooks, and integrate hierarchical access control into your application.

REST & JSON Versioned endpoints Webhooks & API keys
POST /api/v1/permissions/evaluate
# X-API-Key: cnpy_8f2a…e91
POST /api/v1/permissions/evaluate
{
"identity_id": "8f1e7a02-3b6c-4d59-bf12-9a2e7c4d8e31",
"permission": "invoice.approve",
"scope": "node",
"node_id": "3a9f2c41-7e08-4b1d-9c6a-1f2e3d4c5b6a"
}
 
→ 200 OK · 14 ms
{
"allowed": true,
"permission": "invoice.approve",
"scope_evaluated": "node",
"effective_node_id": "3a9f2c41-7e08-4b1d-9c6a-1f2e3d4c5b6a",
"granting_roles": ["c7b4e9d2-5a18-42f3-8e90-6d1a2b3c4d5e"],
"denial_reason": null
}
evaluated
More than a CRUD API

You're not storing data, you're outsourcing authorization

Most APIs manage users and roles. Canopy's API models real organizational structure, evaluates permissions across hierarchies, and enforces access consistently across tenants.

A typical CRUD API
  • Stores users and roles as flat records
  • Leaves access logic in your codebase
  • No awareness of structure or inheritance

You still write, and maintain, the authorization layer.

Canopy's API
  • Models real organizational structure
  • Evaluates permissions across hierarchies
  • Enforces access consistently across tenants

Your app asks Canopy: the authorization logic lives here.

REST API

It doesn't just manage data. It enforces access control.

Manage hierarchies, assign roles at specific nodes, evaluate permissions in real time, and build permission-aware features. Standard JSON, predictable responses, versioned endpoints.

Standard JSON
Predictable responses
Versioned endpoints
REST APIv1
POST /api/v1/nodes Create node
POST /api/v1/assignments Assign at node
POST /api/v1/permissions/evaluate Check permission
GET /api/v1/identities/ {id} /detail Read identity
PUT /api/v1/roles/ {id} /permissions Update grants
DEL /api/v1/api-keys/ {id}Revoke key
API key management

Scoped keys for server-to-server access

Authenticate server-to-server requests with API keys. Each key carries scopes that limit what the integration can do, and plugs directly into the same authorization model as your identities.

Scoped access: each key is limited to the actions an integration actually needs.
Rotate and revoke at any time, without redeploying your application.
Authorization-aware: keys plug into the same access model as identities.
Production · Billing service
Acme Checkout / production
Active
cnpy_8f2a··········e91
permissions.evaluateidentity.view
CI · Provisioning bot
Acme Checkout / development
Revoked
cnpy_3d77··········a04
hierarchy.managerbac.manage_assignments
Webhooks

React to changes in real time

Subscribe to events (an identity created, a role assigned at a node, a hierarchy change) and receive HTTP callbacks the moment they happen. Trigger workflows without polling, with retries and exponential backoff for reliable delivery.

No polling: events are pushed to your endpoint the moment they happen.
Reliable delivery: retries with exponential backoff until your endpoint acknowledges.
identity.created
dana@acme.com · West Region
12:04:01
assignment.created
Regional Manager → west/sf
12:04:02
POST https://acme.com/hooks
X-Canopy-Signature · HMAC-SHA256
200
Auto-retry with exponential backoff on failure
Audit logging

Every security-sensitive action, recorded

Who performed it, what changed, and when it happened. Use audit logs for debugging access issues, tracking changes over time, and compliance reporting.

Audit log All actorsLast 24h
Dana Okaforidentity.createdjordan@acme.com
12:04:01 · 10.0.4.21
Dana Okaforassignment.createdRegional Manager → west/sf
12:04:01 · 10.0.4.21
API keynode.createdwest/san-diego
11:58:33 · cnpy_8f2a
Priya Nairapi_key.revokedcnpy_3d77
11:42:09 · 10.0.4.88
Immutable, queryable, and exportable. Explore Audit Logging
How you integrate Canopy

Your application doesn't implement access logic. It asks Canopy.

A typical integration wires four steps together, then every access decision is a single API call away.

1

Create identities

Provision users through the API as they join your application.

2

Assign roles at nodes

Place each identity at the hierarchy node where they belong.

3Optional

Authenticate via OAuth

Use Canopy's hosted login, or bring your own identity provider.

4

Evaluate at runtime

Ask Canopy "can this user do X at node Y?" on every request.

Your application doesn't implement access logic. It asks Canopy.

Ready to simplify access control?

Create an account and have authentication and hierarchical access control running today.