Changelog
All notable changes to the Teachify Admin API are documented on this page.
October 19, 2026
Fixed
createCouponandupdateCouponreject unknownitemIds- An ID initemIdsthat is not in the school’s selectable catalog (a typo, another school’s product, a deleted product) used to be dropped silently while the mutation reported success. If every ID was dropped, the coupon applied to every product. The mutation now returns aCOUPON-007message inerrorsnaming the unknown IDs, withcouponset tonull, and writes nothing.updateCouponstill accepts IDs the coupon already holds, even after they leave the catalog. An empty array, an omitted field andnullkeep their meaning.
October 16, 2026
Changed
sendCustomEmailescapes HTML intemplateVariables- A{{ }}placeholder incontentis now filled with itstemplateVariablesvalue as text:<,>,&and quotes in the value are escaped, so a value forwarded from a member (a name, a form answer) can no longer add links or images to the email. Thecontentitself is still sent as HTML, so put any markup there rather than in a variable. Values already escaped with Liquid’sescapefilter are not escaped twice. Thesubjectis plain text and is unchanged.
Fixed
sendCustomEmailwithouttemplateVariables- Leaving outtemplateVariablesreturnedsuccess: truebut the email was never sent. It is now sent, with each placeholder left empty.
October 15, 2026
Added
couponGrantsquery - Pages through one coupon’s member grants, newest first, filterable bystatusand by the member’suserIdoruserEmail. Use it to find the grant ID thatrevokeCouponGranttakes. It requirescoupons:readandstudents:read.
Changed
createCouponGrantargument error codes - Passing neitheruserIdnoremailnow raisesCOUPON-005instead ofENROLLMENT-001, and passing both raisesCOUPON-006instead ofMEETING-016. Update any error handling that matched the old codes for this mutation; other mutations keep them.
October 1, 2026
Fixed
updateSubscriptionkeeps unlimited course access on recurring plans - On arecurringmembership plan, a member whose course access had no end date was given one at the newcurrentPeriodEnd. Renewals never extend that date, so the member lost access while still paying. While the subscription still renews, the mutation now leaves such access without an end date. Course access that already has an end date still moves tocurrentPeriodEnd. To set a course end date directly, useextendStudentCourseAccess.
September 23, 2026
Added
- Metadata filters on membership plans and events -
membershipPlansandeventsacceptfilter: { metadata: [...] }, matching the exact key-value pairs of their external metadata the same waycoursesdoes. updatedAtfilter on courses and membership plans -coursesandmembershipPlansacceptfilter: { updatedAt: { gte: ... } }as a Unix timestamp in seconds throughBigIntOperator, which reaches past 2038.
Changed
- Metadata filters return nothing when the feature is off - A
metadatafilter oncourses,membershipPlansoreventsfor a school without the external metadata feature now returns no results. It previously dropped the filter and returned every course, so a lookup by an ERP key could act on the wrong record. BigIntOperatorvalues must be valid dates - Values outside 0001-01-01 to 9999-12-31 UTC are rejected as invalid input instead of failing the request.
August 30, 2026
Fixed
updateSectionno longer accepts a null title - Passingtitle: nullpreviously cleared the section title, which made the affected course unreadable through the storefront API. It now returnsSECTION-003. Omittitleto leave it unchanged, or pass an empty string for a section with no title.
January 15, 2026
Added
- Early cancellation for subscriptions pending cancellation - The Admin API
cancelSubscriptionmutation now supports immediate cancellation for subscriptions that are already in a pending-cancellation state (isCanceling: true).cancelAtPeriodEndandcustomEndedAtare ignored in this case (always cancels immediately).
Improved
- Subscription mutation documentation - Updated Admin API docs for subscription mutations with clearer examples and guidance:
- Early cancellation behavior for
cancelSubscription - Restrictions for
updateSubscriptionwhen a subscription is pending cancellation
- Early cancellation behavior for
Fixed
- Scheduled cancellation behavior -
cancelSubscription(cancelAtPeriodEnd: true)now correctly schedules cancellation (subscription becomesisCanceling: true) instead of cancelling immediately. - Update restrictions for pending cancellations -
updateSubscriptionnow blocks updates forisCanceling: truesubscriptions and returns an actionable error directing callers tocancelSubscription.
January 12, 2026
Added
-
Lifetime Membership Plans - Full support for lifetime membership plan type in the API
planType: lifetimenow available when creating membership plans- Lifetime plans have no
endAtorcurrentPeriodEnddates (perpetual access) - Webhooks now include
planTypefield for membership plan events - New GraphQL fields:
isLifetimeonMembershipPlanandSubscriptiontypeshasLifetimeAccessonPurchasedCoursetype
- Subscription behavior for lifetime plans:
isCancellable: false(one-time purchase)nextChargeDate: null(no recurring charges)
-
Membership Plans Query Filter - New
planTypefilter parameter formembershipPlansquery- Filter by:
recurring,fixed_date,specific_length,lifetime
- Filter by:
Improved
- Subscription Documentation - Enhanced documentation for subscription lifecycle and plan types
- Added plan types comparison table
- Clearer explanation of billing cycles and expiration handling
Fixed
- Payment Reporting - Fixed
payment_without_invoices_countto accurately count payments missing issued invoices - Subscription Admin - Fixed NoMethodError in admin subscription detail view
January 9, 2025
Added
- Changelog - This changelog page for tracking API updates
Improved
- Homepage with clearer navigation and call-to-action
Fixed
- Broken link to Users query (previously pointed to non-existent Students page)
Removed
- Internal documentation templates (not intended for external users)
December 20, 2024
Added
- Lifetime Subscription Support - Permanent access subscriptions with no expiration
endAtandcurrentPeriodEndreturnnullfor lifetime plansisCancellablefield to indicate if subscription can be cancelled
- Invoice Webhook Events - New events for invoice tracking
invoice.createdinvoice.updated
December 6, 2024
Added
- Student Course Progress Query - Track learner progress through courses
- Plan Type Filter - Filter membership plans by
planType(recurring, fixed_date, specific_length, lifetime)
Improved
- Subscription documentation with plan types comparison table
- Course enrollment mutation with plan pricing support
November 15, 2024
Added
- Rate Limiting Documentation - Clear limits for API usage
- Mutations: 200 requests per minute
- Queries: 600 requests per minute
- Best Practices Guide - Guidelines for effective API usage
October 25, 2024
Added
- Subscription Mutations - Full subscription lifecycle management
- Create subscription
- Update subscription period
- Cancel subscription (at period end or immediately)
- Course Access Management
- Expire student course access
- Extend student course access
September 15, 2024
Added
- Initial Admin API Release
- GraphQL endpoint at
https://teachify.io/admin/graphql - Authentication via
X-Teachify-API-Keyheader
- GraphQL endpoint at
- Query Operations
- Courses, Users, Coupons, Membership Plans, Events, Assignments
- Mutation Operations
- Course CRUD, Student enrollment, Post CRUD, Event creation, Custom email
- Webhook Events - 18 event types across 9 categories
- Webhook Security - HMAC SHA-256 signature verification, IP allowlisting
- OAuth 2.0 Integration - Authorization, Token exchange, User info endpoints
- Zapier Integration - Quickstart guide