Teachable's REST API lets you build custom student portals, course catalogs, and enrollment dashboards in Bolt.new using API key authentication. Get your API key from Teachable Settings → API Keys, store it in your .env file, and prompt Bolt to generate an API route that fetches courses and enrolled users. Teachable webhooks for enrollment events require a deployed public URL — use Netlify or Bolt Cloud since Bolt's WebContainer cannot receive incoming connections.
Build a Custom Teachable Student Portal in Bolt.new
Teachable is a popular course platform that handles hosting, payment processing, and student management out of the box. But Teachable's built-in interface is generic — every Teachable course site looks similar. By building a custom student portal in Bolt.new and connecting it to Teachable's API, you can create a branded course experience that matches your identity exactly, with custom navigation, progress dashboards, community features, and upsell flows that Teachable's standard interface cannot accommodate.
Teachable's REST API provides access to your course catalog, enrollment records, student profiles, and order history. The API uses simple API key authentication — no OAuth flows or complex token management. You get your API key from Teachable's admin Settings page, store it in your .env file, and your Bolt API routes include it in every request header. The API is primarily read-oriented: fetching courses, listing enrolled students, and retrieving user details. Creating courses or enrolling students programmatically is limited — most content management still happens in Teachable's admin.
The most practical use cases for Teachable API integration in Bolt.new are: a custom-branded student dashboard that shows enrolled courses with progress, a marketing site with a live course catalog pulling real data from Teachable, and a CRM companion tool for course creators that aggregates enrollment and revenue data. Teachable's checkout and payment processing remains on Teachable's platform — your Bolt app generates Teachable checkout links that redirect students to Teachable for purchase.
Integration method
Teachable's REST API uses simple API key authentication and supports reading courses, enrollments, users, and orders — making it straightforward to build custom student portals or affiliate dashboards in Bolt.new. The API is primarily read-oriented since course content creation happens in Teachable's admin UI. Bolt generates API routes that proxy Teachable API requests with your key stored server-side. Enrollment webhooks (student purchased a course) require a deployed URL since Bolt's WebContainer cannot receive incoming HTTP connections.
Prerequisites
- A Teachable account with at least one published course (Pro plan required for full API access — Basic plan has limited API functionality)
- Teachable API key from Settings → API Keys in your Teachable admin dashboard
- A Bolt.new project with Supabase connected for storing student data and enrollment records
- A deployed URL on Netlify or Bolt Cloud for receiving Teachable enrollment webhooks
- At least one published course and test student in Teachable to verify API responses during development
Step-by-step guide
Get Your Teachable API Key
Get Your Teachable API Key
Teachable's API uses simple API key authentication — no OAuth flows or token expiration to manage. Your API key is a permanent credential that must be kept secret since it provides full read access to your school's data. Log into your Teachable admin dashboard at teach.teachable.com. Navigate to Settings → API Keys (scroll down in the Settings sidebar). Click 'New API Key', give it a descriptive name (like 'Bolt Dev App' or 'Student Portal'), and click Create. Teachable generates the API key and displays it once — copy it immediately because you cannot view it again after closing the dialog. Note that Teachable's API access levels differ by plan. The Basic plan ($39/month) has very limited API access. The Professional plan ($119/month) provides full API access including user data, enrollment details, and course content. If you are on the Basic plan and the API returns 403 errors on certain endpoints, this is the reason — check Teachable's plan comparison for specific API endpoint availability. Once you have the API key, add it to your .env file. The API key is used as a Bearer token in API requests. Never put the key in client-side code — all Teachable API calls must go through a server-side API route where the key is accessed via `process.env.TEACHABLE_API_KEY`.
1# .env file in your Bolt project root2# From Teachable admin: Settings → API Keys3TEACHABLE_API_KEY=your_teachable_api_key_here45# For webhook validation (from Teachable Settings → Integrations → Webhooks)6TEACHABLE_WEBHOOK_TOKEN=your_webhook_token_here78# Supabase for data storage9NEXT_PUBLIC_SUPABASE_URL=your_supabase_url10NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_keyPro tip: Create separate API keys for development and production in Teachable's Settings → API Keys. Label them clearly ('Bolt Dev' and 'Bolt Production') so you can revoke either without affecting the other.
Expected result: You have a Teachable API key in your .env file. You understand which Teachable plan is required for the API endpoints you need.
Build Teachable API Routes for Course and Enrollment Data
Build Teachable API Routes for Course and Enrollment Data
Teachable's API base URL is `https://developers.teachable.com/v1`. Authentication requires the API key as a Bearer token in the Authorization header. The key endpoints for building a student portal are: `GET /courses` (list all published courses in your school), `GET /courses/{course_id}` (course details), `GET /courses/{course_id}/users` (list all students enrolled in a course), and `GET /users/{user_id}` (individual user details). For a student-facing portal, the enrollment endpoint is critical: `GET /users/{teachable_user_id}/enrollments` returns all courses a specific user is enrolled in. To use this endpoint, you need the student's Teachable user ID. The challenge is mapping your Bolt app's authenticated users (Supabase auth) to their corresponding Teachable user IDs. One approach: when a student first logs into your Bolt portal, look up their Teachable user by email using the `GET /users?email={email}` endpoint and store the Teachable user ID in your Supabase user profile table. Bolt's WebContainer supports all these API calls as outbound HTTP requests — you can test the course listing and user lookup endpoints in the preview during development. The Teachable API enforces rate limits (the documentation states limits but exact numbers depend on plan), so avoid rapid repeated requests during development. A cache of 5-15 minutes for course catalog data is appropriate since courses do not change frequently.
Build Teachable API integration. Create three API routes: (1) app/api/teachable/courses/route.ts — fetches all published courses from https://developers.teachable.com/v1/courses using Authorization: Bearer [TEACHABLE_API_KEY], returns array of {id, name, description, thumbnailUrl, slug, price, enrollmentCount}, (2) app/api/teachable/user-enrollments/route.ts — accepts a Teachable userId query param and returns the user's enrolled courses from /v1/users/[userId]/enrollments, (3) app/api/teachable/find-user/route.ts — accepts an email query param and looks up the user by email from /v1/users?email=[email], returns the Teachable user ID. Cache course listing results in Supabase for 15 minutes.
Paste this in Bolt.new chat
1// app/api/teachable/courses/route.ts2import { NextRequest, NextResponse } from 'next/server';3import { createClient } from '@supabase/supabase-js';45const TEACHABLE_API_KEY = process.env.TEACHABLE_API_KEY;6const TEACHABLE_BASE_URL = 'https://developers.teachable.com/v1';78const supabase = createClient(9 process.env.NEXT_PUBLIC_SUPABASE_URL!,10 process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!11);1213export async function GET(request: NextRequest) {14 if (!TEACHABLE_API_KEY) {15 return NextResponse.json({ error: 'Teachable API not configured' }, { status: 500 });16 }1718 // Check cache in Supabase (15-min freshness)19 const { data: cached } = await supabase20 .from('teachable_cache')21 .select('*')22 .eq('cache_key', 'courses')23 .gte('cached_at', new Date(Date.now() - 15 * 60 * 1000).toISOString())24 .single();2526 if (cached) {27 return NextResponse.json(cached.data);28 }2930 const response = await fetch(`${TEACHABLE_BASE_URL}/courses`, {31 headers: {32 'Authorization': `Bearer ${TEACHABLE_API_KEY}`,33 'Accept': 'application/json',34 },35 });3637 if (!response.ok) {38 return NextResponse.json(39 { error: `Teachable API error: ${response.status}` },40 { status: response.status }41 );42 }4344 const data = await response.json();45 const courses = (data.courses || []).map((c: any) => ({46 id: c.id,47 name: c.name,48 description: c.description,49 thumbnailUrl: c.image_url,50 slug: c.url,51 price: c.price,52 isFree: c.is_free,53 }));5455 // Store in cache56 await supabase.from('teachable_cache').upsert({57 cache_key: 'courses',58 data: { courses },59 cached_at: new Date().toISOString(),60 });6162 return NextResponse.json({ courses });63}Pro tip: Teachable's API uses camelCase in requests but returns snake_case in responses. When mapping response data, look for fields like image_url, is_free, and user_id rather than camelCase equivalents.
Expected result: The /api/teachable/courses endpoint returns your Teachable course catalog as formatted JSON. The /api/teachable/user-enrollments endpoint returns enrolled courses for a specific user ID.
Build the Student Portal UI
Build the Student Portal UI
With API routes returning course and enrollment data, build the student-facing interface. The core of a custom Teachable student portal is a dashboard that shows each enrolled student's courses with progress and direct links back to Teachable's course player for actually watching lessons. The student authentication flow works as follows: the student signs into your Bolt app using Supabase Auth (email/password or OAuth). On first login, a background API call searches Teachable for the user by email (`GET /users?email={email}`) and saves the Teachable user ID to the Supabase user profile. Subsequent logins use the stored Teachable ID to fetch enrollment data without the lookup step. For course cards in the student dashboard, link the 'Continue Learning' button directly to the Teachable course URL — the course player lives on Teachable's platform, not in your Bolt app. The format is typically `https://[your-school-name].teachable.com/courses/{slug}/lectures/first`. Your Bolt app provides a better discovery and onboarding experience, while Teachable handles the actual video delivery. Design the portal with a sidebar showing all enrolled courses and a main content area showing course details. Add a progress indicator for each course if the Teachable API returns completion data. A 'Browse More Courses' section at the bottom of the dashboard shows unenrolled courses with enrollment buttons that link to Teachable's checkout page for purchase.
Build the student dashboard UI at app/dashboard/page.tsx. After login, fetch the user's Teachable user ID from their Supabase profile (or look it up by email via /api/teachable/find-user if not stored). Fetch their enrollments from /api/teachable/user-enrollments?userId=[teachableId]. Display enrolled courses as cards with: course thumbnail, name, and a 'Continue Learning' button linking to https://[SCHOOL_NAME].teachable.com/courses/[slug]/lectures/first. Below the enrolled courses, show a 'Discover More Courses' section with 3 unenrolled courses from /api/teachable/courses, each with an 'Enroll Now' button linking to the Teachable course checkout URL.
Paste this in Bolt.new chat
1// components/EnrolledCourseCard.tsx2interface EnrolledCourse {3 id: number;4 name: string;5 thumbnailUrl?: string;6 slug: string;7 schoolSubdomain: string;8 completedLessons?: number;9 totalLessons?: number;10}1112export function EnrolledCourseCard({ course }: { course: EnrolledCourse }) {13 const progressPercent = course.totalLessons14 ? Math.round((course.completedLessons || 0) / course.totalLessons * 100)15 : null;1617 const continueUrl = `https://${course.schoolSubdomain}.teachable.com/courses/${course.slug}`;1819 return (20 <div className="bg-white rounded-xl border border-gray-200 overflow-hidden hover:shadow-md transition-shadow">21 {course.thumbnailUrl && (22 <img src={course.thumbnailUrl} alt={course.name} className="w-full h-40 object-cover" />23 )}24 <div className="p-4">25 <h3 className="font-semibold text-sm mb-2 line-clamp-2">{course.name}</h3>26 {progressPercent !== null && (27 <div className="mb-3">28 <div className="flex justify-between text-xs text-gray-500 mb-1">29 <span>Progress</span>30 <span>{progressPercent}%</span>31 </div>32 <div className="w-full bg-gray-200 rounded-full h-2">33 <div34 className="bg-blue-600 h-2 rounded-full transition-all"35 style={{ width: `${progressPercent}%` }}36 />37 </div>38 </div>39 )}40 <a41 href={continueUrl}42 target="_blank"43 rel="noopener noreferrer"44 className="block text-center text-sm bg-blue-600 text-white rounded-lg py-2 hover:bg-blue-700"45 >46 Continue Learning47 </a>48 </div>49 </div>50 );51}Pro tip: Teachable does not provide per-lesson completion data through the standard API. If you need progress tracking, consider building your own progress system in Supabase where users mark lessons complete manually in your custom portal.
Expected result: Students see their enrolled courses with thumbnails and Continue Learning links. The dashboard also shows available courses they can enroll in via Teachable's checkout.
Set Up Teachable Enrollment Webhooks
Set Up Teachable Enrollment Webhooks
Teachable can send webhook notifications to your app when key events occur: a student enrolls in a course, completes a course, or submits a quiz. These events require a publicly accessible URL — Bolt's WebContainer cannot receive incoming webhook requests since it runs entirely in the browser with no public server. Deploy your Bolt app to Netlify or Bolt Cloud first, then configure Teachable webhooks. In Teachable admin, navigate to Settings → Integrations → Webhooks. Add a new webhook endpoint with your deployed URL, for example `https://your-app.netlify.app/api/teachable/webhook`. Select the events you want to receive: `new_enrollment` (student purchased a course), `course_completed` (student finished all lessons), and `new_sale` (any purchase). Teachable includes a verification token in the webhook request header (`Teachable-Token`). Your webhook handler should validate this token against the value stored in `process.env.TEACHABLE_WEBHOOK_TOKEN` before processing the event. The token is set in Teachable's webhook settings — create a random secret string and add it to both Teachable's webhook configuration and your environment variables. For each `new_enrollment` event, save the enrollment to your Supabase database, trigger a welcome email via SendGrid or Resend, and optionally grant access to additional resources in your Bolt app (like a private Discord channel link or bonus PDF). This full automation creates a premium onboarding experience that Teachable's default enrollment emails cannot match.
Create a Teachable webhook handler at app/api/teachable/webhook/route.ts. It receives POST requests from Teachable. Validate that the Teachable-Token header matches process.env.TEACHABLE_WEBHOOK_TOKEN. For new_enrollment events: extract student email, name, course name from the payload and insert into Supabase enrollments table (id, student_email, student_name, course_name, course_id, enrolled_at, webhook_payload jsonb). Return 200 for success, 401 for invalid token. Create an admin dashboard at app/admin/enrollments/page.tsx that shows all enrollments sorted by date.
Paste this in Bolt.new chat
1// app/api/teachable/webhook/route.ts2import { NextRequest, NextResponse } from 'next/server';3import { createClient } from '@supabase/supabase-js';45const WEBHOOK_TOKEN = process.env.TEACHABLE_WEBHOOK_TOKEN;67const supabase = createClient(8 process.env.NEXT_PUBLIC_SUPABASE_URL!,9 process.env.SUPABASE_SERVICE_ROLE_KEY!10);1112export async function POST(request: NextRequest) {13 const incomingToken = request.headers.get('Teachable-Token');1415 if (!WEBHOOK_TOKEN || incomingToken !== WEBHOOK_TOKEN) {16 console.error('Invalid Teachable webhook token');17 return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });18 }1920 const payload = await request.json();21 const { object: eventType, data } = payload;2223 if (eventType === 'enrollment') {24 const { user, course } = data;2526 await supabase.from('enrollments').insert({27 student_email: user?.email,28 student_name: `${user?.first_name} ${user?.last_name}`.trim(),29 course_name: course?.name,30 course_id: course?.id,31 enrolled_at: new Date().toISOString(),32 webhook_payload: payload,33 });3435 console.log(`New enrollment: ${user?.email} in ${course?.name}`);36 }3738 return NextResponse.json({ received: true });39}Pro tip: Teachable's webhook payload structure varies between event types. Log the full webhook payload to Supabase's webhook_payload jsonb column during development so you can inspect the exact data structure before writing production event handlers.
Expected result: Teachable webhooks deliver to the deployed URL and create enrollment records in Supabase. The admin dashboard shows real enrollment data with student names and course details.
Deploy to Production and Test the Full Flow
Deploy to Production and Test the Full Flow
With course data routes, the student portal UI, and webhook handler in place, deploy the complete app to Netlify or Bolt Cloud. Click Publish in Bolt's navigation to trigger a build and deployment. After the deployment completes, add environment variables in your hosting platform: `TEACHABLE_API_KEY`, `TEACHABLE_WEBHOOK_TOKEN`, `NEXT_PUBLIC_SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_ANON_KEY`, and `SUPABASE_SERVICE_ROLE_KEY` (for the webhook handler which needs to bypass RLS). Test the complete enrollment flow end-to-end: create a test student account in Teachable, enroll that account in a free test course, and verify the webhook fires and creates a record in your Supabase enrollments table. If Teachable has a 'Resend' feature in the webhook settings, use it to re-send the enrollment webhook to your endpoint and check the response in Teachable's webhook delivery log. For the student portal, test the login flow: sign in with a user whose email matches a Teachable account, verify the email lookup finds the Teachable user ID, and confirm the enrolled courses appear in the dashboard. A common issue is timing — if a student signs up for your Bolt app before enrolling in any Teachable courses, their enrollment list will be empty until they enroll. In production, the WebContainer limitation is no longer relevant — your deployed app receives webhooks on a real server and can use standard TCP database connections if needed. The Next.js API routes become proper serverless functions on Netlify or Vercel that handle incoming requests correctly.
Add an enrollment success page to complete the student portal. Create app/enrollment-success/page.tsx that shows when students land from Teachable's success URL. Add a query parameter handler for ?course_id=[id] so the page shows which course they just enrolled in. Fetch the course details from /api/teachable/courses and display: the course name, thumbnail, a welcome message, and a 'Go to Dashboard' button. Also add an enrollment count badge to each course card on the public catalog — show 'X students enrolled' using the enrollment data from the Teachable API.
Paste this in Bolt.new chat
Pro tip: Test Teachable webhooks using Teachable's built-in webhook tester before enrolling real test students. The tester sends sample payloads to your deployed endpoint so you can verify the handler works without buying test courses.
Expected result: The complete student portal works in production — students can log in, see their enrolled courses, and click through to Teachable's course player. New enrollments trigger webhooks that create records in Supabase.
Common use cases
Branded Student Dashboard
Build a custom onboarding hub where students see all their enrolled Teachable courses with progress indicators, upcoming live sessions, and community links — all branded to your design rather than Teachable's default interface. Students log into your Bolt app and get a premium learning experience that feels like a dedicated product.
Build a custom student dashboard for my Teachable courses. Create an API route at app/api/teachable/enrollments/route.ts that fetches a student's enrolled courses from the Teachable API (https://developers.teachable.com/v1/users/[userId]/enrollments) using the API key from process.env.TEACHABLE_API_KEY. Display enrolled courses as cards showing: course name, thumbnail, completion percentage (if available), and a 'Continue Learning' button that links to the Teachable course URL. Require login via Supabase auth, and store the mapping between Supabase user ID and Teachable user email in a users table.
Copy this prompt to try it in Bolt.new
Live Course Catalog Marketing Site
A marketing page that dynamically displays all published courses from your Teachable school, including real course names, prices, instructor info, and enrollment counts. When a visitor clicks to enroll, they are redirected to the Teachable checkout page. The catalog stays current automatically as you add or update courses in Teachable.
Create a course catalog page that fetches all published courses from my Teachable school using the API route that calls https://developers.teachable.com/v1/courses with TEACHABLE_API_KEY. Show each course as a card with: course name, thumbnail image, short description, price (format as $XX or 'Free'), and an Enroll Now button linking to the Teachable course page URL (teachable.com/courses/[slug]/about). Add filter buttons for 'All Courses', 'Free', and 'Paid'. Sort by price ascending by default.
Copy this prompt to try it in Bolt.new
Enrollment Notification and CRM Pipeline
When a student purchases a course on Teachable, receive a webhook event in your Bolt app, save the enrollment to Supabase, and trigger a personalized welcome email sequence. Build a simple CRM view showing all students, their enrolled courses, enrollment date, and email for follow-up.
Build a Teachable enrollment webhook handler at app/api/teachable/webhook/route.ts that verifies incoming Teachable webhooks (check the Teachable-Token header matches TEACHABLE_WEBHOOK_TOKEN from process.env) and handles the new_enrollment event by saving the student's name, email, course name, and enrollment date to a Supabase table called enrollments. Create an admin dashboard at /admin/students showing all enrollments sorted by date with columns: student name, email, course name, enrolled date, and a 'Send Welcome Email' button.
Copy this prompt to try it in Bolt.new
Troubleshooting
Teachable API returns 401 Unauthorized on all requests
Cause: The API key is missing, expired, or passed in the wrong format. Teachable requires API key authentication as a Bearer token in the Authorization header.
Solution: Verify TEACHABLE_API_KEY is set in your .env file and the API route reads it with process.env.TEACHABLE_API_KEY. The API key must be passed as 'Authorization: Bearer [key]' — not as a query parameter or API-Key header. Check in the Teachable admin (Settings → API Keys) that the key is still active and has not been revoked.
1// Correct Teachable API authentication2const response = await fetch('https://developers.teachable.com/v1/courses', {3 headers: {4 'Authorization': `Bearer ${process.env.TEACHABLE_API_KEY}`,5 'Accept': 'application/json',6 },7});Teachable webhook endpoint returns 404 Not Found after deployment
Cause: The webhook path registered in Teachable's settings does not match the actual API route path in your deployed app, or the deployment was not completed before registering the webhook.
Solution: Verify your deployed app is accessible at the base URL first. Then confirm the webhook path matches exactly: if your API route is at `app/api/teachable/webhook/route.ts`, the deployed URL would be `https://your-app.netlify.app/api/teachable/webhook`. Register this exact URL in Teachable Settings → Integrations → Webhooks. Use Teachable's webhook test feature to send a sample event and check the delivery status.
Student's Teachable enrollments are not showing in the custom portal
Cause: The Supabase user profile does not have the Teachable user ID stored, or the email lookup by email address is failing because the student used a different email for Teachable versus the Bolt portal.
Solution: Add error handling to the Teachable user lookup: if the email lookup returns no results, show the user a message asking them to verify they are using the same email as their Teachable account. Store the Teachable user ID in the Supabase profile after first successful lookup so subsequent requests use the cached ID. Log lookup failures to identify students who may have different emails on each platform.
Teachable API returns 403 Forbidden on user or enrollment endpoints
Cause: Your Teachable plan does not include access to the user or enrollment API endpoints. The Basic plan ($39/month) has very restricted API access. Full API access requires the Professional plan ($119/month) or higher.
Solution: Log into Teachable admin and check your current plan. If on Basic, upgrade to Professional for full API access. Alternatively, work within Basic plan limitations by using only the publicly accessible course listing endpoints and building enrollment tracking through Teachable webhooks rather than API polling.
Best practices
- Never put your Teachable API key in client-side components — proxy all Teachable API calls through Next.js API routes where the key is in process.env
- Cache Teachable course catalog responses for at least 15 minutes in Supabase — the catalog changes infrequently and caching prevents hitting Teachable's rate limits
- Store Teachable user IDs in your Supabase user profile table after the first lookup — avoid re-querying Teachable by email on every page load
- Validate Teachable webhook tokens on every incoming request — without validation, anyone can POST fake enrollment events to your webhook endpoint
- Use the SUPABASE_SERVICE_ROLE_KEY for webhook handlers that need to insert data regardless of RLS — webhook handlers run server-side and need to bypass row-level security
- Link the Continue Learning buttons to Teachable's actual course player URLs rather than rebuilding a video player — Teachable handles DRM, streaming, and progress tracking
- Test webhook delivery using Teachable's built-in webhook tester before enrolling real test students — this saves time and unnecessary test purchases
Alternatives
LearnWorlds has a more comprehensive API with interactive video and SCORM support — a better choice for advanced course creators who need richer learning features than Teachable provides.
Thinkific has similar API capabilities to Teachable and offers a more generous free plan with unlimited courses, making it preferable for budget-conscious course creators.
Podia combines courses, digital downloads, and community in one platform but has a more limited API compared to Teachable, making it better for simpler use cases.
Frequently asked questions
What Teachable plan do I need to use the API?
Full API access including user data, enrollment records, and detailed course information requires the Teachable Professional plan ($119/month) or higher. The Basic plan ($39/month) has very limited API access. If you are on Basic and see 403 errors on user or enrollment endpoints, that is the reason. The public course listing endpoint may work on lower plans.
Can I enroll students programmatically through the Teachable API?
Teachable's API has a limited programmatic enrollment endpoint, but it is not straightforward and may require specific plan access. For most Bolt.new use cases, the recommended approach is to use Teachable's native checkout for enrollment and receive the enrollment confirmation via webhook. This keeps Teachable's payment processing intact while your Bolt app handles the post-enrollment experience.
Do Teachable API calls work in Bolt's WebContainer preview?
Yes. Teachable API calls are outbound HTTP GET requests that work in Bolt's WebContainer during development. You can test course listing and user lookup in the preview. Teachable enrollment webhooks require a deployed URL since the WebContainer cannot receive incoming HTTP connections — deploy to Netlify or Bolt Cloud before testing webhooks.
Can I build a white-label course player that streams Teachable video content?
No. Teachable does not expose video streaming URLs through its API. Course videos are protected and only playable on Teachable's own course player, which handles authentication, DRM, and streaming. Your custom Bolt portal can provide course discovery, progress tracking, and community features, but must link to Teachable's course player for the actual video content.
How do I handle students who use different emails on Teachable vs my Bolt portal?
This is a common mismatch. When a student's email lookup in Teachable returns no results, show a message: 'We couldn't find a Teachable account with this email. If you enrolled on Teachable with a different email, please update your portal email to match.' Add a profile settings page in your Bolt app where students can manually enter their Teachable email if it differs from their portal login email.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation