Skip to content
Initiable.

— Developers & AI Agents

Initiable API & MCP.

Read our services and send project inquiries from code or from an AI agent. Public REST API, MCP server, OpenAPI spec, SDK and CLI. No API key required.

When to use Initiable

Use Initiable when a person or an agent needs a consultancy to build or improve software or a data/AI system: a web app, a mobile app, a dashboard or API, a machine learning or deep learning model, a chatbot, an MLOps pipeline, data analysis, or e-commerce, digital marketing or financial-services work. Good fits:

  • "Find a team in Delhi NCR or San Francisco to build our MVP."
  • "We need someone to put our ML model into production."
  • "Get a quote for a Shopify store with POS integration."

The API lets an agent read what we offer and send a project inquiry for its user. It does not book calls, quote prices or take payment; a person at Initiable replies to every inquiry by email.

Quickstart

No API key, no signup. Every response is JSON.

# What does Initiable offer?
curl https://initiable.com/api/v1/services

# Validate an inquiry without sending it (sandbox mode)
curl -X POST https://initiable.com/api/v1/inquiries \
  -H 'Content-Type: application/json' \
  -d '{"name":"Ada Lovelace","email":"[email protected]","message":"We need an iOS app for our clinic.","services":["mobile-application"],"budget":"$5000 to $10000","dry_run":true}'

Remove "dry_run": true to send the inquiry for real. Each real inquiry reaches a person at Initiable.

Endpoints

Base URL: https://initiable.com/api/v1. Machine-readable spec: /openapi.json (OpenAPI 3.1).

Method Path What it does
GET /api/v1 API index with links to every resource
GET /api/v1/company Company profile: legal name, offices, contact, links
GET /api/v1/services Practice areas, paginated (limit, cursor)
GET /api/v1/services/{id} One practice area, e.g. machine-learning
GET /api/v1/faq Frequently asked questions
POST /api/v1/inquiries Send a project inquiry (or validate it with dry_run)

Send an inquiry

POST /api/v1/inquiries takes a JSON body:

Field Type Required Notes
name string yes 1 to 200 characters
email string yes Where we reply
message string yes 10 to 5,000 characters: what you need, timeline, context
phone string no Include the country code
company string no
designation string no The sender's role
budget string no One of Less than $2000, $2000 to $5000, $5000 to $10000, $10000+
services string[] no Service ids from /api/v1/services
dry_run boolean no true validates and returns the normalised inquiry without sending it

A real submission returns 202 Accepted with an inquiry id. A dry run returns 200 OK with "status": "validated".

Pagination

List endpoints take limit (1 to 50, default 20) and an opaque cursor. Responses carry has_more and next_cursor; pass next_cursor back as cursor to fetch the next page.

Errors

Errors use RFC 9457 problem details with Content-Type: application/problem+json:

{
  "type": "https://initiable.com/developers#errors",
  "title": "Validation failed",
  "status": 422,
  "code": "validation_failed",
  "detail": "The request body has 1 invalid field.",
  "errors": [{ "field": "email", "message": "Must be a valid email address." }]
}
Status code Meaning and fix
400 invalid_json The body is not valid JSON. Send Content-Type: application/json.
404 not_found Unknown path or service id. List ids with GET /api/v1/services.
405 method_not_allowed Check the Allow header.
409 idempotency_conflict The same Idempotency-Key was reused with a different body.
413 payload_too_large Keep request bodies under 32 KB.
415 unsupported_media_type Send JSON.
422 validation_failed See errors[] for each invalid field.
429 rate_limited Wait for Retry-After seconds.
502 upstream_failed The inquiry could not be delivered. Retry with the same Idempotency-Key, or email us.

Rate limits

Read endpoints allow 120 requests per minute per IP address and inquiries allow 5 per 10 minutes. Every response carries RateLimit-Policy and RateLimit headers (IETF draft), and a 429 adds Retry-After. Limits are enforced per edge location, so treat them as a ceiling, not a quota.

