enso.bot / developers

Developer portal

Everything an agent - or a human building one - needs to read from, write to and navigate enso. Public REST endpoints, an OpenAPI 3.1 spec, a landing page write API, an authenticated signal stream, an MCP server and a full map of the site.

19
documented endpoints
4
API surfaces
3
auth modes
9
machine-readable files

Quickstart

Base URL is https://www.enso.bot. Everything speaks JSON. Read endpoints need nothing; write and signal endpoints take a key header; the MCP endpoint speaks OAuth 2.1.

1
Read something public

Hit /api/public/v1/company and you have the whole company model in one call.

2
Load the spec

Feed /openapi.json to your client generator or your agent's tool loader.

3
Ask for a key

Content and Signal APIs are issued per partner. Request one at /contact.

4
Or skip HTTP entirely

Point an MCP client at /mcp and the same data arrives as tools.

curl -sS https://www.enso.bot/api/public/v1/company | jq '.name, .agents[].name'

Authentication

no key

Public read

All /api/public/v1/* content endpoints and every .txt / .md / .json file. CORS is open, responses are cacheable.

x-api-key

Partner key

Content API (CONTENT_API_KEY) and Signal API (SIGNALS_API_KEY). Send on every request; Authorization: Bearer also works for signals.

OAuth 2.1

MCP

Dynamic Client Registration, discovery at /.well-known/oauth-authorization-server, scopes openid email profile.

Content API

x-api-key

Publish on-brand landing pages at /p/{slug}. Send content only - the enso design system supplies layout, styling and customer logos. Every write passes a brand quality gate.

POST
POST /api/public/content/pages/generate

Send a brief, enso writes the copy and hero visual and saves a draft

POST
POST /api/public/content/pages

Create or replace a page from finished blocks

GET
GET /api/public/content/pages

List pages

GET
GET /api/public/content/pages/{slug}

Read one page

PATCH
PATCH /api/public/content/pages/{slug}

Partial edit

DELETE
DELETE /api/public/content/pages/{slug}

Unpublish (soft delete)

curl -X POST https://www.enso.bot/api/public/content/pages/generate \
  -H "x-api-key: $CONTENT_API_KEY" \
  -H "content-type: application/json" \
  -d '{"slug":"agentic-seo-for-fintech",
       "topic":"Getting fintech brands cited inside AI answers",
       "icp":"Growth leads at Series B fintech companies",
       "proof":["64 citations placed","47 still live after 90 days"],
       "cta_label":"Book a call","cta_href":"/book-a-call"}'

Reference: /content-api.md

Signal API

x-api-key

Every touch a person or account has with enso.bot - form fills, URL submissions, reads and unlocks, newsletter signups, wizard progress, email opens and clicks - normalized into one pollable event stream.

GET
GET /api/public/v1/signals

Newest-first event stream across every source

Query: since, until, days, type, domain, email, q, limit

GET
GET /api/public/v1/signals/accounts

Events rolled up per company domain

Query: since, days, stage, limit

GET
GET /api/public/v1/signals/accounts/{domain}

One account: summary, people, full timeline

GET
GET /api/public/v1/signals/people/{email}

One person: summary and full timeline

curl -sS "https://www.enso.bot/api/public/v1/signals?days=7&limit=500" \
  -H "x-api-key: $SIGNALS_API_KEY"

curl -sS https://www.enso.bot/api/public/v1/signals/accounts/acme.com \
  -H "x-api-key: $SIGNALS_API_KEY"

Reference: /signals-api.md · /signals-agent.md

Public read API

no key

Open, read-only JSON about enso: the company, the blog, the research ledger and open roles. No key, no rate-limit signup, CORS enabled.

GET
GET /api/public/v1/company

Company overview: agents, engagement model, founders, canonical URLs

GET
GET /api/public/v1/blog

Index of blog posts with slugs, titles, authors and URLs

GET
GET /api/public/v1/research

Index of Agentic Lab research experiments

GET
GET /api/public/v1/research/{slug}

Full write-up for one experiment

GET
GET /api/public/v1/careers

Open roles with slug, title, tagline, location

GET
GET /api/public/v1/careers/{slug}

Full description for one role

curl -sS https://www.enso.bot/api/public/v1/research | jq '.experiments[0]'
curl -sS https://www.enso.bot/api/public/v1/company | jq '.agents'

Reference: /openapi.json

MCP server

OAuth 2.1

Model Context Protocol server over streamable HTTP, protected by OAuth 2.1 with Dynamic Client Registration. Point Claude, Cursor or any MCP client at it and the enso knowledge base becomes tool-callable.

ANY
ANY /mcp

MCP endpoint. Tools: get_company_info, list_experiments, get_experiment, list_blog_posts, list_careers, get_career

GET
GET /.well-known/oauth-authorization-server

RFC 8414 authorization server metadata

GET
GET /.well-known/oauth-protected-resource

RFC 9728 protected resource metadata for /mcp

{
  "mcpServers": {
    "enso": { "url": "https://www.enso.bot/mcp" }
  }
}

Reference: Setup guide

Errors and limits

200 / 201

Success. Every body is an object with ok: true plus the payload.

400

invalid_domain, invalid_email or a malformed query parameter.

401

unauthorized - missing or wrong key.

404

not_found - unknown slug or route.

422

invalid_payload with issues[] naming each field that failed the brand or schema gate.

502

The authoring model failed. Safe to retry once.

Signal ids are stable (source:row_id) so they double as idempotency keys. Poll the signal stream on next_since rather than a fixed interval, and keep account lookups - they return seen: false instead of a 404, so they are safe as an enrichment check.

Machine-readable files

Site map

Every public surface on enso.bot, grouped by intent. Content routes are server-rendered, so a plain HTTP GET returns the full HTML - title, headings, body copy and links - on the first byte.

Need a key, or something the API does not expose yet?

Tell us what you are building and we will issue credentials and shape the endpoint around it.