Skip to content

evyAI API

The evyAI API lets a script, a tool or an AI agent act on one user’s evyAI account with a personal access token: read and write connections, notes, to-dos, personas, styles, assets and Agent memory, generate content and images in that user’s voice, create campaign drafts, publish to LinkedIn, and email the user. It shipped in October 2026 under API and MCP in Settings.

If you want Claude to use evyAI rather than writing code, you want the MCP connector instead. Same tools, no code.

  1. Sign in to evyAI and open Settings > API and MCP (direct link).
  2. Click New token, tick the permissions it may use, and pick a lifetime (default 90 days).
  3. Copy it. The token is shown once.

Send it on every call:

Authorization: Bearer <your token>

A token acts as the user who made it, limited to the permissions it was given. There is no organization-level key. Revoke a token from the same Settings page.

The API is RPC-style, not REST. Every operation is a POST to the capability’s name with a JSON body:

POST https://services.api.evyai.com/api/capabilities/<capability.name>
Content-Type: application/json
{ ...input }
  • GET https://services.api.evyai.com/api/capabilities returns the catalog: every capability’s name, description, scope (the permission it needs), effect (read, write or spend) and its input JSON Schema. An agent should call this first and discover the rest. It is the only GET.
  • An OpenAPI 3.1 spec is public at https://services.api.evyai.com/api/capabilities/openapi.json (no token needed).
  • Success: {"success": true, "data": {...}}. Failure: {"success": false, "errorId": N, "message": "..."}.
  • Lists come back as {"total": N, "<plural>": [...]}. Every object carries its id and a deep-link url into the app.
  • Dates are yyyy-MM-dd. Times are wall-clock in the timezone you send (an IANA name such as America/New_York).

37 capabilities, named <area>.<verb>:

AreaCapabilitiesEffect
Profile and brandprofile.get, profile.update, brand.get, socialCard.getread, write
Contentcontent.generate (post, ideas, comment, message and more, in the user’s voice)spend
Imagesimage.generate (can use the user’s photos and logo)spend
Emailemail.sendToMe (only to the account’s own address)write
Connectionsconnections.find, connections.get, connections.create, connections.update, connections.addToList, notes.addread, write
To-dostodos.list, todos.add, todos.update, todos.complete, todos.deleteread, write
Campaignscampaigns.list, campaigns.createDraft, campaigns.createManual, campaigns.addPostsread, write
LinkedInlinkedin.publish (now or scheduled; needs LinkedIn connected in evyAI)write
Personas and stylespersonas.list, personas.create, personas.update, styles.list, styles.create, styles.updateread, write
Assetsassets.list, assets.get, assets.create, assets.updateread, write
Agent memorymemory.list, memory.add, memory.update, memory.deleteread, write

Prospect search, profile preview and unlocking people are available through the MCP connector and are not in the REST catalog at the time of writing.

Each token carries the permissions you ticked. A call without the needed permission returns 403 and names the permission in message.

PermissionCovers
Read / change your own profileprofile.*, brand.get
Read your social cardsocialCard.get
Read / add and change connections, notes and to-dosconnections.*, notes.add, todos.*
Write posts and other content (can cost coins)content.generate, image.generate
Read / create campaignscampaigns.*
Publish and schedule posts on your LinkedInlinkedin.publish
Email things to your own addressemail.sendToMe
Personas and writing stylespersonas.*, styles.*
Assetsassets.*
What the Agent remembers about youmemory.*
EffectCapabilitiesCharge
readevery *.get, *.list, *.findfree
writecreate, update, add, complete, delete, email, campaigns, publishfree
spendcontent.generate, image.generatethe same as the action in the app: 1 evyCoin minimum per text generation (more for longer output) and 5 evyCoins per image on the free plan; text is unlimited on Premium and Pro

Nothing else is metered. See evyCoins.

300 calls per minute per user, announced in standard IETF headers on every response:

ratelimit: "300-in-1min"; r=297; t=15
ratelimit-policy: "300-in-1min"; q=300; w=60

r is calls remaining, t is seconds until reset. Over the limit returns HTTP 429. Read r and back off instead of retry-looping.

HTTPWhen
400input fails validation (required field missing, value out of range)
401missing, invalid, expired or revoked token
403token lacks the permission; message names it
404unknown capability, or an id that is not in this account
409already exists (for example a duplicate LinkedIn URL on connections.create) or the memory is full
429rate limit; wait a minute
500the server could not finish; also returned for malformed JSON bodies
  1. Unknown fields are silently ignored. The schemas say additionalProperties: false, but a misspelled field name does not error, it just does nothing. Required and range checks do fire.
  2. No pagination. connections.find returns at most 20 results and ignores offset. With a search term, total also tops out at 20. Narrow the search instead of paging. Other lists return up to 20 as well.
  3. connections.find does not search LinkedIn URLs. It matches name, company, headline, email and phone. Search the person’s name.
  4. Always send timezone. Leave it out and times are read as UTC.
  5. image.generate returns a signed URL that expires in one hour. Download it right away. The image stays in the user’s in-app history.
  6. content.generate with kind: "ideas" returns one string holding all the ideas, not one element per idea. Split it yourself.
  7. No delete for most records. Connections, notes, personas, styles, assets and campaigns can be created and updated but not deleted through the API. Only to-dos and memories have a delete. Test writes leave real records; exercise the write path with a memory add, update and delete.
  8. linkedin.publish is irreversible. Give date and time to schedule, omit both to post now. It fails with a pointer to Settings if no LinkedIn account is connected.
  9. Campaigns are called workflows in parts of the response. Draft campaigns created through the API are reviewed and launched in the app.
  10. Memory entries are 250 characters and the same ones the in-app Agent reads. What you write here changes how evyAI writes for that user.

Read the user’s profile, then write a post in their voice:

Terminal window
curl -s -X POST https://services.api.evyai.com/api/capabilities/profile.get \
-H "Authorization: Bearer $EVYAI_TOKEN" \
-H "Content-Type: application/json" -d '{}'
curl -s -X POST https://services.api.evyai.com/api/capabilities/content.generate \
-H "Authorization: Bearer $EVYAI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"kind":"post","instructions":"Why follow up beats cold outreach. Include one story from my own experience and end with a question."}'

Check the input schema in the catalog for the exact fields each capability accepts; the catalog is the source of truth and may grow.

💬 Ask evyAI about this