Skip to main content
This is the complete list of what a connected assistant can do in Fayne: 85 capabilities. You don’t need it to use Fayne with an assistant; ask in your own words and the assistant finds the right tool. It’s here so you can see exactly what an assistant is able to do, and for builders who want the details.

How tools are organized

Your assistant sees a short list of tools directly: the course and lesson tools behind almost every request, plus a few that lead to everything else. The rest are found by what you ask for: Each capability below is marked:
  • Reads only: looks, changes nothing.
  • Changes your academy: creates, edits, deletes or publishes. Learners may see some changes at once.
  • Preview, then confirm: returns a preview of exactly what will happen. Nothing changes until your assistant calls confirm after you say yes.
The second label says whether every connection can use it (Always available) or only one you’ve given that area: Analytics and people, Pricing and offers, or Members and messages. See Permissions. Two inputs appear on many tools and aren’t repeated below. academyId picks the academy when your connection reaches more than one; it’s optional when there’s only one, or when a courseId already says which. idempotencyKey is an optional value on every change, so a request that timed out can be resent without doing the change twice.

Courses and lessons

Courses, modules, lessons, publishing, drip, collections, the Explore Library, and images.
Insert, replace or delete lesson blocks atomically. Read the lesson first and supply its revision as expectedRevision. Every index refers to that one read snapshot, not shifted indices; afterIndex -1 inserts at the top. Blocks marked representable:false can be left intact or deleted, but not replaced with markdown. Returns fresh block indices. A conflict requires a fresh read before retrying.Listed directly in your assistant’s tools.
Create a new course in an academy. It starts unpublished with a single blank ‘Lesson 1’ that you can fill in with apply_edits or update_lesson. Use this for a course that does not exist yet; create_lesson adds lessons to an existing course. Returns the new course id and the academy it was created in.Listed directly in your assistant’s tools.
Create a NEW lesson in this course. It is appended to the end of the course. Use this when the owner wants to add a lesson that does not exist yet (e.g. ‘add a lesson on X’, ‘build out the next module’). Provide a title, and optionally markdown for the starting body content in the documented format: if you omit it, the lesson starts empty for the owner to fill in. Pass kind: "check" to create a graded knowledge check (a lesson whose body is quiz blocks; it grades on submit and can gate later lessons). Pass kind: "survey" ONLY when the owner explicitly asks for a survey, questionnaire, feedback form, poll or pre/post assessment: never add one unprompted, and never turn a requested lesson into a survey. A survey’s markdown must be survey question blocks (:::ratingQuestion, :::choiceQuestion, :::textQuestion) plus short intro prose, never quiz blocks; its settings go in survey. Returns the new lesson’s id and block list. To put content into a lesson that already exists, use apply_edits instead.Listed directly in your assistant’s tools.
Create an empty module at the end of the course. Returns the current structure, including any ungrouped lessons. Use set_course_structure to assign lessons to modules.Listed directly in your assistant’s tools.
Delete a lesson from this course. ONLY use this when the owner explicitly asks to remove a specific lesson. Never delete a lesson as a side effect of another edit, and if you’re unsure which lesson they mean, ask before deleting. The deletion is reversible by the team but disappears from the course immediately. Returns confirmation.Listed directly in your assistant’s tools.
Delete a module when requested. Its lessons remain: they merge into the preceding module, or the following module when deleting the first. Deleting the only module leaves a flat course. Returns the resulting structure.Listed directly in your assistant’s tools.
Orient yourself in a course in one call: returns the course outline: every lesson’s id, title, position, word count, published state, and the moduleId it belongs to: the course’s modules (chapters grouping the lessons, in display order; empty array = unsectioned course), AND the lesson markdown format reference (every supported ::: block and what it’s for). Always call this before writing or editing so you use real directives instead of guessing. Use list_courses first to find the right courseId.Listed directly in your assistant’s tools.
Return the full reference for Fayne’s lesson markdown: every supported ::: block, what each is for, and its attributes. Call this before writing or editing lesson content so you use real directives instead of guessing: an unknown directive is rejected and nothing is saved.Listed directly in your assistant’s tools.No input of its own.
List the courses in an academy: id, title, lesson count, published state and the academy each belongs to. Pass academyId for one academy; omit it to list every academy this connection reaches. Call this first to find the courseId the other tools need.Listed directly in your assistant’s tools.No input of its own.
Read a lesson in the same academy as reference markdown using a lessonId from search_courses. Long output is truncated and marked. This tool does not edit the source lesson.Listed directly in your assistant’s tools.
Read a single lesson (by id) as an ordered list of blocks. Read a lesson before editing it. Each block has a 0-based index (used to target edits), its type, and its markdown. representable: false means that block can’t be expressed in markdown (e.g. a custom interactive block): you can insert around it or delete it, but don’t try to replace it with markdown. markdownEditable reports whether the whole lesson is safe for a full update_lesson rewrite.Listed directly in your assistant’s tools.
Read an authoring-enabled knowledge source in the course’s academy by sourceId from search_knowledge. Returns its title and text, capped at 12,000 characters with a truncation notice.Listed directly in your assistant’s tools.
Replace a module’s title. Lesson content and ordering are unchanged.Listed directly in your assistant’s tools.
Search lesson titles and content in the academy’s other courses, excluding courseId. Returns up to 12 matches with course and lesson identifiers, titles and short snippets.Listed directly in your assistant’s tools.
Search authoring-enabled knowledge sources in the course’s academy for relevant reference material. Returns up to five source identifiers, titles and snippets; read_source retrieves their text.Listed directly in your assistant’s tools.
Find lessons in this course whose title or body text contains the given query (case-insensitive), including text inside blocks such as quiz questions and practice-block prompts, titles and lines. Use this to locate the right lesson when the owner refers to a topic or a block rather than a position.Listed directly in your assistant’s tools.
Reorder modules and assign lessons for the whole course. Include every module and every lesson exactly once. Invalid or incomplete arrangements are rejected. This changes the live course order, including drip unlock order and knowledge-check gating; use only for requested restructuring.Listed directly in your assistant’s tools.
Replace a whole lesson body with documented lesson markdown. Requires a markdownEditable lesson; pass the revision from read_lesson as expectedRevision. Prefer apply_edits for smaller changes. Saves the draft without publishing it.Listed directly in your assistant’s tools.
Add an Explore Library course to an academy as its own editable copy (a draft unless publish is true and the plan allows another published course). Adding a course the academy already has returns the existing copy. Counts against the academy’s course limit.Runs through act (found with find_capabilities).
Finish a direct upload after your PUT to create_upload_link’s directUpload.url returned 200: checks the file (type from its bytes, size, no scripts in SVGs), copies it onto the academy’s CDN and returns the same result as get_upload. Safe to call again. Changes nothing visible in the academy by itself.Runs through act (found with find_capabilities).
Delete a catalog collection. Its courses move to the uncategorized section. Offers that sold the collection keep giving access: they list its courses individually instead. Only call it when the owner asked.Runs through act (found with find_capabilities).
Delete a course. Learners lose it from the catalog and course pages at once. It’s a soft delete: Fayne support can restore it, but there is no undo tool. Only call it when the owner asked to delete this course by name.Runs through act (found with find_capabilities).
Copy a course (lessons, modules, settings) as a new unpublished course, in the same academy or in another academy this connection reaches (targetAcademyId). Both academies must belong to the same owner. Counts against the destination’s course limit.Runs through act (found with find_capabilities).
A course’s settings and publish state: title, slug, published or not, the learner URL, short description, “What you’ll learn” points, catalog collection, drip schedule, and which lessons have changes that aren’t live yet. Call it before publishing so you can tell the owner what will go live.Runs through query (found with find_capabilities).
Check an upload made with create_upload_link: waiting (nothing yet), uploading, ready (imageUrl is on the academy’s CDN; for content, markdown is a ready :::image block), failed (problem says why; the owner can try another file on the same page) or expired. Read-only. After a direct PUT of your own, call complete_upload instead.Runs through query (found with find_capabilities).
Copy an image onto the academy’s CDN and get back a URL and a ready :::image block for lessons or the About page. Use it for every image you put into content (a link to another site can break or be blocked). Pass url, a direct public link to the file (no sign-in). In ChatGPT, an image the owner attached to the chat comes through act’s file field instead. An image only on the owner’s computer: create_upload_link. PNG, JPEG, WebP, GIF or SVG up to 10MB. Changes nothing visible by itself: paste the returned markdown into apply_edits / update_lesson / create_lesson / edit_about_page. For the logo, favicon or cover use set_branding_image instead.Runs through act (found with find_capabilities).
The academy’s catalog collections (sections of the course catalog) in display order, with the courses in each, plus courses in no collection. Collections are grouping only: pricing and access live on offers.Runs through query (found with find_capabilities).No input of its own.
Make lesson drafts live: copies each lesson’s draft to the version learners see, and publishes the course page. Omit lessonIds to publish every lesson with pending changes (see get_course_settings). Refused when a lesson changed since you read it (pass expectedRevisions from read_lesson), when a lesson’s content can’t be published, or over the plan’s lesson limit. Tell the owner what will go live before calling it.Runs through act (found with find_capabilities).
Create a catalog collection (omit collectionId) or update one (name, description, layout). layout: grid shows course cards, slider a horizontal row. Use set_course_collection to put courses in it.Runs through act (found with find_capabilities).
Search Fayne’s Explore Library: ready-made courses an owner can add to their academy as an editable copy. Returns each course’s masterCourseId, description, level, topics and size, and whether this academy already has it. Use add_library_course to add one.Runs through query (found with find_capabilities).
Put a course into a catalog collection, or take it out (collectionId: null). A course is in at most one collection. Leaving a collection never removes access that an offer sold.Runs through act (found with find_capabilities).
Set how a course’s lessons unlock over time, or turn drip off (drip: null). completion: the next lesson unlocks intervalHours after the previous one is completed. calendar: lesson N unlocks N×intervalHours after enrollment. emails.onUnlock emails learners when a lesson unlocks; emails.reengagement nudges quiet learners after afterDays. Takes effect for every learner on their next visit.Runs through act (found with find_capabilities).
Publish a course (learners can see it, subject to its pricing and access) or unpublish it (it disappears from the catalog; nobody loses progress). Publishing counts against the plan’s published-course limit. This publishes the course, not lesson drafts: use publish_lesson_changes for those.Runs through act (found with find_capabilities).
Change a course’s title, its short description (the catalog card text), and its “What you’ll learn” points. Only the fields you pass change. The title and short description save as drafts and go live with publish_lesson_changes; the learning points go live at once. learningOutcomes: null resets them to the lesson titles, [] shows none.Runs through act (found with find_capabilities).

