splitforms.com

Free form submission API

Free form submission API for HTML, JSON and server-side code.

Updated · plan facts checked against /pricing

A form submission API is a hosted URL that receives form data over HTTP POST, filters spam, stores it and notifies you. splitforms accepts HTML form posts, FormData or JSON at https://splitforms.com/api/submit, and GET /api/submissions reads them back. The free plan includes 500 submissions in total, one-time rather than monthly, across unlimited forms.

  • 500 free total
  • JSON or FormData
  • REST read API
A form submission API endpoint receiving HTML, FormData and JSON posts and returning submissions over REST

Any body format

HTML form posts, FormData, URL-encoded or JSON: one endpoint parses them all, with no server of your own.

Read it back over REST

GET /api/submissions returns your submissions as JSON, filtered by form, up to 100 per page.

Spam filtered, email included

Honeypot, time-trap, rate limits and content checks run first. The owner notification email is free on every plan.

Send JSON from a server

How do I send JSON to the API from a server?

Server code, a cron job or a mobile app can POST JSON straight to https://splitforms.com/api/submit, with no browser and no form tag. Keep the access key in an environment variable, send Accept: application/json and check success in the response. Building a plain HTML form instead? The contact form API for websites guide covers the HTML snippet and every request field.

Generate access key
send-submission.js
// Node 18+: an API route, queue worker or cron job
export async function sendSubmission({ email, message }) {
  const res = await fetch('https://splitforms.com/api/submit', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Accept: 'application/json',
    },
    body: JSON.stringify({
      access_key: process.env.SPLITFORMS_KEY,
      email,
      message,
    }),
  });

  const data = await res.json();
  if (!data.success) {
    // data.code: rate_limited, quota_reached, invalid_access_key, ...
    throw new Error(`${res.status} ${data.code}: ${data.message}`);
  }
  return data; // { success: true, message: 'Submission received' }
}

Python

How do I POST to the form submission API from Python?

Pass a dict to json= and requests sets Content-Type: application/json for you. A Flask or Django view, a queue worker or a one-off script sends submissions the same way a browser does.

  • Same fields as a browser form: access_key plus whatever you want saved.
  • Skip botcheck and form_loaded_at. The time-trap only runs when form_loaded_at is sent.
  • Every post from one server shares its IP, so the limit of 6 per minute and 20 per 15 minutes per IP, per form applies to all of them together.
  • Strict origin mode rejects posts without a matching Origin header (403 origin_not_allowed), so leave it off for server-side forms.
submit.py
import requests

r = requests.post(
    'https://splitforms.com/api/submit',
    json={
        'access_key': 'YOUR_ACCESS_KEY',
        'name': 'Ada',
        'email': '[email protected]',
        'message': 'Hi',
    },
    headers={'Accept': 'application/json'},
    timeout=10,
)
print(r.status_code, r.json())

Read submissions back

How do I read submissions back over the API?

The read submissions API returns the submissions you see in your inbox as JSON: GET /api/submissions with Authorization: Bearer <API token>. Generate the token once in Dashboard > MCP; the response is { submissions, has_more }.

  • form takes a form id or its access_key. Leave it out to list every form on the account.
  • limit defaults to 25 (max 100). Page back with before, or sync only new rows with since (ISO-8601 timestamps).
  • Spam-flagged and deleted submissions are left out; archived ones are included. The limit is 60 requests a minute per token.
  • The token is a secret: call this from a server, never from browser code. The same token runs the free MCP server.
read-submissions.sh
curl "https://splitforms.com/api/submissions?form=YOUR_ACCESS_KEY&limit=50" \
  -H "Authorization: Bearer $SPLITFORMS_API_TOKEN"

# 200 OK
{
  "submissions": [
    {
      "id": "8f14e45f-ceea-467a-9575-6f2a4b1c9d3e",
      "form_id": "c9f0f895-fb98-4b91-9f3a-2d7e5a1b6c4d",
      "created_at": "2026-09-27T09:41:07.000Z",
      "data": { "email": "[email protected]", "message": "Hi" },
      "is_spam": false
    }
  ],
  "has_more": false
}

Limits and capabilities

What does the free form submission API support?

The endpoint, the body formats, the read API and the MCP server are the same on every plan. Paid plans add files, webhooks, integrations, exports and a monthly allowance.

