Public endpoints served from https://construct.computer. The
machine-readable version of this page is the
OpenAPI 3.1 document, discoverable through the
RFC 9727 API catalog.
https://construct.computer. All paths are
absolute from there.
Content-Type: application/json on writes.
{ "error": { "code", "message" } }. Branch on
code, never on message.
The free tools on this site, open to any client and any AI agent with no
key. GET /api/tools lists them. GET a tool's URL
for its input schema and an example, then run it with
GET ?input=<URL-encoded JSON> or by posting the JSON.
Browser agents with WebMCP find the same tools registered on every page.
| Endpoint | What it does |
|---|---|
/api/tools/gmail-filter-generator
|
Builds Gmail filters. Returns a Gmail search string per filter, to preview matches in Gmail's search bar, and a mailFilters.xml file the user imports in Gmail under Settings, Filters and Blocked Addresses, Import filters. Each filter needs at least one condition and one action. |
/api/tools/zapier-cost-calculator
|
Estimates a monthly Zapier bill from a list of Zaps (action steps and runs per month). Returns monthly tasks, the cheapest plan including any pay-per-task overage, and the smallest plan that covers the tasks outright. Uses Zapier list prices checked on 2026-10-11. |
/api/tools/mcp-config-generator
|
Writes MCP server configuration for Claude Desktop, Claude Code, Cursor, VS Code and Codex from one description of the server. Give command (and args, env) for a local server, or url (and headers) for a remote one. Returns each client's file location and paste-ready snippet. |
curl 'https://construct.computer/api/tools/zapier-cost-calculator?input=%7B%22zaps%22%3A%5B%7B%22name%22%3A%22New%20lead%20to%20CRM%20and%20Slack%22%2C%22action_steps%22%3A2%2C%22runs_per_month%22%3A300%7D%2C%7B%22name%22%3A%22Paid%20invoice%20to%20sheet%22%2C%22action_steps%22%3A3%2C%22runs_per_month%22%3A120%7D%5D%2C%22billing%22%3A%22annual%22%2C%22team%22%3Afalse%7D'
Liveness check. No parameters, no storage reads, safe to poll. Responds
200 with application/health+json.
curl https://construct.computer/api/health
{
"status": "pass",
"serviceId": "construct-computer-site-api",
"description": "Construct Computer site API"
}
Records an email address against the call to action that produced it.
Every call needs a Cloudflare Turnstile token minted on construct.computer
for the beta_signup action, so this endpoint is only usable
from the site itself. It is listed here for completeness and for automated
discovery, not as an integration point. Submitting an address that is
already on the list returns the same 200 and creates no
duplicate.
| Field | Type | Required | Notes |
|---|---|---|---|
email |
string | yes | Max 254 characters. Trimmed and lowercased. |
name |
string | yes | Required person name for Listmonk (not the email local-part). Not stored in D1. |
ctaSource |
string | yes | Which call to action produced the signup, for example hero or nav. |
referral |
enum | no | One of twitter, reddit, hackernews, producthunt, linkedin, discord, other. Defaults to other/newsletter when omitted. |
referralOther |
string | conditional | Required when referral is "other". 2 to 120 characters. |
turnstileToken |
string | browser | Turnstile token for browser posts. Server ingest uses SIGNUP_INGEST_SECRET instead. |
honeypot |
string | no | Bot trap. A filled value is accepted and dropped. |
meta |
object | no | Allowlisted attribution (subscribedVia, authProvider, constructUserId, campaign/utm fields) → Listmonk attribs when API credentials are set. |
{ "ok": true, "listmonk": true }
listmonk is false when D1 saved the signup but
Listmonk sync failed (retry-safe for authenticated ingest). Browser UX
still treats HTTP 200 as success.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request |
The body was not JSON, or it failed validation. |
| 403 | origin_rejected |
An Origin header was sent and it was not construct.computer. |
| 403 | verification_failed |
The Turnstile token was missing, stale, or issued elsewhere. |
| 404 | not_found |
No free tool has that name. GET /api/tools lists them. |
| 405 | method_not_allowed |
The endpoint was called with the wrong HTTP method. |
| 413 | payload_too_large |
The request body was larger than 8 KiB, or a free tool's input was larger than 16 KiB. |
| 415 | unsupported_media_type |
Content-Type was not application/json. |
| 500 | internal_error |
Verification or storage failed. The request was not recorded. |