Form inbox
Receive contact and booking form submissions from your Astro site. Submissions land in the admin inbox where you can read, reply, and manage them.
How it works
Orbiter exposes a public endpoint that accepts form submissions from your static Astro site. No serverless function or third-party service needed.
POST /api/form/:formId
:formId is any string you choose — e.g. contact, booking, support. Submissions from the same formId appear together as a tab in the admin inbox.
Connecting a form in Astro
Add a fetch handler to any HTML form. The admin server must be reachable from the browser (same domain, or a separate subdomain).
<form id="contact-form">
<input name="name" required />
<input name="email" type="email" required />
<textarea name="message" required></textarea>
<!-- honeypot: hidden, left empty by humans, filled by bots -->
<input name="_honeypot" style="display:none" tabindex="-1" autocomplete="off" />
<button type="submit">Send</button>
</form>
<script>
document.getElementById('contact-form').addEventListener('submit', async e => {
e.preventDefault();
const res = await fetch('https://admin.example.com/api/form/contact', {
method: 'POST',
body: new FormData(e.target),
});
if (res.ok) alert('Message sent!');
});
</script> The endpoint accepts both multipart/form-data and application/json.
Honeypot spam filter
Add a hidden _honeypot field to your form. Legitimate users never fill it in; bots usually do. If the field is non-empty, Orbiter silently accepts the request without saving it.
Booking forms
Booking requests work exactly like contact forms — just include date, time, and persons fields:
<input name="date" type="date" required /> <input name="time" type="time" /> <input name="persons" type="number" min="1" />
In the admin, booking submissions get Confirm and Reject buttons in addition to the standard status controls.
Managing submissions in the admin
Go to Tools → Inbox (or press g n in Space Station mode). Each form ID appears as a tab. Submissions are sorted newest first.
Each submission can be:
- Expanded to read the full field values
- Marked as
read,done,confirmed,rejected, orspam - Replied to by email — if the submission contains an
emailfield, a Reply button appears that opens an inline compose panel - Deleted permanently
Email notifications
To receive an email when a new submission arrives, configure SMTP in Settings → Email and enable Notify on form submission.
Status values
| Status | Meaning |
|---|---|
new | Just arrived, unread |
read | Opened (auto-set when you expand a submission) |
confirmed | Booking or inquiry accepted |
rejected | Booking or inquiry declined |
done | Handled / archived |
spam | Marked as spam |
API reference
POST /api/form/:formId — public, submit a form (no auth) GET /api/forms — list form IDs with counts (auth) GET /api/forms/:formId — list submissions (auth) PUT /api/forms/:id/status — update status (auth) POST /api/forms/:id/reply — send email reply to submitter (auth) DELETE /api/forms/:id — delete submission (auth)
POST /api/form/:formId endpoint has wide CORS (*) so it can be called from any static site. All other /api/forms/* endpoints require a session cookie.