API Documentation
Base URL: https://siftforms.com/api/v1
Authentication
Include your API key in the Authorization header:
Authorization: Bearer iq_live_xxxxxxxxxxxxx
Key types:
iq_pub_— Public keys for widget embedding. Can only call extract + confirm.iq_live_— Secret keys for API access. Full access to all endpoints.
POST /extract
Text ExtractionExtract structured data from plain text.
curl -X POST https://siftforms.com/api/v1/extract \
-H "Authorization: Bearer iq_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"text": "Hi, I\'m Sarah Chen, email sarah@gmail.com. I have a billing issue with account AC-2847.",
"schema_id": "your-schema-uuid"
}'Response
{
"submission_id": "uuid",
"status": "completed",
"fields": {
"customer_name": { "value": "Sarah Chen", "confidence": 0.98 },
"email": { "value": "sarah@gmail.com", "confidence": 0.99 },
"account_id": { "value": "AC-2847", "confidence": 0.95 },
"issue_type": { "value": "Billing", "confidence": 0.92 }
},
"extras": {
"sentiment": "frustrated"
},
"missing_required": [],
"overall_confidence": 0.96,
"warnings": []
}POST /extract/file
File ExtractionUpload an image or PDF. Sift extracts text via AI vision, then maps to your schema.
curl -X POST https://siftforms.com/api/v1/extract/file \ -H "Authorization: Bearer iq_live_xxx" \ -F "file=@receipt.jpg" \ -F "schema_id=your-schema-uuid"
Accepted: JPEG, PNG, GIF, WebP, PDF. Max 10MB.
POST /submissions/confirm
Follow-upComplete a pending submission by providing missing required fields.
curl -X POST https://siftforms.com/api/v1/submissions/confirm \
-H "Authorization: Bearer iq_pub_xxx" \
-H "Content-Type: application/json" \
-d '{
"submission_id": "uuid",
"fields": { "email": "sarah@gmail.com" }
}'GET /submissions
ListList submissions with optional filters.
GET /submissions?schema_id=uuid&status=completed&from=2024-01-01&page=1&limit=50
Requires a iq_live_ key.
GET /submissions/:id
DetailGet full submission detail including extracted data, extras, and warnings.
Requires a iq_live_ key.
Webhooks
Configure webhooks in the dashboard. Payloads are signed with HMAC-SHA256.
// Verify signature
const crypto = require('crypto');
const signature = crypto
.createHmac('sha256', webhookSecret)
.update(rawBody)
.digest('hex');
const isValid = signature === headers['x-sift-signature'];Retries: 0s, 30s, 2min, 10min, 1hr. Auto-disables after 10 consecutive failures.