Look and feel

Branding, images, the About page, sidebar links and welcome questions.
Change the About page draft: insert, replace, remove or move blocks, written as markdown. One insert may carry many blocks separated by blank lines; to write the page from scratch send one insert with the whole page. Ops apply top to bottom against the blocks as last read. Saves the draft only: publish_about_page makes it live. Read get_about_page first.Runs through act (found with find_capabilities).
Read the academy’s About page (the landing page visitors see first) as an ordered list of blocks, each with its index, type and markdown, plus whether it’s live and whether there’s an unpublished draft. Returns the page’s block guide too. Read it before edit_about_page.Runs through query (found with find_capabilities).No input of its own.
The academy’s look: primary color, tagline, theme (light/dark/auto/system), catalog hero style and text, what learners are called, logo and favicon URLs, and certificate design. previewUrl opens the live academy.Runs through query (found with find_capabilities).No input of its own.
The questions new members answer when they join (what they want, their level), whether the step is on, and its intro and closing text. Their answers show up per member in get_person.Runs through query (found with find_capabilities).No input of its own.
Publish the About page draft so visitors see it. A draft with no content removes the About page from the academy. Tell the owner what will change first.Runs through act (found with find_capabilities).No input of its own.
Set one of the academy’s images from a public link: logo = the logo (shown in the header; on light backgrounds when a dark logo is also set); logoDark = the logo for dark backgrounds; favicon = the browser-tab icon (square, 512px or smaller is plenty); cover = the cover image on the About page and learner profiles; socialImage = the preview image when a link to the academy is shared (1200x630 works best); certificateSignature = the signature on certificates (a transparent PNG works best). The file is copied onto the academy’s CDN (PNG, JPEG, WebP or SVG; logos, favicons and signatures up to 2MB, covers up to 8MB), so the link only has to work once. Pass url null to remove the image. In ChatGPT, an image the owner attached to the chat comes through act’s file field instead of url. An image only on the owner’s computer: create_upload_link with this purpose, then pass its imageUrl here. Live for learners at once; give the owner previewUrl to check.Runs through act (found with find_capabilities).
Change the join questions. settings turns the step on or off and sets its intro and closing text. questions replaces the whole list, in order (at most 4): keep a question by passing its id (its answers stay attached), omit id for a new one; questions left out stop being asked, and their past answers stay readable. single and multi questions need 2 to 6 options with unique ids. Read get_welcome_questions first.Runs through act (found with find_capabilities).
Change the academy’s look. Only the fields you pass change; the rest stay as they are. Changes are live for learners at once, so describe them to the owner first and give them previewUrl to check. Images (logo, favicon, cover, social image, certificate signature) go through set_branding_image.Runs through act (found with find_capabilities).

