Releases
A Release is a deployable AI assistant configuration — its model, prompt, RAG
indexes, theme, and access rules. Your end users chat against a Release id;
divinci.releases is how you create and manage them.
For the settings that decide who reaches a Release and what they may spend — voice providers, testing domains, the MCP endpoint, the skill/tool loop, the free-chat gate, and paid pricing tiers — see Channels & Access.
Listing releases in a workspace
Section titled “Listing releases in a workspace”const { data, hasMore } = await divinci.releases.list("ws_123", { limit: 20 });Creating a release
Section titled “Creating a release”const release = await divinci.releases.create({ workspaceId: "ws_123", name: "Support Assistant", // ...model, prompt, and config fields});
console.log(release._id); // the releaseId your client/embed usesReading and updating
Section titled “Reading and updating”const release = await divinci.releases.get("rel_abc123");
// Update a release (top-level)await divinci.releases.update("rel_abc123", { name: "Support Assistant v2" });
// Or update a release within an explicit workspaceawait divinci.releases.updateInWorkspace("ws_123", "rel_abc123", { name: "v2" });Anonymous chat
Section titled “Anonymous chat”A Release can serve anonymous, no-login chat — the pattern behind public marketing pages and embedded landing-page widgets (see the Deploy to Cloudflare Workers guide). Three fields control it, and they layer:
| Field | Default | Purpose |
|---|---|---|
allowAnonymousChat | false | Master switch. While false, anonymous chat is rejected with 403 FORBIDDEN. |
requireSignedAnonymousChat | false | When true, anonymous-chat calls must carry a valid landing-page HMAC signature, so only your signing proxy (e.g. a Cloudflare Worker) can reach the endpoint. Only has an effect while allowAnonymousChat is true. |
maxAnonymousChatMessages | 1 | Per-conversation message cap. Raise it for multi-turn. |
// Secure public anonymous chat: on, signed, multi-turnawait divinci.releases.updateInWorkspace(workspaceId, "rel_abc123", { allowAnonymousChat: true, requireSignedAnonymousChat: true, maxAnonymousChatMessages: 12,});Chat CTA
Section titled “Chat CTA”Attach a contextual call-to-action card that renders inline in a chat reply when the answer matches your trigger topics — on both anonymous/embed chat and signed-in chat:
await divinci.releases.updateInWorkspace(workspaceId, "rel_abc123", { chatCTA: { title: "Interested in real estate investing?", teaserText: "Download our free guide.", buttonLabel: "Get instant access", triggerKeywords: ["real estate investing", "1031", "multifamily"], ctaType: "link-out", targetUrl: "https://lp.example.com/playbook", active: true, },});updateInWorkspace creates the CTA sub-document and points the release at it in
one call. Switch ctaType to "email-gated-download" to capture the lead with
an inline form before revealing assetUrl.
See the Chat CTAs guide for trigger cadence, the gated download flow, CRM sync and versioning.
MCP server config
Section titled “MCP server config”A Release can be published as its own MCP server — a curated, tenant-scoped
endpoint your consumers connect their AI assistants to. Set the mcpConfig
object on the release to enable it and choose which tools, guardrails, and
billing apply:
await divinci.releases.updateInWorkspace(workspaceId, "rel_abc123", { mcpConfig: { enabled: true, exposedTools: ["search_knowledge", "send_message"], // omit = all release tools allowAnonymousMcp: false, maxSpendPerTokenCents: 500, // $5.00 cap per token mcpRateLimit: { requestsPerMinute: 60, requestsPerDay: 10000 }, },});| Field | Default | Purpose |
|---|---|---|
enabled | false | Master switch. While false, the tenant MCP endpoint returns 404. |
exposedTools | (all) | Allowlist of tool names. Empty/unset exposes all of the release’s tools. |
allowedScopes | (all) | Subset of platform scopes the release’s tokens may carry. |
allowAnonymousMcp | false | Allow connections with no API key or OAuth token. Public/read-only products only. |
maxSpendPerTokenCents | 1000 | Billing safety cap per token (1000 = $10.00). |
mcpRateLimit | { 60/min, 10000/day } | Per-minute and per-day request ceilings. |
Once enabled and published, consumers connect to
https://mcp.divinci.app/{whitelabelId}/mcp. See
Release as an MCP Server for the endpoint,
authentication options (API key, central OAuth, or your own federated IdP), and
billing modes.
Lifecycle
Section titled “Lifecycle”A release moves draft → available → deprecated. Publishing and forking are
dedicated endpoints, not status writes:
# Publish a draft (it becomes the live release)curl -X POST https://api.divinci.app/api/v1/releases/$RELEASE/publish \ -H "Authorization: Bearer $TOKEN"
# Fork a published release back into a fresh draft, carrying its full configcurl -X POST https://api.divinci.app/api/v1/releases/$RELEASE/fork \ -H "Authorization: Bearer $TOKEN"
# Retire a releasecurl https://api.divinci.app/white-label/$WORKSPACE/release/$RELEASE/deprecate \ -H "Authorization: Bearer $TOKEN"Deleting a draft is exposed on the SDK:
await divinci.releases.delete("rel_abc123"); // drafts onlyMethod reference
Section titled “Method reference”| Method | Description |
|---|---|
list(workspaceId, options?) | Paginated releases in a workspace. |
get(releaseId) | Fetch a release. |
create(options) | Create a release (requires workspaceId). |
update(releaseId, options) | Update a release. |
updateInWorkspace(workspaceId, releaseId, options) | Update within an explicit workspace. |
activate(releaseId) | ⚠️ Non-functional — see Lifecycle. |
archive(releaseId) | ⚠️ Non-functional — see Lifecycle. |
delete(releaseId) | Delete a release. |