Eden Routines API
The Routines API from Eden — 3 operation(s) for routines.
The Routines API from Eden — 3 operation(s) for routines.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/eden-so:eden-so-routines-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Eden workspace Routines API
version: 1.0.0
summary: Every Eden MCP tool as a plain HTTPS call.
description: 'Each tool in Eden''s MCP server (`https://mcp.eden.so/mcp`) also runs as `POST /v1/tools/` with its arguments as the JSON body: Discover search, creator analysis, the ads library, scheduling, analytics, boards, notes, tables, Custom AIs, and the store.
**Sign in:** `Authorization: Bearer `, an Eden API key from Settings → API (`eden_pat_…`) or an OAuth access token. Read-only keys can''t run write tools, and a Custom key only sees the tools its access allows.
**Credits and limits:** the same as MCP. Research tools cost 0.1 to 0.5 AI credits a call; saving, scheduling, and reading your own workspace are free. 120 calls a minute per key, shared with MCP.
**Answers:** the tool''s own `{ ok: true, ... }` or `{ ok: false, status, message }`, with the HTTP status mirroring `status`.
Invite-only tools are left out of this file; `GET /v1/tools` lists what a key can use. The store API (sales, customers, products, webhooks) is a separate spec: https://api.eden.so/store-app/v1/openapi.json'
contact:
name: Eden
url: https://eden.so/help/api/use-the-eden-api/
termsOfService: https://eden.so/terms/
servers:
- url: https://mcp.eden.so
description: Eden workspace API
security:
- apiKey: []
tags:
- name: Routines
paths:
/v1/tools/eden_create_routine:
post:
operationId: eden_create_routine
summary: Create routine
description: 'Create a routine: a recurring task Eden runs automatically on a schedule (at most once a day). Each run opens a FRESH Eden chat and sends the routine''s prompt exactly as if the user typed it; pass `customAIId` so every run is a chat with that Custom AI (its instructions, knowledge, and voice). Use it when the user asks for something recurring: ''every Monday at 9am…'', ''each weekday morning…'', ''once a month…''. Write the prompt as a complete, self-contained instruction for an unattended run (the run''s chat cannot see this conversation and nobody watches it live): open it with ''This is a scheduled routine run: work autonomously, do not ask questions, state any assumptions, and finish with the complete result'', name the exact notes or boards it should read or update, and never have it schedule or publish anything the user did not explicitly ask for as a standing instruction. `timezone` is required over MCP: ask the user, or reuse the schedule timezone from eden_list_schedules. Call eden_list_routines first to avoid creating a duplicate, and confirm the schedule back to the user in plain words. This is a real write. Do NOT use it to schedule a social post — that is eden_schedule_post.'
tags:
- Routines
x-read-only: false
x-destructive: false
requestBody:
required: false
content:
application/json:
schema:
$schema: http://json-schema.org/draft-07/schema#
type: object
properties:
workspaceId:
description: Workspace id from eden_list_workspaces. Optional when a default workspace is set.
type: string
minLength: 1
title:
type: string
minLength: 1
maxLength: 120
description: Short human name, e.g. 'Weekly analytics review'.
prompt:
type: string
minLength: 1
maxLength: 8000
description: The full instruction sent at each run. Self-contained; opens with the autonomy line described above.
frequency:
type: string
enum:
- daily
- weekdays
- weekly
- monthly
dayOfWeek:
description: 'Required for weekly: 0 = Sunday … 6 = Saturday.'
type: integer
minimum: 0
maximum: 6
dayOfMonth:
description: 'Required for monthly: 1-28.'
type: integer
minimum: 1
maximum: 28
hour:
type: integer
minimum: 0
maximum: 23
description: Local hour, 24h clock.
minute:
description: Default 0.
type: integer
minimum: 0
maximum: 59
timezone:
type: string
minLength: 1
maxLength: 128
description: 'IANA zone the routine runs in, e.g. ''America/Chicago''. Required: ask the user or reuse the schedule timezone from eden_list_schedules.'
customAIId:
description: Bind every run to this Custom AI (id from eden_list_custom_ai or the eden_create_custom_ai result). Omit for a plain Eden chat run.
type: string
minLength: 1
target:
description: 'eve = an Eve routine: each run starts a new chat and adds a card to Updates on Eve''s page (only for users who have Eve; ignores customAIId). Then write the prompt in their voice with just the job, its bar, and the layout, and no autonomy line (see references/routines.md). Omit or chat = a fresh Eden chat per run.'
type: string
enum:
- eve
- chat
modelMode:
description: 'Chat model for every run: regular = Eve Fast, max = Eve Max, sonnet = Claude Sonnet, gptsol = GPT Sol, kimi = Kimi, opus = Claude Opus. Omit for Eden''s normal tier-aware default; never ask the user which model to use.'
type: string
enum:
- regular
- max
- sonnet
- gptsol
- kimi
- opus
emailOnFinish:
description: true = email the user the run's result each time it finishes. Off by default; set it when the user asks to be emailed.
type: boolean
required:
- title
- prompt
- frequency
- hour
- timezone
responses:
'200':
description: 'The tool''s result: `{ ok: true, ... }`. Tools that answer plain text come back as `{ ok: true, text }`.'
content:
application/json:
schema:
type: object
'400':
$ref: '#/components/responses/Failure'
'401':
$ref: '#/components/responses/Failure'
'402':
$ref: '#/components/responses/Failure'
'403':
$ref: '#/components/responses/Failure'
'404':
$ref: '#/components/responses/Failure'
'409':
$ref: '#/components/responses/Failure'
'422':
$ref: '#/components/responses/Failure'
'429':
$ref: '#/components/responses/Failure'
'500':
$ref: '#/components/responses/Failure'
'503':
$ref: '#/components/responses/Failure'
/v1/tools/eden_list_routines:
post:
operationId: eden_list_routines
summary: List routines
description: 'List the user''s routines in a workspace: recurring chat runs Eden performs on a schedule (at most once a day), each with its schedule, prompt, bound Custom AI, on/off state, next run, and last run outcome. Use it when the user asks what routines they have, before creating one (to avoid a duplicate), or to find a `routineId` for eden_update_routine. Routines are NOT scheduled social posts — those are eden_list_scheduled_posts.'
tags:
- Routines
x-read-only: true
x-destructive: false
requestBody:
required: false
content:
application/json:
schema:
$schema: http://json-schema.org/draft-07/schema#
type: object
properties:
workspaceId:
description: Workspace id from eden_list_workspaces. Optional when a default workspace is set.
type: string
minLength: 1
customAIId:
description: Only routines bound to this Custom AI (id from eden_list_custom_ai).
type: string
minLength: 1
target:
description: Only Eve's routines (each run a new chat with a card in Updates on Eve's page).
type: string
const: eve
responses:
'200':
description: 'The tool''s result: `{ ok: true, ... }`. Tools that answer plain text come back as `{ ok: true, text }`.'
content:
application/json:
schema:
type: object
'400':
$ref: '#/components/responses/Failure'
'401':
$ref: '#/components/responses/Failure'
'402':
$ref: '#/components/responses/Failure'
'403':
$ref: '#/components/responses/Failure'
'404':
$ref: '#/components/responses/Failure'
'409':
$ref: '#/components/responses/Failure'
'422':
$ref: '#/components/responses/Failure'
'429':
$ref: '#/components/responses/Failure'
'500':
$ref: '#/components/responses/Failure'
'503':
$ref: '#/components/responses/Failure'
/v1/tools/eden_update_routine:
post:
operationId: eden_update_routine
summary: Update routine
description: 'Change, pause, resume, or delete an existing routine. Find the `routineId` with eden_list_routines first. Pass `remove: true` to delete it permanently; `enabled: false` pauses without deleting and `enabled: true` resumes. Any schedule or prompt field passed replaces the current value (a weekly/monthly change needs its day field too). Confirm a delete with the user before calling.'
tags:
- Routines
x-read-only: false
x-destructive: true
requestBody:
required: false
content:
application/json:
schema:
$schema: http://json-schema.org/draft-07/schema#
type: object
properties:
routineId:
type: string
minLength: 1
description: Routine id from eden_list_routines.
remove:
description: true = delete the routine permanently.
type: boolean
enabled:
description: false pauses, true resumes.
type: boolean
title:
type: string
minLength: 1
maxLength: 120
prompt:
type: string
minLength: 1
maxLength: 8000
frequency:
type: string
enum:
- daily
- weekdays
- weekly
- monthly
dayOfWeek:
type: integer
minimum: 0
maximum: 6
dayOfMonth:
type: integer
minimum: 1
maximum: 28
hour:
type: integer
minimum: 0
maximum: 23
minute:
type: integer
minimum: 0
maximum: 59
timezone:
description: IANA zone.
type: string
minLength: 1
maxLength: 128
customAIId:
description: Bind runs to this Custom AI; pass null to unbind (plain Eden chat runs).
anyOf:
- type: string
- type: 'null'
target:
description: eve makes future runs Eve's (a card in Updates on Eve's page per run); chat makes them plain chat runs.
type: string
enum:
- eve
- chat
modelMode:
description: Change the chat model used for future runs.
type: string
enum:
- regular
- max
- sonnet
- gptsol
- kimi
- opus
emailOnFinish:
description: true = email the run's result on finish; false turns it off.
type: boolean
required:
- routineId
responses:
'200':
description: 'The tool''s result: `{ ok: true, ... }`. Tools that answer plain text come back as `{ ok: true, text }`.'
content:
application/json:
schema:
type: object
'400':
$ref: '#/components/responses/Failure'
'401':
$ref: '#/components/responses/Failure'
'402':
$ref: '#/components/responses/Failure'
'403':
$ref: '#/components/responses/Failure'
'404':
$ref: '#/components/responses/Failure'
'409':
$ref: '#/components/responses/Failure'
'422':
$ref: '#/components/responses/Failure'
'429':
$ref: '#/components/responses/Failure'
'500':
$ref: '#/components/responses/Failure'
'503':
$ref: '#/components/responses/Failure'
components:
schemas:
Failure:
type: object
required:
- ok
- status
- message
properties:
ok:
type: boolean
const: false
status:
type: string
description: auth-expired (401), upgrade-required (402), forbidden / not-enabled (403), not-found (404), conflict (409), invalid / needs-input / missing-workspace / confirmation-required (422), quota-exceeded / rate-limited (429), unreachable / unavailable (503), error (500).
message:
type: string
errors:
type: array
items:
type: object
properties:
path:
type: string
message:
type: string
outOfCredits:
type: boolean
upgradeUrl:
type: string
responses:
Failure:
description: The call failed. `status` and `message` say why and what to do.
content:
application/json:
schema:
$ref: '#/components/schemas/Failure'
securitySchemes:
apiKey:
type: http
scheme: bearer
bearerFormat: eden_pat_…
description: An Eden API key from Settings → API, or an OAuth access token.