Pricing and offers

Course prices, offers, bundles, the Academy Pass and coupons. Every price change or sale is previewed first.
Create a coupon code buyers can enter at checkout: a percent off (1–100) or an amount off (cents), once or for every renewal of a subscription (duration forever), with an optional use limit and expiry. Needs payments set up. A coupon works for anyone who has the code, and it’s live at once: 100% off with no use limit gives the product away. Confirm the code and discount with the owner first.Runs through act (found with find_capabilities).
Create a bundle (several courses or collections) or the Academy Pass (includes: [{ kind: all }]), with its price options. It’s created OFF SALE so nothing is sold by accident: show the owner, then prepare_set_offer_on_sale. A paid offer needs payments set up (get_payments_setup). For one course’s own price use the course pricing tools instead.Runs through act (found with find_capabilities).
A course’s own pricing: free, paid at a price, or members only (not sold on its own, reached through a bundle, the Pass or a grant), plus every offer that includes it and whether payments are ready.Runs through query (found with find_capabilities).
One offer in full: details, every price option, what it includes, whether it’s on sale, holders and link.Runs through query (found with find_capabilities).
Whether the academy can take payments: Stripe connected, able to charge, what Stripe still needs, and the selling currency. Connecting Stripe and finishing its identity checks happen in the app (Stripe hosts them): send the owner to settingsPath.Runs through query (found with find_capabilities).No input of its own.
The academy’s coupon codes: discount, how long it applies to subscriptions, limits, expiry, whether it’s active, and how often it was used.Runs through query (found with find_capabilities).No input of its own.
Every offer in the academy: bundles, the Academy Pass, and each course’s own price (isCoursePrice; change those with the course pricing tools). Shows price, whether it’s on sale and listed in the store, how many people hold it, and its public link.Runs through query (found with find_capabilities).No input of its own.
Preview changing a course’s own pricing to free, paid at a price (cents, in the academy’s currency), or members only. Shows what changes for current learners and buyers. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.Runs through query. Changes nothing: it returns a preview and an intentId, and confirm carries it out after you agree.
Preview replacing what an offer includes: courses, collections, or everything (the Academy Pass). Removing something takes it away from everyone who holds the offer (unless they have it another way); the preview says what’s added, what’s removed and how many holders there are. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.Runs through query. Changes nothing: it returns a preview and an intentId, and confirm carries it out after you agree.
Preview putting an offer on sale (people can buy or claim it on course pages, its /o/ link and the store) or taking it off sale (no new purchases; everyone who has it keeps it). Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.Runs through query. Changes nothing: it returns a preview and an intentId, and confirm carries it out after you agree.
Preview replacing an offer’s price options (one-time, monthly, yearly; at most one of each). Keep an option by passing its planId unchanged. [] makes the offer free. People already subscribed keep paying their current price until they cancel; the preview says how many. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.Runs through query. Changes nothing: it returns a preview and an intentId, and confirm carries it out after you agree.
Pause a coupon (the code stops working at checkout) or resume it. Expired coupons can’t be resumed.Runs through act (found with find_capabilities).
Change an offer’s name, headline, description, buy-button text, public link slug, or whether it’s listed in the store. Prices, what it includes and whether it’s on sale have their own confirmed tools. A course’s own price offer can’t be edited here.Runs through act (found with find_capabilities).

