API Documentation

Build and manage forms programmatically with the BionicForms REST API.

Base URL https://bionicforms.com/api/v1

The API is RESTful, accepts and returns JSON, and uses standard HTTP methods. All requests must include a Bearer token for authentication.

Authentication

All API requests (except registration) require a Bearer token in the Authorization header. You can get an API key by registering via the API or from your dashboard settings.

Free plan included: All plans include API access. Free plan: 15 req/min, unlimited forms. Standard: 60 req/min. Pro: 120 req/min.
Email verification required: New accounts start in a sandbox with 10 requests/min and 5 forms max. Verify your email (check your inbox after registering) to unlock full plan limits.
Example Request
curl https://bionicforms.com/api/v1/forms \ -H "Authorization: Bearer YOUR_API_KEY"

Registration

Create an account and get an API key in a single request. No human interaction required.

POST /api/v1/register

Create Account

Creates a new account with workspace and returns an API key. This endpoint is public and does not require authentication. Rate limited to 3 requests per hour per IP.

Body Parameters
FieldTypeDescription
emailstring (required)Account email address
passwordstring (required)Account password (min 8 characters)
namestringDisplay name (optional)
Request
curl -X POST https://bionicforms.com/api/v1/register \
  -H "Content-Type: application/json" \
  -d '{"email": "agent@example.com", "password": "securepass123", "name": "My Agent"}'
Save your API key! The api_key is only returned once. Store it securely. If lost, log in at bionicforms.com to create a new one.

Email Verification

New accounts start in a sandbox with reduced limits (10 requests/min, max 5 forms). Verify your email to unlock your plan's full limits. A verification email is sent automatically on registration.

How it works: Check your inbox for a verification link after registering. Click it to verify. Use the endpoints below to check status or request a new email.
GET /api/v1/verify-email/status

Check verification status

Returns whether the account's email has been verified. Requires Bearer token authentication.

Request
curl https://bionicforms.com/api/v1/verify-email/status \
  -H "Authorization: Bearer YOUR_API_KEY"
POST /api/v1/verify-email/resend

Resend verification email

Sends a new verification email. Rate limited to 3 requests per hour. If already verified, returns success with email_verified: true.

Request
curl -X POST https://bionicforms.com/api/v1/verify-email/resend \
  -H "Authorization: Bearer YOUR_API_KEY"

Sandbox Limits (Unverified)

ResourceUnverifiedVerified
Rate limit10 req/minPlan limit (15–120 req/min)
Max forms5Unlimited

Response Format

All responses are wrapped in a standard JSON envelope.

Success Response

{ "data": { ... }, "meta": { "page": 1, "per_page": 50, "total_count": 100, "has_more": true } }

The meta field is only present on list endpoints.

Error Response

{ "error": { "code": "not_found", "message": "Form not found", "details": [] } }

The details field is only present for validation errors.

Error Codes

StatusCode
400bad_request
401unauthorized
401invalid_api_key
402insufficient_credits
403plan_required
404not_found
409conflict
409email_taken
422validation_error
429rate_limited
500internal_error

Rate Limiting

API requests are rate-limited per API key on a per-minute sliding window. Limits vary by plan and verification status.

Unverified accounts: Limited to 10 requests/min regardless of plan. Verify your email to unlock full rate limits.
Standard

60 req/min

Pro

120 req/min

Response Headers

X-RateLimit-LimitMaximum requests per minute
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when the window resets
Retry-AfterSeconds to wait (only present on 429 responses)
X-Email-VerifiedWhether account email is verified (true/false)

Forms

Create, read, update, and delete forms. Manage form fields and publish forms for public submissions.

GET /api/v1/forms

List all forms

Returns all forms in your workspace.

Request
curl https://bionicforms.com/api/v1/forms \
  -H "Authorization: Bearer YOUR_API_KEY"
POST /api/v1/forms

Create a form

Creates a new draft form. Optionally include fields to set up the form schema immediately.

Request
curl -X POST https://bionicforms.com/api/v1/forms \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Customer Feedback",
    "description": "Quick feedback survey",
    "fields": [
      {
        "type": "email",
        "label": "Your Email",
        "required": true
      },
      {
        "type": "rating",
        "label": "How satisfied are you?",
        "required": true,
        "properties": { "max_rating": 5, "icon": "star" }
      },
      {
        "type": "textarea",
        "label": "Comments",
        "properties": { "placeholder": "Tell us more..." }
      }
    ]
  }'
GET /api/v1/forms/{formID}

Get a form

Returns a single form with its current field schema.

Request
curl https://bionicforms.com/api/v1/forms/FORM_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
PUT /api/v1/forms/{formID}

Update a form

Updates the form title and/or description. Does not affect fields.

Request
curl -X PUT https://bionicforms.com/api/v1/forms/FORM_ID \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Updated Title", "description": "New description" }'
DELETE /api/v1/forms/{formID}

Delete a form

Permanently deletes a form and all its responses.

Request
curl -X DELETE https://bionicforms.com/api/v1/forms/FORM_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
PUT /api/v1/forms/{formID}/schema

