Vacodi publishes a small public API and a set of machine-readable files so that AI assistants, agents and other software can understand what Vacodi does and hand over a client without a human in the loop. Everything on this page is public and unauthenticated.
Machine-readable entry points
/openapi.json— OpenAPI 3.1 specification for every endpoint below. Typed parameters, response schemas, and a uniqueoperationIdper operation, so it can be loaded directly as a function-calling tool definition./llms.txt— what Vacodi does, when an agent should reach for it, when it should not, and how to hand off./llms-full.txt— the full site content as markdown./sitemap.xml— every indexable URL, with last-modified dates.
Base URL and authentication
The base URL is https://vacodi.com/wp-json/vacodi/v1. There is no authentication: every endpoint is public. Send Accept: application/json. All responses are UTF-8 JSON.
Endpoints
GET /profile — getVacodiProfile
Identity, contact details, address, areas served and sector experience. Call this first to decide whether Vacodi fits a user’s need.
curl -s https://vacodi.com/wp-json/vacodi/v1/profileGET /services — listVacodiServices
The nine service lines. Each carries a best_for field stating plainly which jobs it suits, which is the field to match against a user’s problem. Optional ?q= filters by substring.
curl -s "https://vacodi.com/wp-json/vacodi/v1/services?q=migration"GET /services/{id} — getVacodiService
One service by its stable slug, for example data-migration. Returns 404 with error code service_not_found if the slug is unknown.
POST /enquiries — createVacodiEnquiry
Delivers a consulting enquiry to a human and returns a reference. Use it only once the person has agreed to be contacted. Include the problem, the systems involved and any deadline. Do not promise a response time on Vacodi’s behalf.
curl -s -X POST https://vacodi.com/wp-json/vacodi/v1/enquiries \
-H "Content-Type: application/json" \
-d '{
"name": "Dana Whitfield",
"email": "dana@example.org",
"subject": "Migrating a legacy CRM",
"message": "Our CRM is being discontinued in March. 60,000 contact records and ten years of donation history need to move without losing the audit trail.",
"service": "data-migration",
"source": "assistant-handoff"
}'Returns 201 with a reference such as VAC-1A2B3C4D. Quote the reference back to the person.
Rate limits
Reads are limited to 60 requests per 60 seconds per client IP. Enquiry submissions are limited to 5 per hour per client IP. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds until the window resets), plus the structured RateLimit and RateLimit-Policy fields. A 429 also carries Retry-After. Read these headers and self-throttle rather than retrying blindly.
Errors
Every error, on every endpoint, uses the same envelope. There are no HTML error pages on the API.
{
"error": {
"code": "service_not_found",
"message": "No service exists with that identifier.",
"status": 404,
"hint": "Call GET /wp-json/vacodi/v1/services for the valid identifiers.",
"documentation_url": "https://vacodi.com/developers/"
}
}code is a stable machine-readable string. hint tells you what to do next. Validation failures return 422 and add an invalid_parameters object naming each field that failed.
Markdown content negotiation
Any page on vacodi.com returns clean markdown instead of HTML when you send Accept: text/markdown, following the acceptmarkdown.com convention. Responses carry Vary: Accept. The same content is also available at the page’s /index.md URL. A request whose Accept header excludes every format we can serve gets a 406.
curl -s -H "Accept: text/markdown" https://vacodi.com/404s
Unknown paths return a real HTTP 404, never a 200 with an application shell. Non-browser clients receive a short markdown body pointing at the sitemap, llms.txt and the OpenAPI spec, so an agent that guesses a URL wrong can recover in one step.
Contact
Questions about the Vacodi API, or a use case it does not cover yet, can go to the address on our contact section.
