API Reference
HauraForm API
A versioned RESTful API for managing forms, submissions, webhooks, and analytics. Authenticate with Bearer tokens, verify payloads with HMAC, and integrate with any stack.
https://app.hauraform.comAuthentication
All API endpoints (except public form submission) require authentication via an organization API key. Pass it as a Bearer token in the Authorization header.
Bearer Token
Pass your API key as a Bearer token in the Authorization header.
curl -H "Authorization: Bearer your_api_key" \
https://app.hauraform.com/api/v1/formsHMAC Signature Verification
Verify webhook payloads with SHA-256 HMAC using the X-Signature header.
import { createHmac, timingSafeEqual } from "crypto";
function verifyWebhook(
body: string,
signature: string,
secret: string
): boolean {
const expected = createHmac("sha256", secret)
.update(body)
.digest("hex");
return timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}Public Submission
/f/{endpointSlug}Submit form data
Submit form data to a public endpoint. Accepts application/x-www-form-urlencoded, multipart/form-data, or application/json. No authentication required by default. Submissions pass through a security pipeline in this order: origin validation, rate limiting (default 10 per minute per IP), IP blocking, honeypot detection, CAPTCHA verification, optional API key check, and HMAC signature verification. All security features are configured per-form via security_settings.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Content-Type | string | required | application/x-www-form-urlencoded, multipart/form-data, or application/json |
| Origin | string | optional | Required when allowed_origins is configured. Referer header is used as fallback |
| X-API-Key | string | optional | Required when API key security is enabled on the form. Can also be passed as api_key query parameter |
| X-Signature | string | optional | SHA-256 HMAC of the raw request body. Required when HMAC signature security is enabled on the form |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| endpointSlug | string | required | The form's public endpoint slug |
Query Parameters
None
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| * | any | required | Form field key-value pairs. Validated against form schema when enforcement is hybrid or strict |
| cf-turnstile-response | string | optional | Cloudflare Turnstile CAPTCHA token. Required when form uses Turnstile provider |
| g-recaptcha-response | string | optional | Google reCAPTCHA token (v2 or v3). Required when form uses reCAPTCHA provider |
| h-captcha-response | string | optional | hCaptcha token. Required when form uses hCaptcha provider |
| utm_source | string | optional | UTM source parameter (captured in submission meta) |
| utm_medium | string | optional | UTM medium parameter (captured in submission meta) |
| utm_campaign | string | optional | UTM campaign parameter (captured in submission meta) |
Response 201
{
"message": "Thank you! Your submission has been received.",
"data": {
"submission_id": "9f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c",
"redirect_url": "https://example.com/thank-you"
}
}Code Examples
<!-- Turnstile CAPTCHA: load the script and add the widget -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<form
method="POST"
action="https://app.hauraform.com/f/sunny-meadow-42"
>
<input name="name" required />
<input name="email" type="email" required />
<textarea name="message"></textarea>
<!-- Turnstile widget (renders the CAPTCHA challenge) -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAA..."></div>
<!-- For reCAPTCHA v2, use instead:
<div class="g-recaptcha" data-sitekey="6Lc..."></div>
-->
<!-- For hCaptcha, use instead:
<div class="h-captcha" data-sitekey="..."></div>
-->
<button type="submit">Send</button>
</form>Forms
/api/v1/formsList forms
List all forms in your organization with optional filtering and pagination.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
None
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | optional | Filter by status: active | paused | archived |
| search | string | optional | Search by form name (max 255 chars) |
| per_page | integer | optional | Items per page (default: 15, max: 100) |
Request Body
None
Response 200
{
"data": [
{
"id": "a1b2c3d4-...",
"name": "Contact",
"slug": "contact",
"endpoint_slug": "sunny-meadow-42",
"description": "Main contact form",
"status": "active",
"is_accepting_submissions": true,
"endpoint_url": "/f/sunny-meadow-42",
"submissions_count": 128,
"webhooks_count": 2,
"created_at": "2026-02-01T10:00:00Z",
"updated_at": "2026-02-22T10:00:00Z"
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1
}
}Code Examples
curl -X GET \
"https://app.hauraform.com/api/v1/forms?status=active&per_page=25" \
-H "Authorization: Bearer your_api_key"/api/v1/formsCreate form
Create a new form with name, security settings, submission limits, and redirect URLs.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Content-Type | string | required | application/json |
| Authorization | string | required | Bearer your_api_key |
Path Parameters
None
Query Parameters
None
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Display name for the form (max 255 chars) |
| description | string | optional | Form description (max 5000 chars) |
| status | string | optional | active | paused | archived (default: active) |
| allowed_methods | string[] | optional | Allowed HTTP methods: GET, POST, PUT, PATCH |
| submission_limit | integer | optional | Maximum number of submissions (null for unlimited) |
| expires_at | string | optional | Form expiration date (ISO 8601, must be in the future) |
| success_redirect_url | string | optional | URL to redirect after successful submission (max 2048 chars) |
| error_redirect_url | string | optional | URL to redirect on submission error (max 2048 chars) |
| security_settings | object | optional | Security configuration including CAPTCHA provider, site key, and secret key |
| is_honeypot_enabled | boolean | optional | Enable honeypot spam protection (default: false) |
Response 201
{
"data": {
"id": "a1b2c3d4-...",
"name": "Contact",
"slug": "contact",
"endpoint_slug": "sunny-meadow-42",
"description": null,
"status": "active",
"allowed_methods": null,
"submission_limit": null,
"expires_at": null,
"is_honeypot_enabled": false,
"is_accepting_submissions": true,
"endpoint_url": "/f/sunny-meadow-42",
"submissions_count": 0,
"webhooks_count": 0,
"created_at": "2026-02-22T10:00:00Z",
"updated_at": "2026-02-22T10:00:00Z"
}
}Code Examples
curl -X POST \
https://app.hauraform.com/api/v1/forms \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key" \
-d '{
"name": "Contact",
"description": "Main contact form",
"allowed_methods": ["POST"],
"is_honeypot_enabled": true,
"success_redirect_url": "https://example.com/thank-you"
}'/api/v1/forms/{form}Get form
Retrieve a single form by UUID with fields, submission count, and webhook count.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": {
"id": "a1b2c3d4-...",
"name": "Contact",
"slug": "contact",
"endpoint_slug": "sunny-meadow-42",
"status": "active",
"fields": []
}
}Code Examples
curl -X GET \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-... \
-H "Authorization: Bearer your_api_key"/api/v1/forms/{form}Update form
Update form name, description, status, security settings, or redirect URLs.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Content-Type | string | required | application/json |
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": {
"id": "a1b2c3d4-...",
"name": "Contact Updated",
"status": "active"
}
}Code Examples
curl -X PATCH \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-... \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key" \
-d '{"name": "Contact Updated", "status": "paused"}'/api/v1/forms/{form}Delete form
Archive a form. Sets status to archived and stops accepting submissions.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
None
Request Body
None
Response 204
No response body
Code Examples
curl -X DELETE \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-... \
-H "Authorization: Bearer your_api_key"Submissions
/api/v1/forms/{form}/submissionsList submissions
Retrieve submissions with filtering by status, read state, spam flag, assignee, tags, and search. Supports pagination.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | optional | Filter by status: received | validated | rejected | processing | approved | follow_up | completed | archived |
| is_read | boolean | optional | Filter by read state |
| is_spam | boolean | optional | Filter by spam flag |
| assigned_to | uuid | optional | Filter by assigned member UUID |
| tag | string | optional | Filter by tag (max 255 chars) |
| search | string | optional | Full-text search across submission data (max 255 chars) |
| per_page | integer | optional | Items per page (default: 15, max: 100) |
Request Body
None
Response 200
{
"data": [
{
"id": "9f1a2b3c-...",
"form_id": "a1b2c3d4-...",
"status": "received",
"data": {
"name": "Jane",
"email": "jane@co.com"
},
"meta": {
"ip": "203.0.113.1",
"user_agent": "Mozilla/5.0...",
"referer": "https://example.com",
"utm_source": "google"
},
"tags": null,
"internal_notes": null,
"assigned_to": null,
"is_read": false,
"is_spam": false,
"files": null,
"created_at": "2026-02-22T10:30:00Z",
"updated_at": "2026-02-22T10:30:00Z"
}
],
"meta": {
"current_page": 1,
"last_page": 3,
"total": 42
}
}Code Examples
curl -X GET \
"https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../submissions?status=received&is_read=false&per_page=25" \
-H "Authorization: Bearer your_api_key"/api/v1/forms/{form}/submissions/{submission}Get submission
Retrieve a single submission by UUID with full data, meta, tags, and files.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
| submission | uuid | required | Submission UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": {
"id": "9f1a2b3c-...",
"form_id": "a1b2c3d4-...",
"status": "received",
"data": {
"name": "Jane",
"email": "jane@co.com"
},
"meta": {
"ip": "203.0.113.1",
"user_agent": "Mozilla/5.0..."
},
"tags": [
"vip"
],
"internal_notes": null,
"is_read": false,
"is_spam": false
}
}Code Examples
curl -X GET \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../submissions/9f1a2b3c-... \
-H "Authorization: Bearer your_api_key"/api/v1/forms/{form}/submissions/{submission}Update submission
Update submission tags, internal notes, assignment, read state, or spam flag.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Content-Type | string | required | application/json |
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
| submission | uuid | required | Submission UUID |
Query Parameters
None
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| tags | string[] | optional | Array of tags (max 255 chars each) |
| internal_notes | string | optional | Internal notes (max 5000 chars) |
| assigned_to | uuid | optional | Member UUID to assign the submission to |
| is_read | boolean | optional | Mark as read or unread |
| is_spam | boolean | optional | Mark as spam or not spam |
Response 200
{
"data": {
"id": "9f1a2b3c-...",
"status": "received",
"tags": [
"vip",
"urgent"
],
"internal_notes": "Follow up next week",
"is_read": true,
"is_spam": false
}
}Code Examples
curl -X PATCH \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../submissions/9f1a2b3c-... \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key" \
-d '{
"tags": ["vip", "urgent"],
"internal_notes": "Follow up next week",
"is_read": true
}'/api/v1/forms/{form}/submissions/{submission}/statusUpdate submission status
Transition a submission to a new lifecycle state. Only valid transitions are allowed (e.g. received → validated, validated → approved).
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Content-Type | string | required | application/json |
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
| submission | uuid | required | Submission UUID |
Query Parameters
None
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | required | Target status: received | validated | rejected | processing | approved | follow_up | completed | archived |
Response 200
{
"data": {
"id": "9f1a2b3c-...",
"status": "validated"
}
}Code Examples
curl -X PATCH \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../submissions/9f1a2b3c-.../status \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key" \
-d '{"status": "validated"}'/api/v1/forms/{form}/submissions/exportExport submissions
Stream export submissions as CSV, JSON, XLSX, or PDF. Supports filtering by status, spam flag, search, and date range.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| format | string | required | Export format: csv | json | xlsx | pdf |
| status | string | optional | Filter by status: received | validated | rejected | processing | approved | follow_up | completed | archived |
| is_spam | boolean | optional | Filter by spam flag |
| search | string | optional | Full-text search (max 255 chars) |
| date_from | string | optional | Start date (ISO 8601) |
| date_to | string | optional | End date (ISO 8601, must be after or equal to date_from) |
Request Body
None
Response 200
Binary stream (Content-Disposition: attachment)Code Examples
curl -X GET \
"https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../submissions/export?format=csv&status=approved" \
-H "Authorization: Bearer your_api_key" \
-o submissions.csvFields
/api/v1/forms/{form}/fieldsList fields
List all fields for a form with types, validation rules, and sort order.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": [
{
"id": "f1e2d3c4-...",
"name": "email",
"label": "Email Address",
"type": "email",
"is_required": true,
"validation_rules": null,
"sort_order": 0,
"created_at": "2026-02-01T10:00:00Z",
"updated_at": "2026-02-01T10:00:00Z"
},
{
"id": "f5e6d7c8-...",
"name": "message",
"label": "Your Message",
"type": "text",
"is_required": false,
"validation_rules": null,
"sort_order": 1,
"created_at": "2026-02-01T10:00:00Z",
"updated_at": "2026-02-01T10:00:00Z"
}
]
}Code Examples
curl -X GET \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../fields \
-H "Authorization: Bearer your_api_key"/api/v1/forms/{form}/fieldsCreate field
Add a new field to a form with label, type, and validation rules.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Content-Type | string | required | application/json |
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
None
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | required | Field name, used as key in submissions (unique per form, max 255 chars) |
| label | string | required | Display label (max 255 chars) |
| type | string | optional | text | number | email | url | phone | date | boolean | file | select (default: text) |
| is_required | boolean | optional | Whether the field is required (default: false) |
| validation_rules | object | optional | Custom validation rules |
| error_messages | object | optional | Custom error messages for validation rules |
| sort_order | integer | optional | Display order (default: 0) |
Response 201
{
"data": {
"id": "f9a8b7c6-...",
"name": "phone",
"label": "Phone Number",
"type": "phone",
"is_required": true,
"validation_rules": null,
"error_messages": null,
"sort_order": 2,
"created_at": "2026-02-22T10:00:00Z",
"updated_at": "2026-02-22T10:00:00Z"
}
}Code Examples
curl -X POST \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../fields \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key" \
-d '{
"name": "phone",
"label": "Phone Number",
"type": "phone",
"is_required": true,
"sort_order": 2
}'/api/v1/fields/{field}Get field
Retrieve a single field by UUID.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| field | uuid | required | Field UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": {
"id": "f1e2d3c4-...",
"name": "email",
"label": "Email Address",
"type": "email",
"is_required": true
}
}Code Examples
curl -X GET \
https://app.hauraform.com/api/v1/fields/f1e2d3c4-... \
-H "Authorization: Bearer your_api_key"/api/v1/fields/{field}Update field
Update a field's name, label, type, validation rules, or sort order.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Content-Type | string | required | application/json |
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| field | uuid | required | Field UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": {
"id": "f1e2d3c4-...",
"name": "email",
"label": "Work Email",
"type": "email"
}
}Code Examples
curl -X PATCH \
https://app.hauraform.com/api/v1/fields/f1e2d3c4-... \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key" \
-d '{"label": "Work Email", "is_required": true}'/api/v1/fields/{field}Delete field
Remove a field from a form.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| field | uuid | required | Field UUID |
Query Parameters
None
Request Body
None
Response 204
No response body
Code Examples
curl -X DELETE \
https://app.hauraform.com/api/v1/fields/f1e2d3c4-... \
-H "Authorization: Bearer your_api_key"Webhooks
/api/v1/forms/{form}/webhooksList webhooks
List all webhook subscriptions for a form.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": [
{
"id": "w1x2y3z4-...",
"form_id": "a1b2c3d4-...",
"url": "https://api.example.com/hook",
"events": [
"submission.created"
],
"is_active": true,
"max_retries": 3,
"retry_delay_seconds": 60,
"deliveries_count": 42,
"created_at": "2026-02-01T10:00:00Z",
"updated_at": "2026-02-01T10:00:00Z"
}
]
}Code Examples
curl -X GET \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../webhooks \
-H "Authorization: Bearer your_api_key"/api/v1/forms/{form}/webhooksCreate webhook
Create a webhook subscription with URL, events, optional HMAC secret, conditional triggers, and retry configuration.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Content-Type | string | required | application/json |
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
None
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | required | Webhook delivery URL (max 2048 chars) |
| secret | string | optional | HMAC signing secret for payload verification (max 255 chars) |
| events | string[] | required | Event types to subscribe (min 1): submission.created |
| conditions | object | optional | Conditional trigger rules. Operators: and | or. Rule operators: equals, not_equals, contains, not_contains, starts_with, ends_with, greater_than, less_than, is_empty, is_not_empty |
| is_active | boolean | optional | Whether the webhook is active (default: true) |
| max_retries | integer | optional | Maximum retry attempts (default: 3, min: 0, max: 10) |
| retry_delay_seconds | integer | optional | Delay between retries in seconds (default: 60, min: 10, max: 3600) |
Response 201
{
"data": {
"id": "w1x2y3z4-...",
"form_id": "a1b2c3d4-...",
"url": "https://api.example.com/hook",
"events": [
"submission.created"
],
"is_active": true,
"max_retries": 3,
"retry_delay_seconds": 60,
"deliveries_count": 0,
"created_at": "2026-02-22T10:00:00Z",
"updated_at": "2026-02-22T10:00:00Z"
}
}Code Examples
curl -X POST \
https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../webhooks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key" \
-d '{
"url": "https://api.example.com/hook",
"secret": "whsec_abc123",
"events": ["submission.created"],
"conditions": {
"operator": "and",
"rules": [{
"field": "plan",
"operator": "equals",
"value": "enterprise"
}]
},
"is_active": true,
"max_retries": 5,
"retry_delay_seconds": 120
}'/api/v1/webhooks/{webhook}Get webhook
Retrieve a single webhook by UUID.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| webhook | uuid | required | Webhook UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": {
"id": "w1x2y3z4-...",
"url": "https://api.example.com/hook",
"events": [
"submission.created"
],
"is_active": true
}
}Code Examples
curl -X GET \
https://app.hauraform.com/api/v1/webhooks/w1x2y3z4-... \
-H "Authorization: Bearer your_api_key"/api/v1/webhooks/{webhook}Update webhook
Update webhook URL, events, secret, conditions, or retry configuration.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Content-Type | string | required | application/json |
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| webhook | uuid | required | Webhook UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": {
"id": "w1x2y3z4-...",
"url": "https://api.example.com/hook-v2",
"is_active": true,
"max_retries": 5
}
}Code Examples
curl -X PATCH \
https://app.hauraform.com/api/v1/webhooks/w1x2y3z4-... \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key" \
-d '{"url": "https://api.example.com/hook-v2", "max_retries": 5}'/api/v1/webhooks/{webhook}Delete webhook
Permanently delete a webhook subscription.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| webhook | uuid | required | Webhook UUID |
Query Parameters
None
Request Body
None
Response 204
No response body
Code Examples
curl -X DELETE \
https://app.hauraform.com/api/v1/webhooks/w1x2y3z4-... \
-H "Authorization: Bearer your_api_key"/api/v1/webhooks/{webhook}/deliveriesList deliveries
View webhook delivery history with payloads, response status codes, attempt counts, and timestamps.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| webhook | uuid | required | Webhook UUID |
Query Parameters
None
Request Body
None
Response 200
{
"data": [
{
"id": "d1e2f3a4-...",
"form_webhook_id": "w1x2y3z4-...",
"submission_id": "9f1a2b3c-...",
"status": "success",
"event": "submission.created",
"response_status_code": 200,
"attempt": 1,
"next_retry_at": null,
"completed_at": "2026-02-22T10:31:00Z",
"created_at": "2026-02-22T10:30:05Z"
}
]
}Code Examples
curl -X GET \
https://app.hauraform.com/api/v1/webhooks/w1x2y3z4-.../deliveries \
-H "Authorization: Bearer your_api_key"Analytics
/api/v1/analytics/overviewOverview analytics
Get organization-wide analytics: total forms, active forms, total submissions, unread count, and spam count.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
None
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| start_date | string | optional | Start date (ISO 8601) |
| end_date | string | optional | End date (ISO 8601, must be after or equal to start_date) |
Request Body
None
Response 200
{
"data": {
"total_forms": 12,
"active_forms": 8,
"total_submissions": 1284,
"unread_submissions": 42,
"spam_submissions": 3,
"period": {
"start": "2026-02-01T00:00:00Z",
"end": "2026-02-22T23:59:59Z"
}
}
}Code Examples
curl -X GET \
"https://app.hauraform.com/api/v1/analytics/overview?start_date=2026-02-01&end_date=2026-02-22" \
-H "Authorization: Bearer your_api_key"/api/v1/analytics/forms/{form}Form analytics
Get form-specific analytics with submission count, status breakdown, and time-series data grouped by day, week, or month.
Headers
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | string | required | Bearer your_api_key |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| form | uuid | required | Form UUID |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| start_date | string | optional | Start date (ISO 8601) |
| end_date | string | optional | End date (ISO 8601, must be after or equal to start_date) |
| group_by | string | optional | Time grouping: day | week | month (default: day) |
Request Body
None
Response 200
{
"data": {
"form_id": "a1b2c3d4-...",
"form_name": "Contact",
"total_submissions": 128,
"status_breakdown": {
"received": 12,
"validated": 30,
"approved": 60,
"completed": 20,
"rejected": 4,
"archived": 2
},
"submissions_over_time": {
"2026-02-20": 5,
"2026-02-21": 8,
"2026-02-22": 3
},
"period": {
"start": "2026-02-01T00:00:00Z",
"end": "2026-02-22T23:59:59Z",
"group_by": "day"
}
}
}Code Examples
curl -X GET \
"https://app.hauraform.com/api/v1/analytics/forms/a1b2c3d4-...?start_date=2026-02-01&group_by=day" \
-H "Authorization: Bearer your_api_key"Coming Soon
Interactive API explorer
We're building an interactive API explorer with request builders, response schemas, and SDKs. Join the waitlist to get early access.