CapabilityFreePaid (Pro $5/mo, Annual $49/yr)
HTML form posts (URL-encoded)YesYes
JSON bodies (application/json)YesYes
FormData and multipartYes, text fields (files are dropped)Yes, plus up to 5 files of 5 MB each
Server, cron and mobile clientsYesYes
REST read APIYes (60 requests a minute per token)Yes (60 requests a minute per token)
MCP server for AI agentsYes, 12 toolsYes, 12 tools
Owner notification emailYesYes
Rate limit on /api/submit6 per minute and 20 per 15 minutes per IP, per form6 per minute and 20 per 15 minutes per IP, per form
Submissions500 total, no card5,000 a month on Pro, 15,000 on Annual
Submission storageKept until you delete them (no automatic expiry)Kept until you delete them (no automatic expiry)
Signed webhooks and integrationsNoYes
CSV, XML and PDF exportNoYes

/api/submit accepts application/json, application/x-www-form-urlencoded and multipart/form-data; any other content type gets a 415. JSON bodies cannot carry files.

Other free tiers are monthly allowances: Web3Forms 250, FormBold 100, Forminit 100, Formspree 50 and Formcarry 50 submissions a month (checked September 27, 2026). splitforms Free is 500 submissions in total, and Pro is $5/month for 5,000 a month. See the comparison of free form backends.

Use cases

What can I send besides contact forms?

Any flat JSON object with an access_key. Field names are yours; everything except a few control fields is stored as sent.

Signup or waitlist

Collect an email and where it came from. Every field shows up in the dashboard, the notification email and the read API.

signup.json
{
  "access_key": "YOUR_ACCESS_KEY",
  "email": "[email protected]",
  "plan_interest": "team",
  "source": "launch-page"
}

Order request

subject sets the notification subject line. To take payment in the same step, paid plans can send the buyer on to Stripe Checkout.

order.json
{
  "access_key": "YOUR_ACCESS_KEY",
  "subject": "New order request",
  "name": "Ada Lovelace",
  "email": "[email protected]",
  "product": "Launch kit",
  "quantity": 2
}

Survey

Numbers and short answers are stored as sent, so the read API returns them ready to chart or export.

survey.json
{
  "access_key": "YOUR_ACCESS_KEY",
  "subject": "Onboarding survey",
  "rating": 4,
  "would_recommend": "yes",
  "feedback": "Setup took five minutes."
}

Setup

How do I set up the form submission API?

The same five steps work from a server, a mobile app or a plain HTML, React or Next.js form.

Create a free access key

Sign in to splitforms and copy your form's access_key from the dashboard. Free covers 500 submissions total (one-time) across unlimited forms, no card required.

POST from your code

Send JSON, FormData or a URL-encoded body to https://splitforms.com/api/submit with the access_key and any fields you want saved. Add Accept: application/json to get a JSON response.

Check the JSON response

Treat success: true as accepted. On failure, read code and message; a 429 means the rate limit (rate_limited) or a used-up allowance (quota_reached).

Read submissions back

Generate an API token in Dashboard > MCP, keep it on your server, and call GET /api/submissions with Authorization: Bearer <token> to list submissions as JSON.

Add webhooks or integrations when you need them

Signed webhooks and integrations like Slack, Discord, Notion and Google Sheets need a paid plan (Pro at $5/month or Annual at $49/year).

What the API handles

What does a form submission API handle?

Every request runs through the same managed pipeline, so you never stand up a backend route, a mail service or a database table just to collect form data. It runs honeypot and time-trap checks before storing each submission and emailing it to you, and paid plans add integrations like Slack, Discord, Google Sheets and Notion.

  • Accept HTML form posts, FormData, JSON and multipart uploads (files on paid plans).
  • Screen bots with a honeypot, a time-trap, per-IP rate limits and content heuristics.
  • Store every submission in a searchable dashboard, with CSV export on paid plans.
  • Email on every plan; signed webhooks and integrations from Pro ($5/month).
A form submission received, protected, stored, and routed to email, webhooks, and integrations

Spam filtering

How does it block spam without a CAPTCHA?

splitforms layers a hidden honeypot, a time-trap that flags instant bot submits, and server-side content heuristics on every submission, with no CAPTCHA prompt required. Lock a form to allowed domains, turn on strict origin mode, or bring your own reCAPTCHA v2 secret for an extra layer.

  • Hidden honeypot field that only bots fill in.
  • form_loaded_at time-trap that flags instant submits.
  • Server-side content heuristics on every submission.
A form submission API blocking spam with a honeypot and time-trap instead of a CAPTCHA

FAQ

Form submission API FAQ.

View all FAQs
What is a form submission API?

