Waveform Apps Developer API
A small public JSON API and machine-readable resources for agents and integrations.
Overview
The Waveform Apps API is a small public JSON API for reading what we build and what it costs, and for sending us a message. It exists so AI agents and integrations can act for a user without scraping the site.
- Base URL:
https://www.waveformapps.com/api - Specification: /openapi.json (OpenAPI 3.1 with operationIds and typed request and response schemas)
- Agent guide: /llms.txt
- Markdown pages: every page returns Markdown when requested with
Accept: text/markdown.
Authentication
None. Every endpoint is public and anonymous. Rate limits apply per client IP address, and the contact endpoint sends one email per successful call, so treat it as non-idempotent.
Endpoints
GET /api/servicesList the services Waveform Apps offers (listServices). Returns every service category with a one-line description. Read-only, takes no parameters and changes only when the site is redeployed.GET /api/pricingList fixed-price project options (listPricingOptions). Returns the published project packages with price, timeline and what is included. Prices are display strings exactly as shown on the pricing page; every project includes 30 days of free maintenance, then a care plan is $99 a month. Read-only and takes no parameters.POST /api/contactSend a project enquiry to Waveform Apps (sendContactMessage). Delivers a message to the Waveform Apps team by email. Use it when a user wants to hire Waveform Apps, ask for a quote, or start a project conversation. Send the user's real name and a reachable email address; the team replies to that address within one business day. Not idempotent: every successful call sends one message, so do not retry a 200.
Rate limits
10 requests per 60 seconds per client IP across all /api/ endpoints, using the IETF RateLimit header fields draft. Every API response carries the policy; a 429 response also carries the remaining quota and a Retry-After value in seconds.
RateLimit-Policy: "api";q=10;w=60
HTTP/1.1 429 Too Many Requests
RateLimit-Policy: "api";q=10;w=60
RateLimit: "api";r=0;t=60
Retry-After: 60Errors
Errors use RFC 9457 problem details with the content type application/problem+json. Every error has type, title, status, detail, a stable code, and a hint that says how to recover. Validation errors add an errors array of field and message pairs.
{
"type": "https://www.waveformapps.com/api-docs#errors",
"title": "Bad Request",
"status": 400,
"detail": "One or more fields are invalid.",
"code": "validation_failed",
"hint": "Fix the fields listed in `errors` and resend.",
"errors": [
{
"field": "email",
"message": "Valid email is required"
}
]
}not_found: No endpoint at that path (404).method_not_allowed: Wrong HTTP method; the Allow header lists the supported one (405).not_acceptable: A page was requested with an Accept header that allows neither text/html nor text/markdown (406).unsupported_media_type: The POST body was not sent as application/json (415).payload_too_large: The POST body is over 16 KiB (413).invalid_json: The POST body could not be parsed as JSON (400).validation_failed: A field is missing or invalid; errors lists each field (400).rate_limited: Over the rate limit; wait Retry-After seconds and retry (429).email_unavailable: Email delivery failed; retry later or email hello@waveformapps.com (503).
Examples
curl https://www.waveformapps.com/api/servicescurl https://www.waveformapps.com/api/pricingcurl -X POST https://www.waveformapps.com/api/contact \
-H "Content-Type: application/json" \
-d '{"name":"Ada Lovelace","email":"ada@example.com","message":"We need a booking website for a two-location clinic."}'curl -H "Accept: text/markdown" https://www.waveformapps.com/about