Eden (Creator Platform) API reference
Every endpoint the Eden (Creator Platform) app on Zapier calls, for developers and Zapier's review team.
Every endpoint the Eden (Creator Platform) app on Zapier calls. You don't need this page to use the app. It's for developers and Zapier's review team.
Version 1.0 of the app has the sign-in, the products list, and Record a sale. Everything else on this page belongs to version 1.1.
Sign-in
Eden uses OAuth 2.0 with PKCE.
- Scope: 1.0 asks for
store, which can only call/store-app/v1/*. 1.1 asks forread write, the same access as Eden's MCP connectors, for the workspace steps. - Authorize:
GET https://oauth.eden.so/oauth/authorizewithresponse_type=code,client_id,redirect_uri,state,scope,code_challenge, andcode_challenge_method=S256. - Token:
POST https://oauth.eden.so/oauth/token, form encoded. Sendgrant_type=authorization_codewithcode,redirect_uri,client_id,client_secret, andcode_verifier. - Refresh: the same token URL with
grant_type=refresh_tokenandrefresh_token.
Send the token on every call as Authorization: Bearer <access_token>.
Who is signed in
GET https://api.eden.so/me (the connection test, any Eden account) returns the user and their workspaces. GET https://api.eden.so/store-app/v1/me returns the store owner:
{ "ok": true, "id": "user_123", "email": "[email protected]", "handle": "yourname" }
The seller's products
GET https://api.eden.so/store-app/v1/products
Newest first, own-checkout products on top. Archived products are left out.
{
"ok": true,
"products": [
{
"id": "prod_123",
"name": "My Course (monthly)",
"title": "My Course",
"billing": "monthly",
"live": true,
"ownCheckout": true
}
]
}
Record a sale, renewal, cancel, end, or refund
POST https://api.eden.so/store-app/v1/sales with a JSON body.
| Field | Required | What it is |
|---|---|---|
event | Yes | sale, renewal, cancel, end, or refund |
product | Yes | A product id from the products list |
email | Yes | The email the buyer paid with |
name | No | The buyer's name |
order_id | No | The checkout's order or payment ID. The same ID twice counts once. |
subscription_id | No | The checkout's subscription ID, for memberships |
paid_until | No | When the paid time ends (ISO date or milliseconds) |
ends_at | No | When a cancelled membership's access ends |
What each event does:
- sale and renewal give the buyer access, or extend it on a membership, and send the access email on a first sale.
- cancel keeps access until the paid time runs out. Memberships only.
- end stops access now. Memberships only.
- refund takes access away for that order.
A good answer:
{ "ok": true, "status": "granted" }
status is one of granted, restored, renewed, cancelled, revoked, or duplicate.
When Eden turns a sale away, it says why:
{
"ok": false,
"status": "rejected",
"reason": "product_not_found",
"message": "That product isn't in this Eden store. Pick it again in the Eden step of your Zap."
}
New sales (the New Sale trigger)
GET https://api.eden.so/store-app/v1/sales/recent, optionally ?product=<product id>
Up to 50 paid sales from the last 30 days, newest first, from Eden checkout and the seller's own checkout. Free claims, refunds, and test sales are left out. Zapier keeps the ids it hasn't seen.
utm_*, fbclid, and referrer come from the link an Eden checkout buyer used. They are null when the link had none, and always null for own-checkout sales.
{
"ok": true,
"sales": [
{
"id": "purchase:abc123",
"product_id": "prod_123",
"product_title": "My Course",
"buyer_email": "[email protected]",
"buyer_name": "Sam Buyer",
"amount": 49,
"amount_cents": 4900,
"currency": "usd",
"billing": "one-time",
"source": "eden_checkout",
"order_id": "order_123",
"discount_code": null,
"utm_source": "facebook",
"utm_medium": "paid_social",
"utm_campaign": "spring-launch",
"utm_content": null,
"utm_term": null,
"fbclid": "IwAR0abc123",
"referrer": "facebook.com",
"created_at": "2026-09-27T17:00:00.000Z"
}
]
}
Add a customer (the Add Customer action)
POST https://api.eden.so/store-app/v1/customers with a JSON body. Gives someone free access to a live product without counting a sale.
| Field | Required | What it is |
|---|---|---|
product | Yes | A product id from the products list |
email | Yes | The customer's email |
name | No | The customer's name |
send_email | No | false adds them without the access email. Defaults to true. |
Answers "status": "added" or "already_has_access". It never turns back on access the seller switched off ("reason": "access_off").
More triggers
Each works like New Sale: up to 50 events from the last 30 days, newest first. Most take ?product=<product id>.
| Trigger | Route | List key |
|---|---|---|
| New Customer | GET /store-app/v1/customers/recent | customers |
| New Membership Payment | GET /store-app/v1/memberships/payments | payments |
| Membership Cancelled or Ended | GET /store-app/v1/memberships/changes | changes |
| New Refund | GET /store-app/v1/refunds/recent | refunds |
| New Email Signup | GET /store-app/v1/email-signups/recent | signups |
| New Review | GET /store-app/v1/reviews/recent | reviews |
| New Cohort Signup | GET /store-app/v1/cohort-signups/recent | signups |
| Form Completed | GET /store-app/v1/quiz-responses/recent | responses |
| New Booking | GET /store-app/v1/calls/booked | calls |
| Booking Cancelled | GET /store-app/v1/calls/canceled | calls |
| Booking Rescheduled | GET /store-app/v1/calls/moved | calls |
| New Coaching Application | GET /store-app/v1/coaching-applications/recent | applications |
| New Affiliate | GET /store-app/v1/affiliates/recent | affiliates |
| New Affiliate Application | GET /store-app/v1/affiliates/applications | applications |
| New Affiliate Sale | GET /store-app/v1/affiliates/sales | sales |
| New Testimonial | GET /store-app/v1/testimonials/recent | testimonials |
| Lesson Completed | GET /store-app/v1/lessons/completed | completions |
| New Lesson Question | GET /store-app/v1/lesson-questions/recent | questions |
- New Customer covers sales, free claims, own-checkout sales, imports, and people added by hand.
howisbought,free,own_checkout, oradded. - New Membership Payment covers the first payment and every renewal.
paymentisfirstorrenewal. - Membership Cancelled or Ended has
changeset tocancelled(access runs untilaccess_ends_at) orended(access is over). A cancel and the later end are two events. - New Email Signup fires once per email address. It has no product filter.
- New Review leaves out imported testimonials.
reviewer_emailis empty when Eden can't match the review to a customer. - Form Completed takes
?quiz=<form id>instead of a product.marketing_consentsays whether the person ticked the email box. - Bookings take
?call_type=<call type id>instead of a product;GET /store-app/v1/call-typeslists them. A booking waiting on payment isn't listed until it's paid. Each move is its own Booking Rescheduled event, withprevious_starts_at. - New Affiliate Sale has one event per sale or renewal, with the affiliate's
commission. Refunded sales drop out. - New Testimonial covers testimonials sent through your testimonial link, not imported ones.
- Lesson Completed has
finished_courseset to true on the lesson that finishes the course.
Instant triggers
New Sale, New Customer, New Membership Payment, Membership Cancelled, New Refund, New Email Signup, Form Completed, the three booking triggers, New Coaching Application, and New Affiliate Sale can push instead of poll.
- Subscribe:
POST /store-app/v1/hookswith{ "event": "new_sale", "target_url": "<your Zapier hook>" }. Answers{ "ok": true, "id": "<hook id>" }. Events already in the feed never fire. - Unsubscribe:
DELETE /store-app/v1/hooks/<hook id>. - About every 15 seconds, Eden POSTs
{ "event": "new_sale", "ids": [...] }to the hook. Fetch those ids from the trigger's route above. target_urlmust be azapier.comaddress. A410answer deletes the hook.
Find a customer
GET https://api.eden.so/store-app/v1/customers/find?email=<email>, optionally &product=<product id>
An empty customers list means no match. A match has has_access, products_with_access, and an access list with one line per product.
Customer actions
Each takes a JSON body with product (a product id) and email, plus the fields listed.
| Route | Extra fields | What it does |
|---|---|---|
POST /store-app/v1/customers/remove-access | None | Switches off access. An Eden checkout membership stops billing. |
POST /store-app/v1/customers/access-email | None | Sends the access email again. One per person per minute. |
POST /store-app/v1/customers/cohort | cohort (a cohort id), over_cap (boolean) | Moves an Eden checkout buyer into that cohort. |
GET /store-app/v1/products/<product id>/cohorts lists a product's cohorts for the cohort dropdown.
Create a discount code
POST https://api.eden.so/store-app/v1/discount-codes with a JSON body.
| Field | Required | What it is |
|---|---|---|
product | Yes | A product id. It must have a price and use Eden checkout. |
kind | Yes | percent or amount |
value | Yes | Percent off (1 to 100), or dollars off |
code | No | 3 to 24 letters, numbers, or dashes. Empty makes a random one. |
max_uses | No | How many times it can be used |
expires_at | No | When it stops working (ISO date or milliseconds) |
The answer includes the code and a checkout_url with the code already filled in.
Workspace steps
Same endpoints as Eden's MCP connectors. Each takes a workspace, and defaults to your main one.
| Step | Endpoint |
|---|---|
| Workspace dropdown | GET https://api.eden.so/me |
| Board dropdown | GET https://api.eden.so/workspaces/<id>/mobile/items?type=canvas |
| Custom AI dropdown | GET https://api.eden.so/custom-ai?workspaceId=<id> |
| Schedule dropdown | GET https://scheduling.eden.so/mcp/schedules?workspaceId=<id> |
| Save Link | POST https://api.eden.so/workspace-items/link, then POST /items/<id>/reference for a board |
| Create Note | POST https://api.eden.so/workspace-items/markdown |
| Schedule a Post | POST https://scheduling.eden.so/mcp/schedule-post or /mcp/drafts |
| Post media upload | POST https://api.eden.so/scheduling/media/prepare, then a PUT to the upload URL |
| Ask a Custom AI | POST https://ai.eden.so/zapier/ask |
| New Item Saved | GET https://api.eden.so/workspaces/<id>/mobile/library |
| Post Published | GET https://scheduling.eden.so/mcp/posts?status=posted (and partial) |
| Routine Finished | GET https://ai.eden.so/zapier/routine-runs?workspace_id=<id> |
Ask a Custom AI answers at once with chat_id and chat_url, runs the chat in the background on normal AI credits, then posts { "ok": true, "answer": "..." } to Zapier's callback_url. Eden only posts to Zapier hook addresses. Leave out custom_ai_id to ask Eve.
Routine Finished returns each routine's latest run from the last day, with the answer.
Errors
- 401: the sign-in expired or was removed. Reconnect Eden.
- 402: selling with your own checkout needs a paid Eden plan (Starter or higher).
- 422: a field is missing or not allowed, like an unknown
event. - 429: too many sales at once. Try again in a minute.
- 500: something broke on Eden's side. Try again.
A turned-away sale answers 200 with "ok": false and a reason. The app and a product's sale address share one rate limit, one daily cap, and one event log, so the same order ID sent both ways counts once.
Use the Eden app on Zapier
Connect your store and workspace to thousands of apps, and give buyers access when they pay on any checkout Zapier supports.
Use your own checkout
Sell a product through PayPal, Gumroad, Paystack, or another checkout you already use, and give buyers access on Eden automatically.
Email us. A real person reads every message.
Tell us what you tried and where you got stuck. We answer within one business day.
[email protected]