splitforms.com

Contact form API · REST + webhooks + MCP

Contact form API for any frontend.

A contact form API is a hosted endpoint that receives a website form's POST request, validates the fields, filters spam, stores the submission, and notifies the owner, so the site needs no backend code of its own. splitforms is a contact form API for HTML, React, Next.js, and any other frontend: set the form action to https://splitforms.com/api/submit with a hidden access_key field, or POST the same fields as JSON from fetch, curl, or Python. Responses are JSON, and rate limits of 6 submissions per minute per IP keep abuse out. The free plan covers 500 submissions per month with unlimited forms, a searchable dashboard, and owner email notifications. Paid plans from $5 per month add HMAC-signed webhooks, CSV exports, and integrations, and a free MCP server lets AI agents like Claude create forms and read submissions directly.

  • 500 free / mo
  • No backend code
  • $5 Pro plan
A developer pointing an HTML and React form at the splitforms contact form API endpoint

No backend to host

Point your form's action at one endpoint. No server, API route, or database to build or maintain.

Spam filtered on every plan

Honeypot, time-trap, content heuristics, and rate limits screen submissions before they reach you.

REST API + free MCP server

One API token powers the read API and a free MCP server, so AI agents can manage forms directly.

Copy-paste ready

Point any form at one API endpoint.

splitforms is exactly that: point any HTML, React, or Next.js form at https://splitforms.com/api/submit with a hidden access_key field, and submissions land in your dashboard and inbox in seconds. The same endpoint takes a POST from curl, fetch, or Python — full request and response examples are in the API reference.

Get your free access key
contact.html
<form action="https://splitforms.com/api/submit" method="POST">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
  <input type="hidden" name="form_loaded_at" />
  <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />
  <input name="name" required />
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <button type="submit">Send</button>
</form>

<script>
  // time-trap: stamp the load time so instant bot submits get flagged
  document.querySelector('[name="form_loaded_at"]').value = Date.now();
</script>

Setup

How to connect a form to the contact form API.

Works the same way whether your frontend is a React app, plain HTML, or something else — the endpoint doesn't care what rendered the markup.

Create a free access key

Sign up for splitforms (no credit card) and create a form in the dashboard. Copy its access_key — a public identifier that goes in your form, not a secret.

Point your form at the endpoint

Set your HTML form's action to https://splitforms.com/api/submit with method POST, or POST FormData/JSON to the same URL from React, Next.js, Vue, or any HTTP client. Include the access_key as a hidden field.

Add the spam-prevention fields

Add a hidden botcheck input that must stay empty (a honeypot) and a hidden form_loaded_at field stamped with the page-load time. Both are checked automatically before a submission is accepted.

Set optional control fields

Add subject to customize the email subject line, redirect to send visitors to a thank-you page, and replyto to control the reply-to address on notification emails.

Test it and check your inbox

Submit the form once. The owner notification email is free on every plan, and the submission shows up in the dashboard immediately.

Automate what happens next

Add signed webhooks, native Slack, Notion, or Google Sheets integrations, or an auto-responder on Pro ($5/month) once email alone isn't enough.

Where submissions go

Where do your contact form API submissions go?

Every submission is emailed to you and saved to a searchable dashboard — spam filtered before it ever reaches you. Pull them back out with the read API (GET /api/submissions), export to CSV, or forward it to a webhook or Slack on paid plans.

  • 500 submissions per month, free forever
  • Read API: GET /api/submissions with a Bearer token
  • Signed webhooks to Slack, Discord, or your own server
Contact form API submissions in the splitforms dashboard

No backend needed

Do you need a backend for a contact form API? No.

Your form POSTs standard FormData or JSON to one URL. splitforms validates the access_key, runs the spam classifier, and forwards it to your email — so there's no server, API route, or database for you to build or maintain.

  • POST /api/submit — multipart, url-encoded, or JSON
  • Returns JSON { success, message } every time
  • Works from HTML, React, Next.js, or any HTTP client
How the splitforms contact form API processes a submission

Spam filtering

Does the contact form API stop spam?

Every plan screens submissions with a honeypot, a time-trap, content heuristics, and per-form rate limits before anything reaches you — a reCAPTCHA-free way to keep bots out without a puzzle for real visitors.

  • Honeypot + time-trap on every plan, including Free
  • 6 submissions/min per IP, 20 per 15 minutes
  • Allowed-domains locking on the access key
Spam filtering on the splitforms contact form API

REST + MCP

Drive the contact form API with REST and MCP.

One API token powers both the REST read API and a free MCP server, so agents like Claude and Cursor can create forms and read submissions directly — the same key, no bespoke integration. Full request and response examples live in the API reference.

  • Free MCP server on every plan — 6 tools
  • create_form, generate_form, list_submissions
  • Same Bearer token as the read API
The splitforms contact form API MCP server for AI agents

How SplitForms works

From form to workflow in 3 simple steps.

Connect your form, collect every submission, and send data where it needs to go — without building backend infrastructure.

A SplitForms contact form submission launching straight to your inbox

Add your endpoint

Point your form to your unique SplitForms endpoint. That's it.

HTML form pointing at a SplitForms submit endpoint

Receive submissions

We instantly capture and organize every submission in your inbox.

Submissions inbox with searchable leads and status pills

Route anywhere

