Vacodi Developer & Agent API Documentation

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 unique operationId per 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/profile

GET /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.