Skip to content

Web Embed API

REST API for managing Canopi embed instances. Authenticated routes require a Bearer JWT from the Canopi sign-in flow.

Base URL: https://api.canopi.live/api/embeds

Authentication

http
Authorization: Bearer <jwt>

Obtain JWT by signing in through the extension or embed auth flow (POST /api/auth/web3auth).

Public endpoints

Get embed config

Used by the embed loader — no auth required.

http
GET /api/embeds/config/:canopiId

Response (200):

json
{
  "id": "abc123xyz",
  "communityId": "uuid",
  "domainWhitelist": ["example.com"],
  "pageRules": {
    "type": "patterns",
    "patterns": ["/help/*"]
  },
  "triggerConfig": {
    "type": "corner-tab",
    "position": "bottom-right",
    "message": "Need help?",
    "color": "#6366f1"
  },
  "status": "active"
}

Client config

Global client-side flags for embed runtime.

http
GET /api/embeds/client-config

Analytics event (public ingest)

http
POST /api/embeds/analytics/events
Content-Type: application/json

{
  "canopiId": "abc123",
  "event": "trigger_click",
  "pageUrl": "https://example.com/help/faq"
}

Authenticated endpoints

Create instance

http
POST /api/embeds/instances
Content-Type: application/json
Authorization: Bearer <jwt>

Body:

json
{
  "name": "Help Center Support",
  "description": "Sidebar for help pages",
  "communityId": "uuid-of-community",
  "domainWhitelist": ["example.com", "www.example.com"],
  "pageRules": {
    "type": "patterns",
    "patterns": ["/help/*", "/docs/*"]
  },
  "triggerConfig": {
    "type": "corner-tab",
    "position": "bottom-right",
    "message": "Need help? Chat with us!",
    "color": "#6366f1",
    "size": "medium"
  }
}

Response (201): instance object including generated embedCode.

List instances

http
GET /api/embeds/instances
Authorization: Bearer <jwt>

Get instance

http
GET /api/embeds/instances/:id
Authorization: Bearer <jwt>

Update instance

http
PUT /api/embeds/instances/:id
Authorization: Bearer <jwt>

Delete instance

http
DELETE /api/embeds/instances/:id
Authorization: Bearer <jwt>

Analytics summary

http
GET /api/embeds/analytics/:id
Authorization: Bearer <jwt>

Domain blacklist

http
GET /api/embeds/instances/:id/blacklist
PUT /api/embeds/instances/:id/blacklist
Authorization: Bearer <jwt>

Status codes

CodeMeaning
200Success
201Created
400Invalid body
401Missing or invalid token
403Forbidden (wrong user / domain)
404Instance not found

Embed code format

The dashboard generates:

html
<script
  src="https://app.canopi.live/embed/v1.js"
  data-canopi-id="abc123xyz"
  async
></script>

Full internal spec: docs/WEB_EMBED_SDK_API_SPEC.md in the repo.

Canopi — Metaweb coordination layer for community-aware presence and messaging.