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.
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.
- Sign in to Eodly as a founder or lead at eodly.io/login, then open Settings → API keys.
- Create a key. Give it a name, choose the scopes it needs (request only what is required), and create it.
- 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. - Call the API. Send the key on every request in the
Authorizationheader:
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.
Scopes
Keys carry one or more read-only scopes. An agent should request only the scopes it needs.
| Scope | Grants |
|---|---|
reports:read | Read end-of-day reports for the key's organization. |
team:read | Read 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
Identify the calling key. No scope required.
{
"organization": { "id": "0b1e...", "name": "Acme Inc" },
"scopes": ["reports:read", "team:read"]
}
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
}
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": [ ... ]
}
}
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:
| Status | error | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
403 | insufficient_scope | Valid key, but it lacks the required scope. |
404 | not_found | No such resource in the key's organization. |
429 | rate_limited | Too 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.
| Transport | How |
|---|---|
| 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
- OpenAPI 3.1 specification (/openapi.json)
- llms.txt resource index (/llms.txt)
- Privacy and data processing
- Questions: support@eodly.io