API Documentation
Build and manage forms programmatically with the BionicForms REST API.
https://bionicforms.com/api/v1The 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.
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.
/api/v1/registerCreate 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.
| Field | Type | Description |
|---|---|---|
email | string (required) | Account email address |
password | string (required) | Account password (min 8 characters) |
name | string | Display name (optional) |
curl -X POST https://bionicforms.com/api/v1/register \
-H "Content-Type: application/json" \
-d '{"email": "agent@example.com", "password": "securepass123", "name": "My Agent"}'{
"data": {
"user_id": "a1b2c3d4-...",
"workspace_id": "e5f6g7h8-...",
"api_key": "bf_k1_...",
"api_key_id": "i9j0k1l2-...",
"api_key_prefix": "bf_k1_xxxxxxxx",
"plan": "free",
"email_verified": false,
"verification_email_sent": true,
"rate_limit": 10,
"message": "Account created. Verify your email to unlock full API rate limits (currently 10 req/min)..."
}
}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.
/api/v1/verify-email/statusCheck verification status
Returns whether the account's email has been verified. Requires Bearer token authentication.
curl https://bionicforms.com/api/v1/verify-email/status \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": {
"email_verified": false
}
}/api/v1/verify-email/resendResend verification email
Sends a new verification email. Rate limited to 3 requests per hour. If already verified, returns success with email_verified: true.
curl -X POST https://bionicforms.com/api/v1/verify-email/resend \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": {
"email_verified": false,
"message": "Verification email sent. Check your inbox and click the link to verify."
}
}Sandbox Limits (Unverified)
| Resource | Unverified | Verified |
|---|---|---|
| Rate limit | 10 req/min | Plan limit (15–120 req/min) |
| Max forms | 5 | Unlimited |
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
| Status | Code |
|---|---|
| 400 | bad_request |
| 401 | unauthorized |
| 401 | invalid_api_key |
| 402 | insufficient_credits |
| 403 | plan_required |
| 404 | not_found |
| 409 | conflict |
| 409 | email_taken |
| 422 | validation_error |
| 429 | rate_limited |
| 500 | internal_error |
Rate Limiting
API requests are rate-limited per API key on a per-minute sliding window. Limits vary by plan and verification status.
60 req/min
120 req/min
Response Headers
X-RateLimit-Limit | Maximum requests per minute |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds to wait (only present on 429 responses) |
X-Email-Verified | Whether account email is verified (true/false) |
Forms
Create, read, update, and delete forms. Manage form fields and publish forms for public submissions.
/api/v1/formsList all forms
Returns all forms in your workspace.
curl https://bionicforms.com/api/v1/forms \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Customer Feedback",
"slug": "customer-feedback",
"status": "published",
"response_count": 42,
"public_url": "https://bionicforms.com/f/customer-feedback",
"created_at": "2026-03-01T10:00:00Z",
"updated_at": "2026-03-05T14:30:00Z"
}
],
"meta": { "total_count": 1 }
}/api/v1/formsCreate a form
Creates a new draft form. Optionally include fields to set up the form schema immediately.
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..." }
}
]
}'{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Customer Feedback",
"description": "Quick feedback survey",
"slug": "customer-feedback",
"status": "draft",
"response_count": 0,
"public_url": "https://bionicforms.com/f/customer-feedback",
"created_at": "2026-03-05T15:30:00Z",
"updated_at": "2026-03-05T15:30:00Z",
"fields": [ ... ]
}
}/api/v1/forms/{formID}Get a form
Returns a single form with its current field schema.
curl https://bionicforms.com/api/v1/forms/FORM_ID \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Customer Feedback",
"status": "published",
"fields": [
{
"type": "email",
"key": "your_email",
"label": "Your Email",
"required": true
},
{
"type": "rating",
"key": "how_satisfied_are_you",
"label": "How satisfied are you?",
"required": true,
"properties": { "max_rating": 5, "icon": "star" }
}
]
}
}/api/v1/forms/{formID}Update a form
Updates the form title and/or description. Does not affect fields.
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" }'{ "data": { "updated": true } }/api/v1/forms/{formID}Delete a form
Permanently deletes a form and all its responses.
curl -X DELETE https://bionicforms.com/api/v1/forms/FORM_ID \
-H "Authorization: Bearer YOUR_API_KEY"No response body/api/v1/forms/{formID}/schemaUpdate form fields
Replaces the form's field schema. See Field Types for supported types.
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"]
}
}
]
}'{ "data": { "updated": true, "field_count": 3 } }/api/v1/forms/{formID}/publishPublish a form
Creates a published version so respondents can submit. The form must have at least one field.
curl -X POST https://bionicforms.com/api/v1/forms/FORM_ID/publish \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'{
"data": {
"published": true,
"public_url": "https://bionicforms.com/f/customer-feedback"
}
}Responses
Read and manage form submissions. Responses are paginated with a maximum of 100 per page.
/api/v1/forms/{formID}/responsesList responses
Returns paginated form submissions. Use query parameters for pagination and search.
| Name | In | Description |
|---|---|---|
page | query | Page number (default: 1) |
per_page | query | Items per page (default: 50, max: 100) |
search | query | Filter responses by text content |
curl "https://bionicforms.com/api/v1/forms/FORM_ID/responses?page=1&per_page=20" \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": [
{
"id": "resp-uuid-001",
"data": {
"your_email": "john@example.com",
"how_satisfied_are_you": "5",
"comments": "Great product!"
},
"created_at": "2026-03-05T10:15:00Z"
}
],
"meta": {
"page": 1,
"per_page": 20,
"total_count": 150,
"has_more": true,
"field_map": {
"your_email": "Your Email",
"how_satisfied_are_you": "How satisfied are you?",
"comments": "Comments"
}
}
}/api/v1/forms/{formID}/responses/{responseID}Get a response
Returns a single form submission by ID.
curl https://bionicforms.com/api/v1/forms/FORM_ID/responses/RESPONSE_ID \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": {
"id": "resp-uuid-001",
"data": {
"your_email": "john@example.com",
"how_satisfied_are_you": "5"
},
"created_at": "2026-03-05T10:15:00Z"
}
}/api/v1/forms/{formID}/responses/{responseID}Delete a response
Permanently deletes a single form submission.
curl -X DELETE https://bionicforms.com/api/v1/forms/FORM_ID/responses/RESPONSE_ID \
-H "Authorization: Bearer YOUR_API_KEY"No response bodyAnalysis
Trigger AI-powered analysis of form responses. Includes sentiment analysis, theme extraction, urgency detection, and natural language querying.
/api/v1/forms/{formID}/analysisTrigger analysis
Starts an AI analysis run on the form's responses. Requires at least 5 responses and a Standard or Pro plan.
curl -X POST https://bionicforms.com/api/v1/forms/FORM_ID/analysis \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'{
"data": {
"run_id": "run-uuid-001",
"status": "processing",
"submission_count": 50,
"created_at": "2026-03-05T10:20:00Z"
}
}/api/v1/forms/{formID}/analysisGet analysis results
Returns the latest analysis results including sentiment, themes, urgency, and quantitative data. All data is fetched in parallel for fast responses.
curl https://bionicforms.com/api/v1/forms/FORM_ID/analysis \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": {
"run_id": "run-uuid-001",
"status": "completed",
"created_at": "2026-03-05T10:20:00Z",
"completed_at": "2026-03-05T10:21:30Z",
"summary": { "text": "Overall positive feedback..." },
"sentiment": {
"positive": 30,
"neutral": 15,
"negative": 5
},
"themes": [
{
"theme": "Ease of use",
"description": "Users appreciate the intuitive interface",
"count": 18,
"quotes": ["Very easy to set up", "Intuitive design"]
}
],
"urgency": {
"distribution": { "low": 20, "medium": 20, "high": 10 },
"urgent_items": [
{
"response_id": "resp-uuid",
"urgency_level": "high",
"reason": "Customer reports data loss"
}
]
},
"quantitative": [
{
"field_key": "field_2",
"field_label": "Satisfaction",
"field_type": "rating",
"average": 4.2,
"median": 5,
"min": 1,
"max": 5
}
]
}
}/api/v1/forms/{formID}/analysis/queryQuery with natural language
Ask a question about your form responses in plain English. Requires a prior analysis run. Costs 1 credit per query.
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?" }'{
"data": {
"query": "What are the top 3 pain points?",
"answer": {
"text": "Based on the responses, the top pain points are..."
}
}
}Webhooks
Manage webhook endpoints to receive real-time notifications when forms are submitted. Webhooks can be filtered to specific forms.
/api/v1/webhooksList webhooks
Returns all webhooks configured for your workspace.
curl https://bionicforms.com/api/v1/webhooks \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": [
{
"id": "wh-uuid-001",
"url": "https://example.com/webhook",
"secret": "whsec_...",
"event_types": ["response.created"],
"is_active": true,
"description": "Production webhook",
"form_ids": [],
"created_at": "2026-03-01T10:00:00Z"
}
],
"meta": { "total_count": 1 }
}/api/v1/webhooksCreate a webhook
Registers a new webhook endpoint. Optionally filter to specific form IDs.
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"]
}'{
"data": {
"id": "wh-uuid-002",
"url": "https://example.com/webhook",
"secret": "whsec_...",
"event_types": ["response.created"],
"is_active": true,
"description": "Production notifications",
"form_ids": ["FORM_ID_1", "FORM_ID_2"],
"created_at": "2026-03-05T15:00:00Z"
}
}/api/v1/webhooks/{id}Update a webhook
Updates webhook properties. Only include fields you want to change.
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 }'{ "data": { "updated": true } }/api/v1/webhooks/{id}Delete a webhook
Permanently removes a webhook. It will no longer receive notifications.
curl -X DELETE https://bionicforms.com/api/v1/webhooks/WEBHOOK_ID \
-H "Authorization: Bearer YOUR_API_KEY"No response bodyAccount
Retrieve workspace information, current plan, and credit balance.
/api/v1/accountGet account info
Returns your workspace details, billing plan, and remaining AI credits.
curl https://bionicforms.com/api/v1/account \
-H "Authorization: Bearer YOUR_API_KEY"{
"data": {
"workspace_id": "ws-uuid-001",
"workspace_name": "My Workspace",
"plan": "standard",
"credits": {
"monthly_remaining": 100,
"purchased_remaining": 500,
"trial_remaining": 0,
"period_end": "2026-04-01T00:00:00Z"
}
}
}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 } }| Key | Type | Description |
|---|---|---|
type | string | Field type identifier (see Field Types below) |
key | string | Custom 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. |
label | string | Display label shown to the respondent |
required | boolean | Whether the field must be filled in (default: false) |
description | string | Helper text displayed below the field label |
properties | object | Type-specific configuration (see each type below for available keys) |
validation | object | Validation 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 inputSingle-line text field for names, addresses, and other short values.
| Property | Type | Default |
|---|---|---|
placeholder | string | — |
{ "type": "text", "label": "Full Name", "required": true, "properties": { "placeholder": "Jane Smith" } }email Email addressValidates email format automatically (e.g. user@example.com).
| Property | Type | Default |
|---|---|---|
placeholder | string | — |
{ "type": "email", "label": "Email Address", "required": true }phone Phone numberFree-form phone input.
| Property | Type | Default |
|---|---|---|
placeholder | string | — |
{ "type": "phone", "label": "Phone Number" }url URL inputAccepts web addresses.
| Property | Type | Default |
|---|---|---|
placeholder | string | — |
{ "type": "url", "label": "Website", "properties": { "placeholder": "https://example.com" } }number Numeric inputAccepts numbers. Supports min/max validation.
| Property | Type | Default |
|---|---|---|
placeholder | string | — |
{ "type": "number", "label": "Age", "required": true, "validation": { "min": 0, "max": 150 } }date Date pickerCalendar-style date input (YYYY-MM-DD).
| Property | Type | Default |
|---|---|---|
placeholder | string | — |
{ "type": "date", "label": "Start Date", "required": true }textarea Long text areaMulti-line text input for comments, feedback, and long-form answers.
| Property | Type | Default |
|---|---|---|
placeholder | string | — |
rows | integer | 4 |
{ "type": "textarea", "label": "Comments", "properties": { "placeholder": "Tell us more...", "rows": 6 } }Choice Fields
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 dropdownSingle-select dropdown menu. Respondent picks one option from a list.
| Property | Type | Default |
|---|---|---|
options | array | — |
placeholder | string | — |
allow_other | boolean | false |
{
"type": "dropdown",
"label": "Department",
"required": true,
"properties": {
"options": ["Engineering", "Design", "Marketing", "Sales"],
"placeholder": "Select department..."
}
}radio Radio buttonsSingle-select radio group. Respondent picks one option.
| Property | Type | Default |
|---|---|---|
options | array | — |
allow_other | boolean | false |
{
"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.
| Property | Type | Default |
|---|---|---|
options | array | — |
allow_other | boolean | false |
{
"type": "checkbox",
"label": "Which features do you use?",
"properties": {
"options": ["Forms", "Analytics", "Webhooks", "API"]
}
}Rating & Scale
rating Star/emoji ratingVisual rating scale (e.g. 1-5 stars). Respondent clicks to rate.
| Property | Type | Default |
|---|---|---|
max_rating | integer | 5 |
icon | string | "star" |
{
"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).
| Property | Type | Default |
|---|---|---|
low_label | string | "Not likely" |
high_label | string | "Very likely" |
{
"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 sliderDraggable slider for picking a value within a range.
| Property | Type | Default |
|---|---|---|
min | number | 0 |
max | number | 100 |
step | number | 1 |
{
"type": "slider",
"label": "Budget (USD)",
"properties": { "min": 0, "max": 10000, "step": 500 }
}Other
file File uploadAllows respondents to upload files (images, PDFs, documents).
| Property | Type | Default |
|---|---|---|
max_files | integer | 1 |
{ "type": "file", "label": "Upload Resume", "properties": { "max_files": 1 } }signature Signature padCanvas-based signature capture. No configurable properties.
{ "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.
| Key | Type | Applies to |
|---|---|---|
min_length | integer | text, textarea |
max_length | integer | text, textarea |
pattern | string | text |
min | number | number |
max | number | number |
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.