A form submission API is a hosted endpoint that receives form data, validates fields, filters spam, stores the submission and emails the owner, on every plan including Free. Paid plans can also route submissions to signed webhooks and integrations like Slack, Notion and Google Sheets. It replaces the small backend most sites would otherwise build just to receive form data.

Is splitforms a free form submission API?

Yes. The Free plan includes 500 submissions total (one-time), unlimited forms, dashboard storage, REST reads and spam filtering. Pro ($5/month) adds signed webhooks, CSV export and integrations. No credit card is required for Free.

Which free form submission API has the biggest free tier?

By total volume, splitforms gives 500 submissions up front (one-time) with unlimited forms. By monthly allowance, the free tiers are Web3Forms 250, FormBold 100, Forminit 100, Formspree 50 and Formcarry 50 submissions a month (checked September 27, 2026). Monthly refills suit steady low volume and a larger one-time total suits launches and bursts; if you want a monthly allowance from splitforms, Pro is $5/month for 5,000 submissions.

Do the 500 free submissions reset every month?

No. It's a one-time total of 500, not a monthly allowance. When it's used up, the API returns HTTP 429 until you upgrade (Pro is $5/month for 5,000 a month, Annual $49/year for 15,000 a month), and submissions you already collected stay in your dashboard — there's no automatic expiry, even on Free.

Can I POST JSON from a server, cron job or mobile app?

Yes. Send Content-Type: application/json with a flat object that includes access_key. Leave strict-origin mode off for server and mobile clients, and remember the rate limit is 6 per minute and 20 per 15 minutes per IP, per form.

What does the API return, and how should I handle errors?

A successful request returns 200 with { success: true, message }, plus note and files if uploads were dropped. Validation and access-key problems return a 4xx with { success: false, message, code }. Rate and quota limits return 429 with code rate_limited or quota_reached; after rate_limited, wait about a minute before retrying. The API reference lists every error code.

Can I read submissions with an API instead of the dashboard?

Yes. GET https://splitforms.com/api/submissions with an Authorization: Bearer <API token> header returns { submissions, has_more }. Filter with form (id or access_key), and paginate with limit (default 25, max 100), before, and since. It's rate-limited to 60 requests per minute and uses the same token as the MCP server, generated in Dashboard > MCP.

Can I use it for forms other than contact forms?

Yes: signups, surveys, orders and applications all work, since any field names you send are stored. File uploads need a paid plan (5 files of 5 MB), and Stripe payments are available on paid plans.

Can I use the API from static HTML?

Yes, and JavaScript is optional. A normal HTML form can POST directly to https://splitforms.com/api/submit with a hidden access_key input. The same endpoint also accepts FormData from React, Next.js, Vue, Svelte, Astro, Webflow, Carrd, Framer and WordPress embeds.

How do I stop spam without a CAPTCHA?

splitforms layers a hidden botcheck honeypot field, a form_loaded_at time-trap that flags instant bot submits, and server-side content heuristics on every submission, with no CAPTCHA prompt required. You can also lock a form to allowed domains, turn on strict origin mode, or bring your own reCAPTCHA v2 secret if you want an extra layer.

What happens when I outgrow the 500 free submissions total?

Upgrade your account plan from the dashboard. Pro is $5/month for 5,000 submissions a month, and Annual is $49/year for 15,000 a month. Every paid plan adds webhooks, integrations, CSV/XML/PDF export and the auto-responder. Business (unlimited) is available by contacting [email protected].

Can AI agents create forms and read submissions?

Yes, through the free MCP server included on every plan. It ships 12 tools, including create_form, generate_form and list_submissions, so Claude, Cursor or any MCP-aware agent can stand up a form and read its results with the same API token used by the REST API.

Simple pricing

How much does splitforms cost?

Free gives you 500 submissions for $0 — no card, no time limit. Pro is $5/month for 5,000 submissions a month, and Annual is $49/year for 15,000 a month with every Pro feature.

Free

$0— 500 submissions
 

No card, no time limit

Best for testing

For side projects and indie devs.

  • 500 free submissions
  • Unlimited forms
  • Email notifications included
  • Smart spam filtering
  • Submissions dashboard
  • Redirect after submit
  • MCP server included

Annual

$49/ year
About $4.08/mo, billed yearly
Best value

Every Pro feature with triple the volume — $0.27 per 1,000 at full use.

  • 15,000 submissions / mo
  • Unlimited forms
  • Everything in Pro
  • File uploads with 5 GB storage
  • 3 team seats
  • Priority email support

No credit card required on Free • Cancel anytime • Full pricing and FAQ