Last updated · May 2026
- Production-ready APIs
- SOC 2 Type I - In Progress
- No-code quickstart
- TypeScript & Python SDK
- REST API
Integration guide
Live API - https://api.datavibe.cc/v1/gate/outbound
Put DataVibe between your AI and your customers. Every outbound message is checked against your policies, held for approval when needed, and logged for audit, before anything is sent.
At a glance
DataVibe sits between AI-generated content and your customer. You do not replace your email tool or your AI, you add one safety step in the middle.
Your AI writes a message → DataVibe checks it → Your team approves (if needed) → Message sendsEvery check returns one of three outcomes:
| Outcome | What it means | What you do |
|---|---|---|
| Safe | Passed your policy checks. | Send the message or let your system continue. |
| Needs review | Nothing risky enough to block, but a human should confirm. | Open the approval queue and approve or edit. |
| Blocked | A hard rule was broken (e.g. fake pricing, PHI, guarantee language). | Fix the content and submit again: it will not send as-is. |
Choose your setup path
Pick the option that matches your team today. You can start without code and add a developer integration later.
No code
Ops, RevOps, compliance leads
Use the dashboard setup wizard, pick a policy pack, and run a test message in Quickstart.
Open setup wizard →Policy packs
Anyone choosing compliance coverage
Browse ready-made industry and country packs (HIPAA, FINRA, GDPR, sales safety, and more) and apply with one click.
Browse policy library →Developer SDK or API
Engineering teams
Install the SDK or call the Gate API from your app so every AI send is checked automatically.
Jump to SDK guide →For developers. SDK (recommended)
The SDK is a small connector your engineering team installs once. After that, your app sends each AI-generated message to DataVibe before it reaches a customer. Your OpenAI or Anthropic keys stay on your servers, DataVibe only sees the text you choose to check.
Step 1: Install
Share these commands with your developer (TypeScript or Python):
npm install @datavibe.cc/sdkpip install datavibeCreate an API key in the dashboard under Security → API Keys. Treat it like a password, your developer stores it in environment variables, not in source code.
Step 2: Check content before you send
Most teams use check(): your app already has AI output; DataVibe scores it and tells you whether to send, wait for approval, or stop.
TypeScript example
import { DataVibeClient } from "@datavibe.cc/sdk";
const dv = new DataVibeClient({ apiKey: process.env.DATAVIBE_API_KEY! });
// Send AI output to DataVibe before it goes to a customer
const result = await dv.check({
content: modelOutput,
contentType: "email", // or "agent_action" for tool / workflow steps
});
if (result.verdict === "blocked") {
// Hard stop, fix the content and try again
throw new Error("Blocked by policy");
}
if (result.verdict === "review_required") {
// Held for a human, share the review link with your team
return { status: "waiting_for_approval", reviewUrl: result.reviewUrl };
}
// safe, continue sendingPython example
from datavibe import DataVibeClient
dv = DataVibeClient(api_key="dv_live_…")
result = dv.check(
"Agent proposed a $500 credit without manager approval",
content_type="agent_action",
)
if result.verdict == "blocked":
raise RuntimeError("Blocked, edit and resubmit")
if result.verdict == "review_required":
return {"waiting": result.review_url}Optional, generate and check in one step
If you prefer DataVibe to draft and check the message, use generateAndCheck(). Configure your AI provider in the dashboard under Settings → AI Provider.
// Optional: DataVibe drafts the message and checks it in one step
const result = await dv.generateAndCheck({
prompt: "Write a polite follow-up for a churn-risk account",
contentType: "email",
});
// Use result.content when the verdict is safeUsing LangChain or LangGraph? See the agent guide →
Advanced developer options
Streaming AI responses
If your agent streams tokens as they are generated, use streamCheck() to inspect output in real time and stop early when a rule is broken.
// Advanced: check AI output while it is still being generated
let sessionId: string | undefined;
for await (const chunk of openaiStream) {
const res = await dv.streamCheck({
content: chunk,
sessionId,
final: false,
});
sessionId = res.session_id;
if (res.verdict === "blocked") throw new Error("Blocked mid-stream");
}
await dv.streamCheck({ content: "", sessionId, final: true });Cursor, Claude Code, and other MCP tools
Developers can expose DataVibe inside MCP-compatible editors. Add your API key to the MCP config:
{
"mcpServers": {
"datavibe": {
"command": "npx",
"args": ["-y", "@datavibe/mcp-server"],
"env": { "DATAVIBE_API_KEY": "dv_live_…" }
}
}
}More samples
Runnable examples live in the examples/ folder on GitHub.
For developers, direct API (email)
Prefer not to use the SDK? Send a single web request when you would normally click “send.” The Gate scans the message immediately and tells you whether it is safe, queued for review, or blocked.
Non-technical teams can skip this section, use Quickstart in the dashboard instead.
Where DataVibe fits
Today, AI outbound often looks like this:
AI / sales tool writes email → Email provider sends → Customer inboxWith DataVibe, you add one step:
AI writes email → DataVibe checks & approves → Email provider sends → Customer inboxYour existing tools stay the same. You are adding a safety layer, not replacing your stack.
API keys (for developers)
Each request needs a secret API key (starts with dv_live_). Create one in Security → API Keys. Keys belong to your workspace, only your team can see submissions for that workspace.
1. Send a draft for review
Instead of sending email directly, post the draft to DataVibe. Think of it as “submit for safety check” rather than “send now.”
curl -X POST https://api.datavibe.cc/v1/gate/outbound \
-H "Authorization: Bearer dv_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"recipient": "[email protected]",
"subject": "Quick question regarding your infrastructure",
"body_html": "<p>Hi there, I noticed...</p>",
"source_model": "gpt-4o",
"campaign_id": "outbound_q3"
}'What to include in the request
| Field | Required? | Plain English |
|---|---|---|
recipient | Yes | Who the email is going to. |
subject | Yes | Email subject line. |
body_html | Yes | The email body (HTML). |
body_text | Optional | Plain-text version: helps deliverability. |
source_model | Optional | Which AI model wrote this (for your records). |
campaign_id | Optional | Your campaign name: useful for reporting. |
metadata | Optional | Any extra context your team wants logged. |
idempotency_key | Optional | Prevents duplicate sends if you retry the same request. |
2. Read the result
DataVibe replies immediately. If the message passes automated checks, it lands in your team's approval queue:
{
"action_id": "gov_8f72c91a",
"status": "queued",
"policy_passed": true,
"policy_violations": [],
"review_url": "https://app.datavibe.cc/queue?action=gov_8f72c91a",
"message": "Submission queued for human review. Approve at the review_url."
}If something serious is wrong, invented pricing, guarantees, or other hard-block rules, the message is rejected on the spot and never enters the queue:
{
"action_id": "gov_3c12d04f",
"status": "BLOCKED",
"policy_passed": false,
"policy_violations": [
{
"rule": "pricing_hallucination",
"severity": "BLOCK",
"detail": "Pricing or discount claim detected: '30% off'. LLMs frequently hallucinate pricing: this cannot be auto-approved."
}
],
"review_url": null,
"message": "Submission blocked by policy engine. Fix and resubmit."
}Tip for RevOps teams
Share the review_url in Slack so managers can approve outbound from their phone. No need to learn the full dashboard on day one.
3. Check send status (optional)
Developers can poll to learn when a queued message was actually sent. Most business users handle this in the approval queue instead.
curl https://api.datavibe.cc/v1/gate/outbound/gov_8f72c91a \
-H "Authorization: Bearer dv_live_YOUR_API_KEY"{
"action_id": "gov_8f72c91a",
"status": "SENT",
"sent_at": "2026-05-12T10:43:22Z",
"provider_message_id": "re_123abc456",
"reviewed_at": "2026-05-12T10:43:18Z"
}Status meanings
| Status | What it means |
|---|---|
QUEUED | Passed automated checks. Waiting for a person to approve. |
BLOCKED | Stopped at the gate. Fix the content and submit again. |
APPROVED | A reviewer said yes. Sending is in progress. |
SENT | Delivered successfully. |
FAILED | Approved, but the email provider could not send. Check error details. |
REJECTED | A reviewer declined it. Draft something new. |
4. List past submissions (optional)
Developers building a custom UI or CRM sync can fetch queued and historical messages:
curl "https://api.datavibe.cc/v1/gate/submissions?status=QUEUED&limit=20" \
-H "Authorization: Bearer dv_live_YOUR_API_KEY"Filter by status (QUEUED, SENT, etc.). Default page size is 50.
Python example (no SDK)
A minimal drop-in if your team prefers plain HTTP over the SDK:
import requests
def send_via_gate(recipient: str, subject: str, body_html: str, campaign_id: str | None = None):
"""Submit a draft to DataVibe instead of sending email directly."""
response = requests.post(
"https://api.datavibe.cc/v1/gate/outbound",
json={
"recipient": recipient,
"subject": subject,
"body_html": body_html,
"source_model": "gpt-4o",
"campaign_id": campaign_id,
},
headers={"Authorization": "Bearer dv_live_YOUR_API_KEY"},
timeout=10,
)
response.raise_for_status()
data = response.json()
if data["status"] == "BLOCKED":
raise ValueError(f"Blocked: {data['policy_violations']}")
print(f"Queued for review: {data['review_url']}")
return data["action_id"]What gets checked automatically
Every submission is scanned before it can send. Some issues block the message entirely; others flag it for a human reviewer but still allow queueing.
| Check | Severity | Why it matters |
|---|---|---|
| Competitor mentions | Review | AI may name rivals: sales should confirm tone. |
| Pricing & discounts | Block | Models often invent prices or promos. |
| Guarantees & refunds | Block | Creates legal exposure if untrue. |
| Spam-style phrases | Review | Hurts deliverability and brand trust. |
| Profanity | Block | Not appropriate for customer-facing mail. |
| ALL CAPS shouting | Review | Looks like spam to filters. |
| Too many !!! marks | Review | Same: reads as low-quality outreach. |
| Fake attachment claims | Block | Gate does not send attachments. |
| Missing unsubscribe | Review | CAN-SPAM / GDPR expectation. |
| Suspicious short links | Review | bit.ly-style links reduce trust. |
Need HIPAA, FINRA, GDPR, or industry-specific packs? Browse the Policy Library in the dashboard or start from the setup wizard.