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.

Base URLhttps://app.hauraform.com

Authentication

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.

auth-header.sh
curl -H "Authorization: Bearer your_api_key" \
  https://app.hauraform.com/api/v1/forms

HMAC Signature Verification

Verify webhook payloads with SHA-256 HMAC using the X-Signature header.

verify-hmac.ts
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

POST/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

NameTypeRequiredDescription
Content-Typestringrequiredapplication/x-www-form-urlencoded, multipart/form-data, or application/json
OriginstringoptionalRequired when allowed_origins is configured. Referer header is used as fallback
X-API-KeystringoptionalRequired when API key security is enabled on the form. Can also be passed as api_key query parameter
X-SignaturestringoptionalSHA-256 HMAC of the raw request body. Required when HMAC signature security is enabled on the form

Path Parameters

NameTypeRequiredDescription
endpointSlugstringrequiredThe form's public endpoint slug

Query Parameters

None

Request Body

NameTypeRequiredDescription
*anyrequiredForm field key-value pairs. Validated against form schema when enforcement is hybrid or strict
cf-turnstile-responsestringoptionalCloudflare Turnstile CAPTCHA token. Required when form uses Turnstile provider
g-recaptcha-responsestringoptionalGoogle reCAPTCHA token (v2 or v3). Required when form uses reCAPTCHA provider
h-captcha-responsestringoptionalhCaptcha token. Required when form uses hCaptcha provider
utm_sourcestringoptionalUTM source parameter (captured in submission meta)
utm_mediumstringoptionalUTM medium parameter (captured in submission meta)
utm_campaignstringoptionalUTM campaign parameter (captured in submission meta)

Response 201

response.json
{
  "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

form.html
<!-- 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

GET/api/v1/forms

List forms

List all forms in your organization with optional filtering and pagination.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

None

Query Parameters

NameTypeRequiredDescription
statusstringoptionalFilter by status: active | paused | archived
searchstringoptionalSearch by form name (max 255 chars)
per_pageintegeroptionalItems per page (default: 15, max: 100)

Request Body

None

Response 200

response.json
{
  "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

list-forms.sh
curl -X GET \
  "https://app.hauraform.com/api/v1/forms?status=active&per_page=25" \
  -H "Authorization: Bearer your_api_key"
POST/api/v1/forms

Create form

Create a new form with name, security settings, submission limits, and redirect URLs.

Headers

NameTypeRequiredDescription
Content-Typestringrequiredapplication/json
AuthorizationstringrequiredBearer your_api_key

Path Parameters

None

Query Parameters

None

Request Body

NameTypeRequiredDescription
namestringrequiredDisplay name for the form (max 255 chars)
descriptionstringoptionalForm description (max 5000 chars)
statusstringoptionalactive | paused | archived (default: active)
allowed_methodsstring[]optionalAllowed HTTP methods: GET, POST, PUT, PATCH
submission_limitintegeroptionalMaximum number of submissions (null for unlimited)
expires_atstringoptionalForm expiration date (ISO 8601, must be in the future)
success_redirect_urlstringoptionalURL to redirect after successful submission (max 2048 chars)
error_redirect_urlstringoptionalURL to redirect on submission error (max 2048 chars)
security_settingsobjectoptionalSecurity configuration including CAPTCHA provider, site key, and secret key
is_honeypot_enabledbooleanoptionalEnable honeypot spam protection (default: false)

Response 201

response.json
{
  "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

create-form.sh
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"
  }'
GET/api/v1/forms/{form}

Get form

Retrieve a single form by UUID with fields, submission count, and webhook count.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "data": {
    "id": "a1b2c3d4-...",
    "name": "Contact",
    "slug": "contact",
    "endpoint_slug": "sunny-meadow-42",
    "status": "active",
    "fields": []
  }
}

Code Examples

get-form.sh
curl -X GET \
  https://app.hauraform.com/api/v1/forms/a1b2c3d4-... \
  -H "Authorization: Bearer your_api_key"
PATCH/api/v1/forms/{form}

Update form

Update form name, description, status, security settings, or redirect URLs.

Headers

NameTypeRequiredDescription
Content-Typestringrequiredapplication/json
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "data": {
    "id": "a1b2c3d4-...",
    "name": "Contact Updated",
    "status": "active"
  }
}

Code Examples

update-form.sh
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"}'
DELETE/api/v1/forms/{form}

Delete form

Archive a form. Sets status to archived and stops accepting submissions.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

None

Request Body

None

Response 204

No response body

Code Examples

delete-form.sh
curl -X DELETE \
  https://app.hauraform.com/api/v1/forms/a1b2c3d4-... \
  -H "Authorization: Bearer your_api_key"

Submissions

GET/api/v1/forms/{form}/submissions

List submissions

Retrieve submissions with filtering by status, read state, spam flag, assignee, tags, and search. Supports pagination.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

