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

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/conversations/:idGet full conversation (transcript + Echo)
GET/usageCredit balance + usage stats

POST /pulses — Request Body

FieldTypeDescription
intention*stringWhat the AI should learn from the respondent
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)
allowResearchbooleanAI web research during conversation, 2x credits (default: false)

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