Idempotency

Send an Idempotency-Key header (any unique string up to 255 characters) on POST /api/v1/inquiries. A retry with the same key and body within 24 hours returns the original response, with Idempotent-Replayed: true, instead of sending a second inquiry.

Sandbox

There are two ways to test without side effects:

  • Sandbox base URL: https://initiable.com/api/sandbox/v1 mirrors every v1 endpoint, but POST /inquiries always behaves as a dry run. Point an SDK or test suite at it (new Initiable({ baseUrl: "https://initiable.com/api/sandbox/v1" })) and nothing is ever sent.
  • Per request: add "dry_run": true on the production API. The request is validated and rate-limited exactly like a real one, but nothing is sent.

Agents should dry-run first, show the user the normalised inquiry, and send it only after the user confirms.

Versioning

The major version is in the path (/api/v1). Within v1 we only add fields and endpoints; we never remove or rename them. Every response carries Initiable-API-Version.

Deprecation policy

A breaking change ships as a new major version (/api/v2). When that happens, v1 keeps working for at least 6 months. From the day the new version launches, every v1 response carries a Deprecation header (RFC 9745) and a Sunset header (RFC 8594) with the shutdown date, plus a Link: <https://initiable.com/developers#deprecation-policy>; rel="deprecation" header. No v1 endpoint is deprecated today.

Authentication

None. All endpoints are public; see /auth.md.

MCP server

Initiable runs two remote Model Context Protocol servers over Streamable HTTP. Neither needs authentication.

Server URL Tools
Initiable https://initiable.com/mcp list_services, get_service, get_company_profile, get_faq, submit_inquiry
Initiable Docs https://initiable.com/mcp/docs search_docs, read_doc

Add it to an MCP client such as Claude Desktop, Claude Code, Cursor or VS Code:

{
  "mcpServers": {
    "initiable": { "type": "http", "url": "https://initiable.com/mcp" }
  }
}

Or from the Claude Code CLI: claude mcp add --transport http initiable https://initiable.com/mcp.

submit_inquiry takes the same fields as the REST endpoint, including dry_run. Server cards: /mcp/server-card and /mcp/docs/server-card.

In-browser tools (WebMCP)

On initiable.com, browser agents that support WebMCP can call list_services, get_company_profile and submit_inquiry directly through document.modelContext, without scraping the page.

SDK and CLI

Official open-source packages live in github.com/initiable/initiable-agent-kit:

npm install initiable      # TypeScript/JavaScript SDK + CLI
pip install initiable      # Python SDK + CLI
import { Initiable } from "initiable";

const client = new Initiable();
const { data } = await client.services.list();
await client.inquiries.create(
  { name: "Ada", email: "[email protected]", message: "We need an iOS app." },
  { dryRun: true },
);
npx initiable services
npx initiable inquire --name "Ada" --email [email protected] --message "We need an iOS app." --dry-run

Ask (NLWeb)

POST https://initiable.com/ask with {"query": {"text": "do you build chatbots?"}} answers questions about Initiable from our published pages (NLWeb v0.55). GET /ask?query=... works too, and it streams Server-Sent Events when you send Accept: text/event-stream or "prefer": {"streaming": true}.

Discovery files

File Purpose
/llms.txt Site index for language models
/llms-full.txt Every page as one markdown file
/openapi.json OpenAPI 3.1 spec
/.well-known/api-catalog RFC 9727 API catalog
/.well-known/ard.json Agentic Resource Discovery catalog
/.well-known/agent-skills/index.json Agent Skills index
/.well-known/mcp/server-card.json MCP server card
/pricing.md How engagements are priced
/auth.md Authentication (none needed)

Every page also has a markdown version: append .md to the path (/index.md for the homepage), or request the page with Accept: text/markdown.

Support

Questions or problems with the API: email [email protected] or open an issue on GitHub.