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.