Every request uses your academy base URL and a live key:API access is a paid capability. On a preview trial the API returns
402 trial_api_unavailable until you upgrade.Choosing between enrollments, lists, and offers
Access in Fayne has three moving parts. Reach for the right one before you write any code.Enrollment
A permanent, individual assignment. You grant one student one course, and it stays until you revoke it by hand. Good for one-off comps and manual onboarding.
List
A revocable cohort. A student in a list holds every course that an offer grants to that list. Add and remove members freely, and access follows their membership live.
Offer
The thing that actually grants or sells access to courses. Offers are configured in your dashboard, never created through the API. A list only grants courses because an offer points at it.
Give a cohort access to a set of courses
This is the flagship pattern: you have a group (a paid cohort, a partner’s team, a membership tier) that should see a specific set of courses, and you want to add and remove people through the API. The shape is always the same. In the dashboard you build a free, hidden offer that covers the courses and grants them to a manual list. Through the API you then manage who is in that list. Membership is the on/off switch for the whole cohort.Lock the courses (dashboard)
For each course in the set, open its access controls and set it to require an offer instead of being free to everyone. A locked course is unreachable unless something grants it, so the cohort will be the only way in.Optionally, hide each course from the catalog as well. Locking controls access; catalog visibility controls discoverability. They are separate switches, so lock the courses even if you also hide them.
Create a free offer covering the courses (dashboard)
In the Offers hub, create an offer whose items are exactly those courses (a bundle), or an Academy Pass if the cohort should get everything. Leave the price empty so the offer is free. A free offer grants access without any payment or checkout.
Hide the offer from your storefront (dashboard)
On the offer, turn off Show in store so it never appears as a card students can find and claim on their own. Access will come only from list membership you control, not from public claiming.
Grant the offer to a manual list (dashboard)
Open the offer’s Members tab and use Grant to a list, pointing it at a manual list (create one if needed). This is the wire between the offer and the API: every member of that list now holds the offer, and therefore every course the offer covers, live.
Create (or reuse) the list
If you did not already create the manual list in the dashboard, create it through the API and grant the offer to it afterward. Either way, the list must be manual.GET /api/v1/lists and pick the one you want by id. A duplicate name returns 409 already_exists.
Add members by email
Add one or many people. Emails that do not yet have an account are provisioned as students, and by default each new student gets a magic-link welcome email. Add"send_welcome_email": false for silent backfills.
created: a new student account was provisioned and added.added: an existing student was added to the list.already_member: the student was already in the list; nothing changed.error: carries acodeandmessagefor that one email; the rest of the batch still runs.
"email": "..." string.
Remove members to revoke
Removing a student from the list ends the access that list was granting, live.Membership is not the same as identity. Removing someone from a list revokes what that list granted, but keeps their account and their progress. If they hold the same courses another way (a purchase, another list, a free course), they keep access. Removal only takes away what this list was granting.
Sync students from a CRM or funnel
When a contact converts in your CRM or funnel, you have two ways to bring them in. Which one you pick depends on whether the assignment is personal and lasting or cohort-shaped and revocable.Enroll them directly
Use
POST /api/v1/students with course_ids to provision the student and assign specific courses in a single call. This is a permanent individual assignment that stays until you revoke it.Add them to a list
Use
list_ids (same endpoint) or the list members endpoint to place them in a cohort. Access is revocable as a group by removing them from the list.POST /api/v1/students accepts both in one request, so a funnel webhook can provision, enroll, and enlist in a single call:
still_has_access_via is free, purchase, offer, or null. If it is non-null, the student keeps the course through that path even after this enrollment ended.
Audit what a list grants
To see exactly which courses a list opens up, and why, read its granted courses:granted_via[].role to understand the wiring:
grants_to: the offer is granted to this list. The list’s members hold the offer for free because you pointed the offer’s Grant to a list at it. This is the role you set up in the flagship recipe.member: this list is the offer’s own holder set (its member list), the set people join by buying or claiming the offer.
Every course listed is one that members of this list can actually open right now. If a course you expected is missing, check that its offer is active and that the offer really covers that course.