Update form fields

Replaces the form's field schema. See Field Types for supported types.

Request
curl -X PUT https://bionicforms.com/api/v1/forms/FORM_ID/schema \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "fields": [
      { "type": "text", "label": "Full Name", "required": true },
      { "type": "email", "label": "Email", "required": true },
      {
        "type": "dropdown",
        "label": "Department",
        "properties": {
          "options": ["Engineering", "Design", "Marketing", "Sales"]
        }
      }
    ]
  }'
POST /api/v1/forms/{formID}/publish

Publish a form

Creates a published version so respondents can submit. The form must have at least one field.

Request
curl -X POST https://bionicforms.com/api/v1/forms/FORM_ID/publish \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Responses

Read and manage form submissions. Responses are paginated with a maximum of 100 per page.

GET /api/v1/forms/{formID}/responses

List responses

Returns paginated form submissions. Use query parameters for pagination and search.

Parameters
NameInDescription
pagequeryPage number (default: 1)
per_pagequeryItems per page (default: 50, max: 100)
searchqueryFilter responses by text content
Request
curl "https://bionicforms.com/api/v1/forms/FORM_ID/responses?page=1&per_page=20" \
  -H "Authorization: Bearer YOUR_API_KEY"
GET /api/v1/forms/{formID}/responses/{responseID}

Get a response

Returns a single form submission by ID.

Request
curl https://bionicforms.com/api/v1/forms/FORM_ID/responses/RESPONSE_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
DELETE /api/v1/forms/{formID}/responses/{responseID}

Delete a response

Permanently deletes a single form submission.

Request
curl -X DELETE https://bionicforms.com/api/v1/forms/FORM_ID/responses/RESPONSE_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Analysis

Trigger AI-powered analysis of form responses. Includes sentiment analysis, theme extraction, urgency detection, and natural language querying.

Credits: Analysis operations consume AI credits. Triggering analysis costs credits based on response count. Natural language queries cost 1 credit each.
POST /api/v1/forms/{formID}/analysis

Trigger analysis

Starts an AI analysis run on the form's responses. Requires at least 5 responses and a Standard or Pro plan.

Request
curl -X POST https://bionicforms.com/api/v1/forms/FORM_ID/analysis \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
GET /api/v1/forms/{formID}/analysis

Get analysis results

Returns the latest analysis results including sentiment, themes, urgency, and quantitative data. All data is fetched in parallel for fast responses.

Request
curl https://bionicforms.com/api/v1/forms/FORM_ID/analysis \
  -H "Authorization: Bearer YOUR_API_KEY"
POST /api/v1/forms/{formID}/analysis/query

Query with natural language

Ask a question about your form responses in plain English. Requires a prior analysis run. Costs 1 credit per query.

Request
curl -X POST https://bionicforms.com/api/v1/forms/FORM_ID/analysis/query \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "What are the top 3 pain points?" }'

Webhooks

Manage webhook endpoints to receive real-time notifications when forms are submitted. Webhooks can be filtered to specific forms.

GET /api/v1/webhooks

List webhooks

Returns all webhooks configured for your workspace.

Request
curl https://bionicforms.com/api/v1/webhooks \
  -H "Authorization: Bearer YOUR_API_KEY"
POST /api/v1/webhooks

Create a webhook

Registers a new webhook endpoint. Optionally filter to specific form IDs.

Request
curl -X POST https://bionicforms.com/api/v1/webhooks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/webhook",
    "description": "Production notifications",
    "form_ids": ["FORM_ID_1", "FORM_ID_2"]
  }'
PUT /api/v1/webhooks/{id}

Update a webhook

Updates webhook properties. Only include fields you want to change.

Request
curl -X PUT https://bionicforms.com/api/v1/webhooks/WEBHOOK_ID \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://new-url.com/hook", "is_active": false }'
DELETE /api/v1/webhooks/{id}

Delete a webhook

Permanently removes a webhook. It will no longer receive notifications.

Request
curl -X DELETE https://bionicforms.com/api/v1/webhooks/WEBHOOK_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Account

Retrieve workspace information, current plan, and credit balance.

GET /api/v1/account

Get account info

Returns your workspace details, billing plan, and remaining AI credits.

Request
curl https://bionicforms.com/api/v1/account \
  -H "Authorization: Bearer YOUR_API_KEY"

Field Object

Each field in the fields array (used by Create Form and Update Schema) follows this structure:

{ "type": "text", "key": "full_name", "label": "Your Name", "required": true, "description": "Enter your full legal name", "properties": { "placeholder": "Jane Smith" }, "validation": { "min_length": 2, "max_length": 100 } }
KeyTypeDescription
typestringField type identifier (see Field Types below)
keystringCustom field key for response data. Auto-generated from label if omitted (e.g. "Email Address" → email_address). Must be lowercase alphanumeric/underscores, start with a letter, max 64 chars.
labelstringDisplay label shown to the respondent
requiredbooleanWhether the field must be filled in (default: false)
descriptionstringHelper text displayed below the field label
propertiesobjectType-specific configuration (see each type below for available keys)
validationobjectValidation rules (see Validation below)

