← Blog

How to Store Contact Form Submissions Without a Backend

Use cases · June 17, 2026

You have a static site, maybe a landing page, a portfolio, or a docs site, and a contact form. You don't want to stand up a server just to catch submissions. With a publishable key you can POST straight from the browser.

1. Get a publishable key

In the dashboard, create a ck_pub_… key and lock it to your domain. It can only create contacts, so it's safe to ship in client-side code.

2. POST on submit

const form = document.querySelector('form')
form.addEventListener('submit', async (e) => {
  e.preventDefault()
  const data = Object.fromEntries(new FormData(form))
  await fetch('https://contactapi.dev/v1/contacts', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer ck_pub_your_key',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(data),
  })
})

3. Read them back

From your machine or a script, use your secret key to GET /v1/contacts and see every submission. Because create upserts by email, a repeat submitter updates their record instead of duplicating it.

That's the whole thing: a form, a fetch, and no backend to run.

Where ContactAPI fits

ContactAPI is an open-source REST API for saving and managing contacts. You POST an email plus any JSON fields, get simple CRUD back, and can reach the same data from an AI client over its MCP server. No CRM, no pipeline stages, no lock-in.

Get an API key