Members and messages

Invitations, course access, lists, reminders and removing members. Anything that emails people or changes their access is previewed first.
The academy’s member lists (cohorts, VIPs, imports) with member counts, and the offers each list grants to everyone on it. Lists managed by an offer (its buyers) can’t be edited here.Runs through query (found with find_capabilities).No input of its own.
Preview giving members published courses for free (up to 50 grants per call, people × courses). They get access at once, the course lands in My Learning, and each gets an email. For a paid course this is a comp: they don’t pay. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.Runs through query. Changes nothing: it returns a preview and an intentId, and confirm carries it out after you agree.
Preview inviting people by email (up to 25), optionally giving them published courses, active offers or lists when they join. Each person gets an invitation email unless sendEmail is false. Counts against the plan’s member limit. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.Runs through query. Changes nothing: it returns a preview and an intentId, and confirm carries it out after you agree.
Preview removing a member from the academy: they lose free and granted access, leave manual lists, and their progress is deleted; anything they paid for stays theirs. They get an email. There is no undo tool. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.Runs through query. Changes nothing: it returns a preview and an intentId, and confirm carries it out after you agree.
Preview a reminder email about a course to a list, segment or set of people, narrowed by progress (not started, not finished, hasn’t answered a survey). At most 3 reminders a day per academy, and one per audience per 24 hours. Anonymous surveys can’t be targeted. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.Runs through query. Changes nothing: it returns a preview and an intentId, and confirm carries it out after you agree.
Preview adding members to a list and/or removing them (up to 25 each). If the list grants offers, added people get those offers’ courses and removed people lose them, which the preview spells out. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.Runs through query. Changes nothing: it returns a preview and an intentId, and confirm carries it out after you agree.

