How to Get a Working Form Endpoint With Just Your Email (No Signup)
Point an HTML form at shipmyform.com/to/your@email and it works immediately. Every step, from the first line of HTML to the activation email, what is held, what is blocked, and how to swap in a form ID later.
The ShipMyForm team
· 5 min read
You can have a working form endpoint with nothing but an email address.
Put https://shipmyform.com/to/[email protected] in the form's action, and the
first submission creates the form, holds the message, and emails you a link
that turns it into a normal account with one click. No signup first, no
dashboard, no API key in the page. This guide walks through every step, what
happens behind each one, and the trade-offs you should know before relying on
it.
Full disclosure: ShipMyForm is our product. FormSubmit popularised this pattern years ago; the last section says honestly where the two differ.
Step 1: write the form
<form action="https://shipmyform.com/to/[email protected]" method="POST">
<label>
Your email
<input type="email" name="email" autocomplete="email" required />
</label>
<label>
Message
<textarea name="message" rows="5" required></textarea>
</label>
<!-- Anti-spam honeypot: hidden from people, filled in by bots. Leave empty. -->
<input type="text" name="_gotcha" tabindex="-1" autocomplete="off"
aria-hidden="true" style="position:absolute;left:-9999px" />
<button type="submit">Send</button>
</form>Three things matter here:
- The address in the URL is where submissions go. Lowercase it, and use a real mailbox. Disposable-inbox domains are refused outright, because a throwaway address is the cheapest way to farm endpoints.
- Every input needs a
name. That is the key the value is stored and emailed under. An input without one is dropped. - Keep the honeypot. Real visitors never see it, so it stays empty; bots fill every field, so theirs are rejected before anything else runs.
Two optional hidden fields work exactly as they do on any ShipMyForm form:
_subject sets the subject of the notification email, and _redirect sends
the visitor to your own thank-you page after submitting, provided it is on
the same site.
Step 2: put it on a real page
The endpoint binds the form to the site it came from. It reads the browser's
Origin header on the first submission, records that host, and from then on
accepts submissions only from it. Two consequences:
- Test from the page, not from the terminal. A
curlrequest has noOriginand is refused. Open the page in a browser and submit there. - One form per address per site. The same address on another domain becomes a separate form. That is deliberate: it stops one leaked address from being used to send you junk from anywhere.
Step 3: submit once
Fill the form in and press send. Behind that click:
- The submission is parsed and run through the same spam pipeline as every other form: honeypot, rate limits, cross-form velocity checks, and content classification.
- If it is clean, a placeholder account, a workspace and a form are created for the address, and the submission is stored, encrypted, against it.
- An activation email goes to the address. It names the site and links to an activation page. It never contains what the visitor typed, because the address has not been proven yet, and it will not until you activate.
You, the visitor, land on the thank-you page as normal. If you used a test message, check it was not something a spam filter would object to; a submission that scores as spam is stored as spam and sends no email.
The usual reasons, in order: the message was filtered as spam; the request had no Origin (a script, not a page); the address is disposable; or the address already had its one activation email for the day. At most one is sent per day and three in total per address, so an inbox is never flooded by a form that keeps receiving submissions.
Step 4: activate
The email has one button. It opens a page that says which site the form is on, how many submissions are waiting, and what activating does. Pressing Activate and open my inbox creates a free account for the address, signs you in, opens the inbox with the held submissions, and switches on email notifications. No password, no card.
From that moment the form is an ordinary ShipMyForm form. Notifications go out
for every clean submission, from an authenticated domain with the visitor's
address as Reply-To, so replying reaches them and the mail does not land in
spam.
Two details of the activation link are worth knowing. It is a signed token that expires after 14 days, the same window the held submissions live for. And it can never be used to sign into an account that already exists: if the address later becomes a verified account, the link stops working and sends you to the normal sign-in instead.
Step 5: swap in the form ID
Your email address is now in the page source, where a scraper can find it.
That is the price of skipping signup, and it is a fair one for getting started,
but you do not have to keep paying it. In the dashboard, open the form, copy
its /f/<id> endpoint from the Setup tab, and replace the action:
<!-- Before -->
<form action="https://shipmyform.com/to/[email protected]" method="POST">
<!-- After -->
<form action="https://shipmyform.com/f/frm_8Kx2mQ9pL4vN" method="POST">Both URLs keep working, so there is no rush and nothing breaks while you make the change.
What is held before you activate
| Submissions stored | The first 10. Later ones are not stored; the visitor still sees a success page. |
| Held for | 14 days. Then the placeholder account and everything in it is deleted. |
| Activation emails | At most 1 a day, 3 in total, per address. |
| Where submissions are accepted from | The site that created the form only. |
| Spam filtering | The full pipeline, from the very first submission. |
| Connectors, uploads, validation rules | After activation, per plan. |
Already have an account?
Then there is nothing to activate. A form pointed at an address that belongs to a verified account is created straight in that account's workspace, named after the site, already active, with notifications on. The first submission just arrives.
For AI agents
This is the reason the feature exists. An agent building a site end to end
cannot sign up for anything, so it either leaves a placeholder or invents an
endpoint that silently fails. With this, it asks one question, "which email
should submissions go to?", and writes a form that works. Our llms.txt tells
agents exactly that: ask for the address, never invent one, and tell the user
an activation email is coming. If the agent has an API key, the
MCP server is better still, because it creates a form with a real
ID and keeps the address out of the page.
Where this differs from FormSubmit
The starting move is the same, and FormSubmit deserves the credit for it: an email address in the action, an activation email on first use. The differences start after activation. Submissions here are stored in an inbox you can search and export, not only emailed. Spam is handled server-side with a honeypot, rate limits and classification rather than a CAPTCHA the visitor has to solve. You get validation rules, auto-reply, and routing to Slack, Sheets, Notion and webhooks. And you can move to a form ID so your address leaves the page. If all you want is an email per submission and you are happy with a CAPTCHA, either works; the difference is what happens once the form is real.
Next steps
- The no-signup endpoint, on one page: instant endpoints
- Markup to start from: HTML contact form templates that email you
- Why the form cannot email you by itself: HTML form to email
- What you are actually using: what is a form endpoint?
Frequently asked questions
- Do I need a ShipMyForm account to use /to/email?
- Not to start. The form works from the first submission with no account. The account is created for the address when you click the activation link in the email that first submission triggers. It is free and needs no card.
- Why did I not get an activation email?
- Four common reasons: the submission was filtered as spam, so no email was sent; you tested with curl or a tool that sends no Origin header, which the endpoint refuses; the address is a disposable inbox, which is not accepted; or the address already has one activation email today, since at most one is sent per day and three in total.
- Is my email address visible to visitors?
- Yes, it is in your HTML. Scrapers can find it there. That is the trade-off for skipping signup. After activating, copy the form's /f/<id> endpoint from the dashboard and use that instead; the old address URL keeps working.
- What happens to submissions before I activate?
- The first ten are stored, spam-filtered, and held for 14 days. Later ones are not stored, though the visitor still sees a success page. If you never activate, the placeholder account and everything in it is deleted after 14 days.
- How is this different from FormSubmit?
- The starting move is the same: an email address in the form action and an activation email on first use. After activation, ShipMyForm gives you a stored inbox, spam filtering without a CAPTCHA, validation rules, and routing to Slack, Sheets, Notion and webhooks, and you can move to a form ID that keeps your address out of the page.
- Can I use the same address on several sites?
- Yes. Each site gets its own form, because a form only accepts submissions from the site that created it. Activating once covers all of them, since it verifies the address rather than a single form.
Related guides
How to Send an HTML Form to Your Email (Without PHP or SMTP)
Every way to get HTML form submissions into your inbox, compared: mailto:, PHP mail(), JavaScript email services, serverless functions, and a form backend. Plus the deliverability part every tutorial skips.
HTML Contact Form Template That Emails You (Copy and Paste)
Ready-to-use HTML email form code: a minimal form, a full contact form with honeypot and subject, and a file-upload version. Paste, set one attribute, and submissions land in your inbox.
What Is a Form Endpoint? (And How to Use One)
The URL your form's action points to, explained: how endpoints receive submissions, how they relate to form backends, and how to wire one up.