Send data to email, spreadsheets, CRMs, webhooks, and 7,000+ apps.

Generic integration tiles for email, sheets, chat, CRM, automate, and webhook

No credit card required. Set up in under 60 seconds.

Connect & automate

Connect your favorite tools and automate everything

SplitForms works with the destinations you route to and the platforms you build on — from Slack and Sheets to WordPress, Shopify, and Next.js. And with Stripe connected, your forms can take payments too.

Connect your SplitForms form to Slack, Google Sheets, Mailchimp, Zapier and more
NewTake payments on your formsDeposits, bookings, order forms — submitters check out through Stripe and the money goes straight to your Stripe account. Included on every paid plan.See plans →

Trusted by indie teams and agencies shipping forms worldwide

PETAL/COKRAFT.DELINEAR-XBUILD.DEVSTUDIO 71MERIDIANFRAME&CO

Testimonials

Loved by developers shipping at every scale.

40 quotes on record — from indie hacks to agency migrations.

Questions

Contact form API questions.

View all FAQs
What's included in the splitforms contact form API?

One POST endpoint (/api/submit) that accepts any HTML form or fetch/JSON request, a read API for pulling submissions back out, a free MCP server for AI agents, Storage-backed file uploads, custom redirects, and a replyto override — plus CC/BCC on Pro and above. Spam filtering (honeypot, time-trap, content heuristics, allowed-domains) and owner notification emails are included on every plan, including Free.

Do I need an API key to use it?

You need two different credentials. Every form has an access_key — a public identifier you put in a hidden field or POST body that tells splitforms which form a submission belongs to. Your account also has one API token, found at Dashboard → MCP, that authenticates the read API (GET /api/submissions) and the MCP server with an Authorization: Bearer header. Only the access_key belongs in client-side HTML.

Is the contact form API really free?

Yes. Free covers 500 submissions/month, unlimited forms, spam filtering, the dashboard, owner notification emails, and the MCP server — no credit card required. Pro is $5/month for 5,000 submissions and adds CSV/XML/PDF export, webhooks, integrations, and an auto-responder. Pro is $5/month for 5,000 submissions and adds CC/BCC and priority support. The 3-Year plan is $59 for the first 3 years, then $59/year, for 15,000/month.

How do I POST to the contact form API from curl, fetch, or Python?

The endpoint is language-agnostic — POST to https://splitforms.com/api/submit with your access_key and fields. From curl use -F flags; from JavaScript send new FormData(form) with fetch; from Python post a data dict with requests. Every client gets the same JSON back: { success, message, submission_id } on a 200, or { success: false, message, code } on a 4xx validation or auth error.

What are the API's rate limits?

Submissions are capped at 6 per minute per IP address per form (a sliding 60-second window), plus a sustained limit of 20 per 15 minutes from the same IP. Go over either and you get HTTP 429. The read API (GET /api/submissions) is limited to 60 requests per minute per API token. Real visitors almost never hit the submission limit — it mostly catches bots.

How do I read submissions from another app or service?

Call GET https://splitforms.com/api/submissions with Authorization: Bearer YOUR_API_TOKEN. Filter with form (a form's id or access_key), and paginate with limit (default 25, max 100), before, and since. The response is { submissions, has_more }. Use it to sync leads into your own database, a CRM, or a script — the same token also powers the MCP server.

Do webhooks retry if my endpoint is down?

Yes, once. Each webhook is an HMAC-SHA256-signed POST (the signature header is prefixed sha256=) with an 8-second timeout; a delivery that fails with a network error, timeout, or 5xx is retried once automatically after a short pause. A 4xx response is not retried — the endpoint understood the request and refused it. Webhooks are on Pro ($5/month) and above; native Slack, Discord, Telegram, WhatsApp, and Mailchimp destinations are also available if you'd rather not run your own endpoint.

What's the MCP server for?

MCP (Model Context Protocol) is how AI agents like Claude, Cursor, and Windsurf call external tools directly. splitforms' MCP server is free on every plan and ships 6 tools, including create_form, generate_form, and list_submissions — so an agent can build a form and read its submissions with the same API token as the REST API, without a bespoke integration.

Can I connect a form without writing backend code?

Yes — that's the point of the API. Build the form in the drag-and-drop dashboard (50+ templates) and grab a ready-made embed for WordPress (shortcode), Shopify (Custom Liquid), iframe, plain HTML, or a React component; or wire up your own markup by pointing action at https://splitforms.com/api/submit with the access_key field. Either way there's no server to run — submissions land in the dashboard and your inbox.

Simple pricing

Start free. Scale when you need more.

Choose a plan that fits your workflow — from a free form endpoint to full automations, exports, Stripe payments, and higher submission limits.

Free

$0
 

Free forever

Best for testing

For side projects and indie devs.

  • 500 submissions / mo
  • Unlimited forms
  • Email notifications included
  • Honeypot spam filtering
  • Submissions dashboard
  • MCP setup stays free
  • No credit card required

3-Year

$59/ first 3 years
was $99 · save 40% · new-user price

Pay $59. 3 years sorted.

  • 15,000 submissions / mo
  • Unlimited forms
  • Everything in Pro
  • $59 for 3 years, then $59/year
  • Long-term discount
  • Priority support included
  • Vote on the roadmap

No credit card required on Free • Cancel anytime