Field Types

The 15 supported field types, grouped by category. Each shows the available properties and a complete JSON example you can copy directly into your API requests.

Text Inputs

text Short text input

Single-line text field for names, addresses, and other short values.

PropertyTypeDefault
placeholderstring—
Example
{ "type": "text", "label": "Full Name", "required": true, "properties": { "placeholder": "Jane Smith" } }
email Email address

Validates email format automatically (e.g. user@example.com).

PropertyTypeDefault
placeholderstring—
Example
{ "type": "email", "label": "Email Address", "required": true }
phone Phone number

Free-form phone input.

PropertyTypeDefault
placeholderstring—
Example
{ "type": "phone", "label": "Phone Number" }
url URL input

Accepts web addresses.

PropertyTypeDefault
placeholderstring—
Example
{ "type": "url", "label": "Website", "properties": { "placeholder": "https://example.com" } }
number Numeric input

Accepts numbers. Supports min/max validation.

PropertyTypeDefault
placeholderstring—
Example
{ "type": "number", "label": "Age", "required": true, "validation": { "min": 0, "max": 150 } }
date Date picker

Calendar-style date input (YYYY-MM-DD).

PropertyTypeDefault
placeholderstring—
Example
{ "type": "date", "label": "Start Date", "required": true }
textarea Long text area

Multi-line text input for comments, feedback, and long-form answers.

PropertyTypeDefault
placeholderstring—
rowsinteger4
Example
{ "type": "textarea", "label": "Comments", "properties": { "placeholder": "Tell us more...", "rows": 6 } }

Choice Fields

Options format: The options property accepts two formats:
  • Simple strings: ["Yes", "No", "Maybe"] — the label and submitted value are the same
  • Label/value objects: [{"label": "Yes", "value": "y"}, {"label": "No", "value": "n"}] — display label differs from submitted value
dropdown Select dropdown

Single-select dropdown menu. Respondent picks one option from a list.

PropertyTypeDefault
optionsarray—
placeholderstring—
allow_otherbooleanfalse
Example
{
  "type": "dropdown",
  "label": "Department",
  "required": true,
  "properties": {
    "options": ["Engineering", "Design", "Marketing", "Sales"],
    "placeholder": "Select department..."
  }
}
radio Radio buttons

Single-select radio group. Respondent picks one option.

PropertyTypeDefault
optionsarray—
allow_otherbooleanfalse
Example
{
  "type": "radio",
  "label": "How did you hear about us?",
  "properties": {
    "options": ["Search engine", "Social media", "Friend", "Advertisement"],
    "allow_other": true
  }
}
checkbox Checkboxes (multi-select)

Multi-select checkbox group. Respondent can pick multiple options.

PropertyTypeDefault
optionsarray—
allow_otherbooleanfalse
Example
{
  "type": "checkbox",
  "label": "Which features do you use?",
  "properties": {
    "options": ["Forms", "Analytics", "Webhooks", "API"]
  }
}

Rating & Scale

rating Star/emoji rating

Visual rating scale (e.g. 1-5 stars). Respondent clicks to rate.

PropertyTypeDefault
max_ratinginteger5
iconstring"star"
Example
{
  "type": "rating",
  "label": "How satisfied are you?",
  "required": true,
  "properties": { "max_rating": 5, "icon": "star" }
}
nps Net Promoter Score (0-10)

Standard NPS scale from 0 (Not likely) to 10 (Very likely).

PropertyTypeDefault
low_labelstring"Not likely"
high_labelstring"Very likely"
Example
{
  "type": "nps",
  "label": "How likely are you to recommend us?",
  "required": true,
  "properties": { "low_label": "Not at all likely", "high_label": "Extremely likely" }
}
slider Numeric slider

Draggable slider for picking a value within a range.

PropertyTypeDefault
minnumber0
maxnumber100
stepnumber1
Example
{
  "type": "slider",
  "label": "Budget (USD)",
  "properties": { "min": 0, "max": 10000, "step": 500 }
}

Other

file File upload

Allows respondents to upload files (images, PDFs, documents).

PropertyTypeDefault
max_filesinteger1
Example
{ "type": "file", "label": "Upload Resume", "properties": { "max_files": 1 } }
signature Signature pad

Canvas-based signature capture. No configurable properties.

Example
{ "type": "signature", "label": "Your Signature", "required": true }

Validation

Use the validation object on any field to enforce constraints. If a respondent submits data that violates a rule, they see an error message and must correct it.

KeyTypeApplies to
min_lengthintegertext, textarea
max_lengthintegertext, textarea
patternstringtext
minnumbernumber
maxnumbernumber

Example with validation

{ "type": "text", "label": "Username", "required": true, "properties": { "placeholder": "e.g. jane_doe" }, "validation": { "min_length": 3, "max_length": 30, "pattern": "^[a-zA-Z0-9_]+$" } }

Validation is enforced at submission time. If a field fails validation, the respondent sees an error message and the submission is rejected.