NameTypeRequiredDescription
statusstringoptionalFilter by status: received | validated | rejected | processing | approved | follow_up | completed | archived
is_readbooleanoptionalFilter by read state
is_spambooleanoptionalFilter by spam flag
assigned_touuidoptionalFilter by assigned member UUID
tagstringoptionalFilter by tag (max 255 chars)
searchstringoptionalFull-text search across submission data (max 255 chars)
per_pageintegeroptionalItems per page (default: 15, max: 100)

Request Body

None

Response 200

response.json
{
  "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

list-submissions.sh
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"
GET/api/v1/forms/{form}/submissions/{submission}

Get submission

Retrieve a single submission by UUID with full data, meta, tags, and files.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID
submissionuuidrequiredSubmission UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "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

get-submission.sh
curl -X GET \
  https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../submissions/9f1a2b3c-... \
  -H "Authorization: Bearer your_api_key"
PATCH/api/v1/forms/{form}/submissions/{submission}

Update submission

Update submission tags, internal notes, assignment, read state, or spam flag.

Headers

NameTypeRequiredDescription
Content-Typestringrequiredapplication/json
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID
submissionuuidrequiredSubmission UUID

Query Parameters

None

Request Body

NameTypeRequiredDescription
tagsstring[]optionalArray of tags (max 255 chars each)
internal_notesstringoptionalInternal notes (max 5000 chars)
assigned_touuidoptionalMember UUID to assign the submission to
is_readbooleanoptionalMark as read or unread
is_spambooleanoptionalMark as spam or not spam

Response 200

response.json
{
  "data": {
    "id": "9f1a2b3c-...",
    "status": "received",
    "tags": [
      "vip",
      "urgent"
    ],
    "internal_notes": "Follow up next week",
    "is_read": true,
    "is_spam": false
  }
}

Code Examples

update-submission.sh
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
  }'
PATCH/api/v1/forms/{form}/submissions/{submission}/status

Update submission status

Transition a submission to a new lifecycle state. Only valid transitions are allowed (e.g. received → validated, validated → approved).

Headers

NameTypeRequiredDescription
Content-Typestringrequiredapplication/json
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID
submissionuuidrequiredSubmission UUID

Query Parameters

None

Request Body

NameTypeRequiredDescription
statusstringrequiredTarget status: received | validated | rejected | processing | approved | follow_up | completed | archived

Response 200

response.json
{
  "data": {
    "id": "9f1a2b3c-...",
    "status": "validated"
  }
}

Code Examples

update-status.sh
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"}'
GET/api/v1/forms/{form}/submissions/export

Export submissions

Stream export submissions as CSV, JSON, XLSX, or PDF. Supports filtering by status, spam flag, search, and date range.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

NameTypeRequiredDescription
formatstringrequiredExport format: csv | json | xlsx | pdf
statusstringoptionalFilter by status: received | validated | rejected | processing | approved | follow_up | completed | archived
is_spambooleanoptionalFilter by spam flag
searchstringoptionalFull-text search (max 255 chars)
date_fromstringoptionalStart date (ISO 8601)
date_tostringoptionalEnd date (ISO 8601, must be after or equal to date_from)

Request Body

None

Response 200

response.json
Binary stream (Content-Disposition: attachment)

Code Examples

export-submissions.sh
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.csv

Fields

GET/api/v1/forms/{form}/fields

List fields

List all fields for a form with types, validation rules, and sort order.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "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

list-fields.sh
curl -X GET \
  https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../fields \
  -H "Authorization: Bearer your_api_key"
POST/api/v1/forms/{form}/fields

Create field

Add a new field to a form with label, type, and validation rules.

Headers

NameTypeRequiredDescription
Content-Typestringrequiredapplication/json
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

None

Request Body

NameTypeRequiredDescription
namestringrequiredField name, used as key in submissions (unique per form, max 255 chars)
labelstringrequiredDisplay label (max 255 chars)
typestringoptionaltext | number | email | url | phone | date | boolean | file | select (default: text)
is_requiredbooleanoptionalWhether the field is required (default: false)
validation_rulesobjectoptionalCustom validation rules
error_messagesobjectoptionalCustom error messages for validation rules
sort_orderintegeroptionalDisplay order (default: 0)

Response 201

response.json
{
  "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

create-field.sh
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
  }'
GET/api/v1/fields/{field}

Get field

Retrieve a single field by UUID.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
fielduuidrequiredField UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "data": {
    "id": "f1e2d3c4-...",
    "name": "email",
    "label": "Email Address",
    "type": "email",
    "is_required": true
  }
}

Code Examples

get-field.sh
curl -X GET \
  https://app.hauraform.com/api/v1/fields/f1e2d3c4-... \
  -H "Authorization: Bearer your_api_key"
PATCH/api/v1/fields/{field}

