v1.0.0
OpenAPI 3.1.0

Canopy API

Public APIs for systems that integrate with Canopy.

  • ERP Export API: read-only access to clients, projects, products and tenders, with an API key.
  • Ticket Submission API: create support tickets from your own website or contact form (no auth, CORS-enabled for configured origins).

Getting an API key

  1. An admin opens Administration → Integrations → API Keys and clicks New Key, choosing which resources it can reach.
  2. Copy the key immediately. It's shown once, and only its hash is stored.
  3. Send it as Authorization: Bearer <key> on every export request.

Revoke a key there at any time. It returns 401 from then on.

Server:https://canopy.syentia.io

This deployment

No authentication selected
Client Libraries

ERP Export

​

Read-only data export. Each key only reaches the resources it was granted; each key is limited to 300 requests/hour.

List the resources this key can reach

​

Self-discovery for a key: returns only the resources it was granted, with their paths. Works with any valid, non-revoked key.

Responses

  • application/json
  • application/json
Request Example for get/api/integrations/export
curl https://canopy.syentia.io/api/integrations/export \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "resources": [
    {
      "scope": "clients",
      "path": "/api/integrations/export/clients"
    }
  ]
}

Export clients

​

Every client with contact details, pipeline stage and estimated value, newest first.

Requires an API key with the clients scope.

Responses

  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/integrations/export/clients
curl https://canopy.syentia.io/api/integrations/export/clients \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "resource": "clients",
  "count": 1,
  "items": [
    {
      "id": "CL-12",
      "name": "Acme Ltd",
      "contactName": "string",
      "contactEmail": "hello@example.com",
      "contactPhone": "string",
      "stage": "lead",
      "estimatedValue": 1,
      "createdAt": "2026-10-21T13:20:56.122Z",
      "updatedAt": "2026-10-21T13:20:56.122Z"
    }
  ]
}

Export projects

​

Every project with its client, status and dates, newest first.

Requires an API key with the projects scope.

Responses

  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/integrations/export/projects
curl https://canopy.syentia.io/api/integrations/export/projects \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "resource": "projects",
  "count": 1,
  "items": [
    {
      "id": "PROJECT-4",
      "name": "string",
      "description": "string",
      "clientId": "string",
      "clientName": "string",
      "status": "planned",
      "startDate": "2026-10-21",
      "endDate": "2026-10-21",
      "createdAt": "2026-10-21T13:20:56.122Z",
      "updatedAt": "2026-10-21T13:20:56.122Z"
    }
  ]
}

Export products

​

The product/service catalogue used on quotes.

Requires an API key with the products scope.

Responses

  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/integrations/export/products
curl https://canopy.syentia.io/api/integrations/export/products \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "resource": "products",
  "count": 1,
  "items": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "unitPrice": 1,
      "currency": "GHS",
      "createdAt": "2026-10-21T13:20:56.122Z",
      "updatedAt": "2026-10-21T13:20:56.122Z"
    }
  ]
}

Export tenders

​

Every tender with issuing authority, stage, value and submission deadline, newest first. Internal notes are not included.

Requires an API key with the tenders scope.

Responses

  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/integrations/export/tenders
curl https://canopy.syentia.io/api/integrations/export/tenders \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "resource": "tenders",
  "count": 1,
  "items": [
    {
      "id": "string",
      "title": "string",
      "issuingAuthority": "string",
      "referenceNumber": "string",
      "contactName": "string",
      "contactEmail": "hello@example.com",
      "contactPhone": "string",
      "source": "string",
      "stage": "identified",
      "estimatedValue": 1,
      "submissionDeadline": "string",
      "convertedClientId": "string",
      "createdAt": "2026-10-21T13:20:56.122Z",
      "updatedAt": "2026-10-21T13:20:56.122Z"
    }
  ]
}

Tickets (Collapsed)

​

Public ticket submission, as used by the /portal page. Rate-limited per IP and per requester email.

Models