unformal/Docs

Unformal API

Create and manage conversational Pulses programmatically. Send someone a link, an AI agent has the conversation, you get structured insights back.

Authentication

Most requests require an API key. Get one instantly via the signup endpoint, or create one at Studio → Settings.

Authorization: Bearer unf_YOUR_API_KEY

AI Agent Setup

Install the Unformal skill so your AI agent can create Pulses with a single command:

# Install the Unformal skill for Claude Code

mkdir -p ~/.claude/skills/unformal && curl -s https://unformal.ai/SKILL.md > ~/.claude/skills/unformal/SKILL.md

After install, just say: “Create an onboarding Pulse for my consulting business”

Full integration guide →

CLI

Every API endpoint is exposed as a subcommand in @unformal/cli. Great for shell scripts, CI, quick ops, and piping to other agents via --json.

# Install globally

npm i -g @unformal/cli

# Or run without installing

npx @unformal/cli <command>

# Authenticate

unformal init --key unf_YOUR_KEY

# Examples

unformal create --intention "Qualify leads"

unformal list

unformal conversations PULSE_ID

unformal resonance PULSE_ID

unformal export PULSE_ID --format csv --output all.csv

Source and full command list: github.com/Spark-Collective/unformal-skills/cli →

Agent Signup — No Browser Required

One API call to create an account, get an API key, and start creating Pulses. No login flow needed.

# Create account + get API key

curl -X POST "https://unformal.ai/api/v1/signup" \

-H "Content-Type: application/json" \

-d '{"email": "agent@company.com"}'

# Response:

{ "data": { "api_key": "unf_xxx...", "workspace_id": "...", "email": "agent@company.com", "credits": 50 } }

The API key is shown once. Store it securely. No authentication required for this endpoint.

Base URL

https://unformal.ai/api/v1

Quick Start

Create a Pulse and get a shareable link in one call:

# Create a Pulse

curl -X POST "https://unformal.ai/api/v1/pulses" \

-H "Authorization: Bearer unf_YOUR_KEY" \

-H "Content-Type: application/json" \

-d '{"intention": "Understand what a new client needs before our first meeting"}'

# Response:

{ "data": { "id": "...", "url": "https://unformal.ai/p/your-slug", "status": "active" } }

Endpoints

POST/signupCreate account + get API key (no auth required)
POST/pulsesCreate a Pulse (auto-generates AI interview config, auto-publishes)
GET/pulsesList all Pulses for your workspace
GET/pulses/:idGet Pulse details + config
PATCH/pulses/:idUpdate Pulse configuration
DELETE/pulses/:idArchive a Pulse
POST/pulses/:id/publishPublish a draft Pulse
GET/pulses/:id/conversationsList conversations for a Pulse
GET/pulses/:id/exportExport conversations as CSV or JSON
GET/conversations/:idGet full conversation (transcript + Echo)
GET/pulses/:id/streamSSE real-time stream — get notified when conversations complete
GET/usageCredit balance + usage stats

POST /pulses — Request Body

FieldTypeDescription
intention*stringWhat the AI should learn from the respondent
slugstringCustom URL slug (lowercase, numbers, hyphens, 2-80 chars). If omitted, auto-generated from intention.
contextstringBackground info for the AI (not shown to respondent)
modestringinterview (default) — guided Q&A, one question at a time. extract — brain dump first, then fill gaps.
tonestringconversational (default), formal, coaching, casual, custom
maxDurationMinnumberMax duration in minutes: 2, 5, 10, 15 (default: 5)
maxQuestionsnumberMax questions: 3, 5, 8, 12, 20 (default: 8)
linkTypestringmulti (default) or single (one response only)
modelstringclaude-sonnet (default), gpt-4o, gemini
welcomeTitlestringCustom title on the welcome screen before conversation starts
welcomeDescriptionstringCustom description on the welcome screen
webhookUrlstringURL to POST Echo data when conversation completes
notifyEmailstringEmail to notify on completion
dictationEnabledbooleanAllow voice dictation (default: true)
showInsightsbooleanShow respondent insights on completion (default: false)
insightExchangebooleanInsight Exchange — respondents see anonymized group insights after completing (default: false)
allowResearchbooleanAI web research during conversation, 2x credits (default: false)
personastringCustom AI personality/voice. The AI adopts this character during conversations.
outputFieldsarrayCustom extraction fields: [{name, type, description}]. Types: string, number, boolean, array. Auto-generated if omitted.
topicsarrayTheme guidance for the AI (array of strings)
completionPrioritystringbalanced (default), coverage (thorough, 90%+ fields), speed (closes at maxQuestions)
completionRedirectstringCustom redirect URL after conversation completion
themeModestringsystem (default), light, dark — conversation UI theme

Modes

🎙️ Interview (default)

Guided conversation. The AI asks one question at a time, adapting follow-ups based on responses. Best for structured discovery, qualifications, and deep-dive interviews.

🗒️ Extract

Brain dump first. The respondent writes everything they want to say upfront. The AI then asks only about what's missing from the output fields. Best for intake forms, bug reports, and data collection where the respondent already knows what to share.

Output Fields — Structured Data Extraction

Output fields define the structured data the AI extracts from conversations. They're auto-generated from your intention, but you can customize them. This is the key to getting consistent, structured data from every conversation.

"outputFields": [ { "name": "budget_range", "type": "string", "description": "Estimated budget" }, { "name": "timeline", "type": "string", "description": "Expected start date" }, { "name": "pain_points", "type": "array", "description": "Top challenges" } ]

Echo — Structured Output

When a conversation completes, the AI extracts structured data (Echo) from the transcript:

{ "echo": { "fields": { "budget_range": "$50k-100k", "timeline": "Q3 2026", "current_tools": ["Salesforce", "HubSpot"] }, "summary": "Strong fit. Budget aligned, timeline Q3.", "keyQuotes": ["We spend 3 hours daily on data entry"], "subtext": "Enthusiastic but hesitant about buy-in.", "sentimentScore": 7 } }

Webhooks

Set webhookUrl on a Pulse to receive Echo data on completion:

{ "event": "conversation.completed", "conversationId": "conv_123", "pulseId": "pls_456", "echo": { ... }, "completedAt": "2026-03-29T10:00:00Z" }

Signed with X-Unformal-Signature (HMAC-SHA256).

Errors

{ "error": { "code": "NOT_FOUND", "message": "Pulse not found" } }
401 UNAUTHORIZED
Invalid or missing API key
402 OUT_OF_CREDITS
No credits remaining
404 NOT_FOUND
Resource not found
400 VALIDATION_ERROR
Invalid request body

Integrate with AI Agents

Drop a skill file into your project or install via ClawHub. Your AI assistant creates Pulses and gets structured data back.

Integration guide →