Developers

Eodly API for AI agents

Eodly turns what your team actually did into one sourced end-of-day report each evening. This API gives an AI agent or script read-only, scoped access to those reports and your team roster.

Base URL
https://eodly.io/api/v1
Authentication
Bearer API key (eodly_sk_...)
Format
JSON over HTTPS
Scopes
reports:read, team:read

The machine-readable contract is published as an OpenAPI 3.1 specification, and this site lists its resources in llms.txt.

Authentication

Eodly uses long-lived, organization-scoped API keys. Every request to the API must include a key as a Bearer token. Here is how an agent obtains and uses one.

  1. Sign in to Eodly as a founder or lead at eodly.io/login, then open Settings → API keys.
  2. Create a key. Give it a name, choose the scopes it needs (request only what is required), and create it.
  3. Copy the secret. The full key (eodly_sk_...) is shown once. Store it somewhere your agent can read it securely, such as an environment variable. Eodly stores only a hash and can never show it again.
  4. Call the API. Send the key on every request in the Authorization header:
Authorization: Bearer eodly_sk_YOUR_KEY

The X-API-Key: eodly_sk_YOUR_KEY header is also accepted. Verify a key any time by calling GET /api/v1/me, which returns the organization the key belongs to and the scopes it holds. Revoke a key from the same Settings page; revocation takes effect immediately.

Keep keys secret. An Eodly API key grants read access to a workspace's reports and roster. Treat it like a password: never commit it to source control or expose it in client-side code. Use a separate key per agent so you can revoke one without disrupting the others.

Scopes

Keys carry one or more read-only scopes. An agent should request only the scopes it needs.

ScopeGrants
reports:readRead end-of-day reports for the key's organization.
team:readRead the team roster for the key's organization.

A request with a valid key but a missing scope returns 403 with {"error":"insufficient_scope","required_scope":"..."}.

Endpoints

GET/api/v1/me

Identify the calling key. No scope required.

{
  "organization": { "id": "0b1e...", "name": "Acme Inc" },
  "scopes": ["reports:read", "team:read"]
}
GET/api/v1/reports

reports:read  Recent end-of-day report summaries, most recent first. Optional ?limit= (1 to 50, default 14).

{
  "reports": [
    {
      "id": "9c2f...",
      "scope": "org",
      "scope_target_id": null,
      "generated_at": "2026-06-16T19:00:00.000Z",
      "headline": "3 shipped, 1 slipping, 1 silent"
    }
  ],
  "count": 1
}
GET/api/v1/reports/{id}

reports:read  The full structured content of a single report: KPI status, what shipped, who was silent, what is slipping, and blockers.

{
  "id": "9c2f...",
  "scope": "org",
  "generated_at": "2026-06-16T19:00:00.000Z",
  "report": {
    "headline": "3 shipped, 1 slipping, 1 silent",
    "kpi_status": [ ... ],
    "shipped": [ ... ],
    "silent": [ ... ],
    "slipping": [ ... ],
    "blockers": [ ... ]
  }
}
GET/api/v1/team

team:read  The team roster. Personal contact details (email, chat IDs) are intentionally omitted.

{
  "members": [
    { "id": "4a7d...", "name": "Ada Okafor", "role": "lead", "department": "Engineering", "is_external": false, "active": true }
  ],
  "count": 1
}

Code examples

curl

curl https://eodly.io/api/v1/reports \
  -H "Authorization: Bearer eodly_sk_YOUR_KEY"

JavaScript (fetch)

const res = await fetch("https://eodly.io/api/v1/reports", {
  headers: { Authorization: "Bearer " + process.env.EODLY_API_KEY },
});
const { reports } = await res.json();

Python (requests)

import os, requests

res = requests.get(
    "https://eodly.io/api/v1/reports",
    headers={"Authorization": f"Bearer {os.environ['EODLY_API_KEY']}"},
)
res.raise_for_status()
print(res.json()["reports"])

Rate limits & errors

The API allows up to 120 requests per minute per key. Over the limit returns 429. Errors are JSON with a stable error code and a human-readable message:

StatuserrorMeaning
401unauthorizedMissing or invalid API key.
403insufficient_scopeValid key, but it lacks the required scope.
404not_foundNo such resource in the key's organization.
429rate_limitedToo many requests; slow down.

MCP server

Eodly is also available as an MCP server, so an agent in Claude or Cursor can call Eodly as a tool. Both transports use the same eodly_sk_ API key and scopes.

TransportHow
Remote (Streamable HTTP)Point your MCP client at https://eodly.io/api/mcp.
Local (stdio, npm)npx -y @eodly/mcp with EODLY_API_KEY set.

Tools: whoami, list_reports, get_report, list_team. Example client config:

{
  "mcpServers": {
    "eodly": {
      "command": "npx",
      "args": ["-y", "@eodly/mcp"],
      "env": { "EODLY_API_KEY": "eodly_sk_..." }
    }
  }
}

Package: @eodly/mcp on npm. Server card: /.well-known/mcp/server-card.json.

Resources