Skip to content

Releases

Copy page

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.

const { data, hasMore } = await divinci.releases.list("ws_123", { limit: 20 });
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 uses
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 workspace
await divinci.releases.updateInWorkspace("ws_123", "rel_abc123", { name: "v2" });

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:

FieldDefaultPurpose
allowAnonymousChatfalseMaster switch. While false, anonymous chat is rejected with 403 FORBIDDEN.
requireSignedAnonymousChatfalseWhen 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.
maxAnonymousChatMessages1Per-conversation message cap. Raise it for multi-turn.
// Secure public anonymous chat: on, signed, multi-turn
await divinci.releases.updateInWorkspace(workspaceId, "rel_abc123", {
allowAnonymousChat: true,
requireSignedAnonymousChat: true,
maxAnonymousChatMessages: 12,
});

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.

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 },
},
});
FieldDefaultPurpose
enabledfalseMaster 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.
allowAnonymousMcpfalseAllow connections with no API key or OAuth token. Public/read-only products only.
maxSpendPerTokenCents1000Billing 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.

A release moves draft → available → deprecated. Publishing and forking are dedicated endpoints, not status writes:

Terminal window
# 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 config
curl -X POST https://api.divinci.app/api/v1/releases/$RELEASE/fork \
-H "Authorization: Bearer $TOKEN"
# Retire a release
curl 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 only
MethodDescription
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.