Update field

Update a field's name, label, type, validation rules, or sort order.

Headers

NameTypeRequiredDescription
Content-Typestringrequiredapplication/json
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
fielduuidrequiredField UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "data": {
    "id": "f1e2d3c4-...",
    "name": "email",
    "label": "Work Email",
    "type": "email"
  }
}

Code Examples

update-field.sh
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}'
DELETE/api/v1/fields/{field}

Delete field

Remove a field from a form.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
fielduuidrequiredField UUID

Query Parameters

None

Request Body

None

Response 204

No response body

Code Examples

delete-field.sh
curl -X DELETE \
  https://app.hauraform.com/api/v1/fields/f1e2d3c4-... \
  -H "Authorization: Bearer your_api_key"

Webhooks

GET/api/v1/forms/{form}/webhooks

List webhooks

List all webhook subscriptions for a form.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "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

list-webhooks.sh
curl -X GET \
  https://app.hauraform.com/api/v1/forms/a1b2c3d4-.../webhooks \
  -H "Authorization: Bearer your_api_key"
POST/api/v1/forms/{form}/webhooks

Create webhook

Create a webhook subscription with URL, events, optional HMAC secret, conditional triggers, and retry configuration.

Headers

NameTypeRequiredDescription
Content-Typestringrequiredapplication/json
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

None

Request Body

NameTypeRequiredDescription
urlstringrequiredWebhook delivery URL (max 2048 chars)
secretstringoptionalHMAC signing secret for payload verification (max 255 chars)
eventsstring[]requiredEvent types to subscribe (min 1): submission.created
conditionsobjectoptionalConditional 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_activebooleanoptionalWhether the webhook is active (default: true)
max_retriesintegeroptionalMaximum retry attempts (default: 3, min: 0, max: 10)
retry_delay_secondsintegeroptionalDelay between retries in seconds (default: 60, min: 10, max: 3600)

Response 201

response.json
{
  "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

create-webhook.sh
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
  }'
GET/api/v1/webhooks/{webhook}

Get webhook

Retrieve a single webhook by UUID.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
webhookuuidrequiredWebhook UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "data": {
    "id": "w1x2y3z4-...",
    "url": "https://api.example.com/hook",
    "events": [
      "submission.created"
    ],
    "is_active": true
  }
}

Code Examples

get-webhook.sh
curl -X GET \
  https://app.hauraform.com/api/v1/webhooks/w1x2y3z4-... \
  -H "Authorization: Bearer your_api_key"
PATCH/api/v1/webhooks/{webhook}

Update webhook

Update webhook URL, events, secret, conditions, or retry configuration.

Headers

NameTypeRequiredDescription
Content-Typestringrequiredapplication/json
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
webhookuuidrequiredWebhook UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "data": {
    "id": "w1x2y3z4-...",
    "url": "https://api.example.com/hook-v2",
    "is_active": true,
    "max_retries": 5
  }
}

Code Examples

update-webhook.sh
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}'
DELETE/api/v1/webhooks/{webhook}

Delete webhook

Permanently delete a webhook subscription.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
webhookuuidrequiredWebhook UUID

Query Parameters

None

Request Body

None

Response 204

No response body

Code Examples

delete-webhook.sh
curl -X DELETE \
  https://app.hauraform.com/api/v1/webhooks/w1x2y3z4-... \
  -H "Authorization: Bearer your_api_key"
GET/api/v1/webhooks/{webhook}/deliveries

List deliveries

View webhook delivery history with payloads, response status codes, attempt counts, and timestamps.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
webhookuuidrequiredWebhook UUID

Query Parameters

None

Request Body

None

Response 200

response.json
{
  "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

list-deliveries.sh
curl -X GET \
  https://app.hauraform.com/api/v1/webhooks/w1x2y3z4-.../deliveries \
  -H "Authorization: Bearer your_api_key"

Analytics

GET/api/v1/analytics/overview

Overview analytics

Get organization-wide analytics: total forms, active forms, total submissions, unread count, and spam count.

Headers

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

None

Query Parameters

NameTypeRequiredDescription
start_datestringoptionalStart date (ISO 8601)
end_datestringoptionalEnd date (ISO 8601, must be after or equal to start_date)

Request Body

None

Response 200

response.json
{
  "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

analytics-overview.sh
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"
GET/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

NameTypeRequiredDescription
AuthorizationstringrequiredBearer your_api_key

Path Parameters

NameTypeRequiredDescription
formuuidrequiredForm UUID

Query Parameters

NameTypeRequiredDescription
start_datestringoptionalStart date (ISO 8601)
end_datestringoptionalEnd date (ISO 8601, must be after or equal to start_date)
group_bystringoptionalTime grouping: day | week | month (default: day)

Request Body

None

Response 200

response.json
{
  "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

analytics-form.sh
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.