Eden AI

Eden (Creator Platform) API reference

Every endpoint the Eden (Creator Platform) app on Zapier calls, for developers and Zapier's review team.

·6 min read

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 for read write, the same access as Eden's MCP connectors, for the workspace steps.
  • Authorize: GET https://oauth.eden.so/oauth/authorize with response_type=code, client_id, redirect_uri, state, scope, code_challenge, and code_challenge_method=S256.
  • Token: POST https://oauth.eden.so/oauth/token, form encoded. Send grant_type=authorization_code with code, redirect_uri, client_id, client_secret, and code_verifier.
  • Refresh: the same token URL with grant_type=refresh_token and refresh_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.

FieldRequiredWhat it is
eventYessale, renewal, cancel, end, or refund
productYesA product id from the products list
emailYesThe email the buyer paid with
nameNoThe buyer's name
order_idNoThe checkout's order or payment ID. The same ID twice counts once.
subscription_idNoThe checkout's subscription ID, for memberships
paid_untilNoWhen the paid time ends (ISO date or milliseconds)
ends_atNoWhen 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.

FieldRequiredWhat it is
productYesA product id from the products list
emailYesThe customer's email
nameNoThe customer's name
send_emailNofalse 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>.

TriggerRouteList key
New CustomerGET /store-app/v1/customers/recentcustomers
New Membership PaymentGET /store-app/v1/memberships/paymentspayments
Membership Cancelled or EndedGET /store-app/v1/memberships/changeschanges
New RefundGET /store-app/v1/refunds/recentrefunds
New Email SignupGET /store-app/v1/email-signups/recentsignups
New ReviewGET /store-app/v1/reviews/recentreviews
New Cohort SignupGET /store-app/v1/cohort-signups/recentsignups
Form CompletedGET /store-app/v1/quiz-responses/recentresponses
New BookingGET /store-app/v1/calls/bookedcalls
Booking CancelledGET /store-app/v1/calls/canceledcalls
Booking RescheduledGET /store-app/v1/calls/movedcalls
New Coaching ApplicationGET /store-app/v1/coaching-applications/recentapplications
New AffiliateGET /store-app/v1/affiliates/recentaffiliates
New Affiliate ApplicationGET /store-app/v1/affiliates/applicationsapplications
New Affiliate SaleGET /store-app/v1/affiliates/salessales
New TestimonialGET /store-app/v1/testimonials/recenttestimonials
Lesson CompletedGET /store-app/v1/lessons/completedcompletions
New Lesson QuestionGET /store-app/v1/lesson-questions/recentquestions
  • New Customer covers sales, free claims, own-checkout sales, imports, and people added by hand. how is bought, free, own_checkout, or added.
  • New Membership Payment covers the first payment and every renewal. payment is first or renewal.
  • Membership Cancelled or Ended has change set to cancelled (access runs until access_ends_at) or ended (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_email is empty when Eden can't match the review to a customer.
  • Form Completed takes ?quiz=<form id> instead of a product. marketing_consent says whether the person ticked the email box.
  • Bookings take ?call_type=<call type id> instead of a product; GET /store-app/v1/call-types lists them. A booking waiting on payment isn't listed until it's paid. Each move is its own Booking Rescheduled event, with previous_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_course set 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/hooks with { "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_url must be a zapier.com address. A 410 answer 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.

RouteExtra fieldsWhat it does
POST /store-app/v1/customers/remove-accessNoneSwitches off access. An Eden checkout membership stops billing.
POST /store-app/v1/customers/access-emailNoneSends the access email again. One per person per minute.
POST /store-app/v1/customers/cohortcohort (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.

FieldRequiredWhat it is
productYesA product id. It must have a price and use Eden checkout.
kindYespercent or amount
valueYesPercent off (1 to 100), or dollars off
codeNo3 to 24 letters, numbers, or dashes. Empty makes a random one.
max_usesNoHow many times it can be used
expires_atNoWhen 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.

StepEndpoint
Workspace dropdownGET https://api.eden.so/me
Board dropdownGET https://api.eden.so/workspaces/<id>/mobile/items?type=canvas
Custom AI dropdownGET https://api.eden.so/custom-ai?workspaceId=<id>
Schedule dropdownGET https://scheduling.eden.so/mcp/schedules?workspaceId=<id>
Save LinkPOST https://api.eden.so/workspace-items/link, then POST /items/<id>/reference for a board
Create NotePOST https://api.eden.so/workspace-items/markdown
Schedule a PostPOST https://scheduling.eden.so/mcp/schedule-post or /mcp/drafts
Post media uploadPOST https://api.eden.so/scheduling/media/prepare, then a PUT to the upload URL
Ask a Custom AIPOST https://ai.eden.so/zapier/ask
New Item SavedGET https://api.eden.so/workspaces/<id>/mobile/library
Post PublishedGET https://scheduling.eden.so/mcp/posts?status=posted (and partial)
Routine FinishedGET 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.

Still stuck?

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]