Documentation
Last updated: August 1, 2026
Formgopher relays static-site form submissions to a real inbox: create a recipient, get an API key instantly, and paste a snippet into your form. No account or verification is required from whoever receives the mail.
Getting started
- Create a free account.
- Add a recipient: give it a name and the destination email that should receive submissions. A key is generated instantly, nothing is required from that inbox's owner.
- Copy one of the snippets below into your site's contact form, using the key shown on that recipient's Overview page.
- Optionally lock the key to your site's domain under Origin locking.
- Test-submit the live form, then check the recipient's Submissions log for a “delivered” entry.
Embed snippet
Every recipient has its own key and ready-made snippets on its Overview page in the dashboard. The examples below show the same two variants with a placeholder key.
Plain HTML form
<form action="https://formgopher.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="fg_live_your_key_here">
<input type="text" name="name" placeholder="Your Name" required>
<input type="email" name="email" placeholder="Your Email" required>
<textarea name="message" placeholder="Your Message" required></textarea>
<input type="checkbox" name="_honeypot" style="display:none" tabindex="-1" autocomplete="off">
<!-- Optional: send visitors to your own page after they submit -->
<!-- <input type="hidden" name="redirect" value="https://yoursite.com/thanks"> -->
<button type="submit">Send</button>
</form>
fetch() form
<form id="contact-form">
<input type="text" name="name" placeholder="Your Name" required>
<input type="email" name="email" placeholder="Your Email" required>
<textarea name="message" placeholder="Your Message" required></textarea>
<button type="submit">Send</button>
</form>
<script>
document.getElementById('contact-form').addEventListener('submit', async function (e) {
e.preventDefault()
const formData = new FormData(e.target)
formData.append('access_key', 'fg_live_your_key_here')
const response = await fetch('https://formgopher.com/api/submit', {
method: 'POST',
body: formData,
})
if (response.ok) {
alert('Message sent!')
e.target.reset()
}
})
</script>
API reference
https://formgopher.com/api/submit
Accepts application/json, application/x-www-form-urlencoded,
or multipart/form-data (required only when attaching a file, Warren plan
only).
Fields
| Field | Required | Notes |
|---|---|---|
access_key |
Required | The recipient's API key. |
name |
Optional | Included in the notification email. |
email |
Optional | Used as the reply-to address, so replying to the notification goes straight to the visitor. |
message |
Optional | Included in the notification email. |
_honeypot |
Optional | Leave this field empty in your form. If it arrives non-empty, the submission is treated as spam and silently dropped. |
redirect |
Optional | Where to send the visitor after a plain HTML form POST. Must match one of the recipient's allowed origins. |
attachment |
Optional | A single file, multipart only. Warren plan only, up to 5MB. |
| Any other field | Optional | Forwarded as-is into the notification email. |
Response
{
"success": true
}
{
"success": false,
"error": "Origin not allowed for this key"
}
A plain HTML form POST (no JavaScript) instead receives an HTML redirect to your
redirect URL, or a built-in “message sent” page, rather than
JSON.
Error codes
| Status | Meaning |
|---|---|
| 400 | Missing access_key. |
| 404 | Invalid access_key. |
| 403 | Origin not allowed, recipient inactive, plan's monthly submission limit reached, or blocked as possible spam. |
| 429 | Rate-limited: more than 20 requests/minute for this key. |
| 502 | Delivery to the recipient's inbox failed. |
Spam protection (Warren plan)
Warren-tier recipients get a lightweight spam check on every submission, looking at things like suspicious links, spam-like keywords, and bursts of submissions from the same visitor. Per recipient, you choose whether flagged submissions still get delivered and are just tagged in the log (“flag”, the default), or are dropped before ever being sent (“block”). Free-tier recipients skip this check entirely.
Origin locking
By default, a key works from any site that submits to it. Adding one or more domains to a recipient's allowed origins restricts it to only accept submissions whose request origin matches, useful once a client's site is live. This is a separate, optional step from creating the recipient, so you can generate a key before a site even has a domain.
Plans & limits
| Plan | Recipients | Submissions/mo | CC emails | Attachments | Spam detection | Price |
|---|---|---|---|---|---|---|
| Free | 5 | ~150 | None | None | None | $0 |
| Warren | Unlimited | ~5,000 | Up to 4 per recipient | Up to 5MB/file | Flag or block, per recipient | $12/mo or $120/yr |