Built-in Site Endpoints
Every Based Page deployment includes two built-in endpoints you can use directly from your site's HTML and JavaScript. No backend required.
Form Submissions
POST /_submit
Accepts form submissions from your deployed page and stores them securely. Only the site owner can read submissions.
Use from HTML:
<form action="/_submit" method="POST">
<input name="email" type="email" required />
<input name="name" type="text" />
<button type="submit">Subscribe</button>
</form>Use from JavaScript:
await fetch('/_submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: 'user@example.com', name: 'Alice' })
});Limits:
| Tier | Daily submissions | Max stored |
|---|---|---|
| Agent (no account) | 50/day | 200 |
| Free | 250/day | 500 |
| Pro | 1,000/day | 10,000 |
- Maximum payload size: 10 KB
- Oldest submissions are pruned automatically when the stored limit is reached
- Rate limited: 10 submissions per minute per IP
- Honeypot field: include a hidden
<input name="_hp" />to filter bots (any non-empty value is rejected)
Reading submissions:
Use the get_submissions MCP tool, the API (GET /deploy/:id/submissions), or the dashboard. Submissions are never readable publicly.
Counters
Counters are simple named integers you can increment from your site. Useful for tracking clicks, votes, signups, or any event you want to count.
GET /_counter/:name
Read the current value of a counter.
const res = await fetch('/_counter/signup-clicks');
const { value } = await res.json();
// { name: "signup-clicks", value: 142, slug: "my-site" }Response is cached for 10 seconds (Cache-Control: public, max-age=10).
POST /_counter/:name/increment
Increment a counter by 1.
await fetch('/_counter/signup-clicks/increment', { method: 'POST' });Limits:
- Counters per deployment: 10 (Agent), 50 (Free), 100 (Pro)
- Rate limited: 60 increments per minute per IP
- Counter names: alphanumeric, hyphens, underscores only
Example - track button clicks:
<button onclick="fetch('/_counter/cta-clicks/increment', { method: 'POST' })">
Get Started
</button>Reading counters:
Use the list_counters MCP tool or GET /deploy/:id/counters API endpoint.
When to use what
| Need | Use |
|---|---|
| Collect form data (emails, messages, etc.) | /_submit |
| Track events or counts | /_counter/:name/increment |
| Complex queries, user auth, relationships | External service (Supabase, PlanetScale) |
| Real-time data | External service |