Analytics and people (read-only)

Engagement, revenue, surveys, members and who has gone quiet.
Learners who started a course, haven’t finished it, can still open it, and have gone quiet for a while: the people worth a nudge. Returns names, emails, days quiet, the course, and the last lesson they completed. Most invested first. Use for “who’s stuck”, “who should I reach out to”. Contact them only when the owner asks.Runs through query (found with find_capabilities).
Period-over-period numbers for one academy: new learners, active learners, lessons completed, course starts and course completions, for the last N days vs the N days before, in total and per course. Use for “how are we doing”, “did X drop”, “which course is growing”. Counts exclude the owner and admins.Runs through query (found with find_capabilities).
Where learners engage and where they drop off, all-time. Without a courseId: the audience (learners, how many ever started, active in 7/30 days, by acquisition source), every published course’s starts/completions/median progress, course-to-course handoffs, and the strongest findings (lesson drop-offs, skimmed lessons, practice gaps, learners who never started). With a courseId: that course lesson by lesson (who completed each lesson, who opened it, median minutes spent vs reading time, skim rate) plus its practice blocks. Use it to explain why a number moved and to find the lesson to improve, then read and edit that lesson.Runs through query (found with find_capabilities).
One member of an academy: when they joined, the courses they’re enrolled in with lessons completed, overall progress, how they got access (pass, offers, purchases), certificates, and their answers to the academy’s welcome questions. Never includes what they wrote in private exercises or tutor chats.Runs through query (found with find_capabilities).
Realized sales for one academy over the last N days: gross, refunds, Fayne and Stripe fees, estimated net, sale count, per product (course or offer) and per day. Amounts are in the academy’s selling currency, in cents. Use for “how much did we make”, “which course sells”.Runs through query (found with find_capabilities).
Results of every published survey lesson in a course, across all its learners: ratings (mean and distribution), choice counts, written answers, and before/after comparisons between paired surveys. Named surveys attribute written answers to the member; anonymous surveys never do, and small anonymous groups are withheld.Runs through query (found with find_capabilities).
Find members of an academy by name or email. An empty query returns the most recent members. Returns userId, name and email; call get_person with a userId for their courses, progress, access and welcome answers. Also available to connections with Members and messages, to find who to give a course, remove or add to a list.Runs through query (found with find_capabilities).

Academies

Your academies, their overview and memory, and creating a new one.
Orient yourself in one academy in a single call: name and public URL, plan state (read-only when locked), course and lesson counts, how many learners and how many were active in 30 days, whether payments are set up and how many offers are live, knowledge sources, what’s missing, and which tools to use next. Call it at the start of a conversation about an academy.Listed directly in your assistant’s tools.No input of its own.
List the academies this connection can work in: id, name, subdomain and your role. Call this first when the owner runs more than one academy, then pass academyId (or a courseId) to the other tools. Also reports which areas this connection may use.Listed directly in your assistant’s tools.No input of its own.
Create a new academy for the owner, optionally copying branding and library courses from one of their own academies (copyFromAcademyId). Counts against the plan’s academy limit. Works only on connections set to reach all the owner’s academies, so the new one is reachable at once. It starts empty and unpublished: add courses, then the owner publishes it in Settings → General. There’s no delete tool.Runs through act (found with find_capabilities).
The academy’s memory: what the owner has told Fayne about their business, audience, voice and preferences. The in-app agents read it before writing; read it before drafting or rewriting anything so the result sounds like this academy.Runs through query (found with find_capabilities).No input of its own.
Replace the academy’s memory with new text (at most 10,000 characters). It’s the whole memory, not a patch: read it first and keep what’s there unless the owner asked to drop it. The in-app agents use it too.Runs through act (found with find_capabilities).