Skip to main content
RapidDev - Software Development Agency
bubble-integrationsBubble API Connector

Thinkific

Connect Bubble to Thinkific using two custom headers — X-Auth-API-Key and X-Auth-Subdomain — in Bubble's API Connector. No OAuth, no token refresh, no enterprise gate. With a Thinkific Basic plan ($36/mo) and a Bubble Starter plan, you can build a fully white-label course portal, enroll students programmatically, and display live progress dashboards — all without touching the Thinkific dashboard.

What you'll learn

  • How to configure Bubble's API Connector with Thinkific's dual-header authentication
  • How to run the Initialize call to auto-detect Thinkific's response schema in Bubble
  • How to display a live course catalog with correct price formatting (cents to dollars)
  • How to build an enrollment management Backend Workflow that enrolls students via API
  • How to show enrollment progress using percentage_completed and completed_at fields
  • How to implement pagination for course and enrollment lists using Thinkific's meta object
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner19 min read2–3 hoursEducationLast updated July 2026RapidDev Engineering Team
TL;DR

Connect Bubble to Thinkific using two custom headers — X-Auth-API-Key and X-Auth-Subdomain — in Bubble's API Connector. No OAuth, no token refresh, no enterprise gate. With a Thinkific Basic plan ($36/mo) and a Bubble Starter plan, you can build a fully white-label course portal, enroll students programmatically, and display live progress dashboards — all without touching the Thinkific dashboard.

Quick facts about this guide
FactValue
ToolThinkific
CategoryEducation
MethodBubble API Connector
DifficultyBeginner
Time required2–3 hours
Last updatedJuly 2026

Build a White-Label Course Portal on Top of Thinkific

Thinkific handles course authoring, video hosting, payment processing, and certificate delivery. Bubble handles the frontend — your brand, your design, your user flows. The Thinkific API is the bridge between them.

The integration auth setup is the simplest in the Education category: two static headers, no OAuth dance, no token expiry. Your Thinkific API key goes in the X-Auth-API-Key header (marked Private in Bubble) and your school slug goes in X-Auth-Subdomain. That's it — you're authenticated for every call.

Once connected, the most powerful capability is programmatic enrollment management. Instead of logging into the Thinkific dashboard to enroll students, a Bubble admin panel can trigger a Backend Workflow that POSTs to /api/v1/enrollments, enroll a student in seconds, and update your Bubble DB in the same workflow chain. You can also build progress dashboards using the percentage_completed field, display real-time order history, and filter by enrollment status — all surfaced in a custom Bubble UI your students never have to leave.

Important plan requirements: Thinkific API access requires a paid Basic plan ($36/mo) or higher. Bubble Backend Workflows (recommended for enrollment creation) require Bubble's Starter plan ($32/mo) or higher. Both are necessary for a production-ready integration.

Integration method

Bubble API Connector

Two custom static headers (X-Auth-API-Key + X-Auth-Subdomain) — no OAuth required

Prerequisites

  • A Thinkific account on the Basic plan ($36/mo) or higher — the Free tier does not include API access
  • Your Thinkific API key: log in to Thinkific → click your avatar → Settings → Code & API → API → Generate API key
  • Your Thinkific school subdomain: visible in your admin URL, e.g., myschool.thinkific.com → subdomain is 'myschool'
  • A Bubble account — Starter plan ($32/mo) recommended for Backend Workflows; Free plan works for read-only API calls
  • The API Connector plugin installed in your Bubble app (by Bubble, free)

Step-by-step guide

1

Step 1 — Generate your Thinkific API key and note your school subdomain

Before touching Bubble, gather the two credentials the API Connector needs. In your Thinkific dashboard, click your account avatar in the top-right corner, then choose Settings from the dropdown. In the left sidebar, look for the Code & API section (this section is only visible on Basic plan and higher — if you don't see it, your school is on the Free tier and needs an upgrade before proceeding). Click API in the Code & API section. If no key exists yet, click Generate API key. Copy the key immediately and store it in a password manager or secure note — Thinkific only shows the full key once at generation time. Now note your school subdomain. The easiest way: look at your browser's address bar while in the Thinkific admin. The URL format is myschool.thinkific.com/manage — the part before .thinkific.com is your subdomain. For example, if your admin URL is happycourses.thinkific.com/manage, your subdomain is happycourses. Important: the X-Auth-Subdomain header takes ONLY the subdomain value — not the full domain. Setting it to happycourses.thinkific.com instead of happycourses is a common mistake that causes a silent 401 error.

Pro tip: If you see a 'Settings' page but no 'Code & API' section, your Thinkific account is on the Free plan. API access requires the Basic plan ($36/mo) or higher. You can verify your plan at Settings → Billing.

Expected result: You have your Thinkific API key (a long alphanumeric string) and your school subdomain (just the short slug, e.g., 'myschool') ready to paste into Bubble.

2

Step 2 — Add the API Connector plugin and configure the Thinkific API Group

In your Bubble editor, open the Plugins tab from the left sidebar. Click the blue Add plugins button in the top-right. In the search box, type API Connector and press Enter. Find API Connector by Bubble in the results and click Install. Once installed, close the plugin marketplace overlay — the API Connector now appears in your Plugins list. Click on API Connector in the left panel. Click the red Add another API button. A new API Group configuration panel opens. Configure the API Group: - Name: Thinkific (this label appears in workflow dropdowns) - Authentication: click the dropdown and choose None — Thinkific authentication is handled through custom headers, not a built-in auth type - Shared headers: click Add a shared header twice to add two rows - Header 1: Key = X-Auth-API-Key, Value = paste your API key here, then check the Private checkbox next to it. The Private checkbox is critical — it tells Bubble to keep this value server-side and hide it from browser network requests. - Header 2: Key = X-Auth-Subdomain, Value = paste your school subdomain (just the slug, e.g., myschool — NOT myschool.thinkific.com) - Shared parameters (URL): no shared URL params needed at this level Do NOT click Private on X-Auth-Subdomain — the subdomain is not a secret and may need to vary in multi-tenant configurations. Leave the base URL blank for now; you will specify the full URL in each individual API Call.

thinkific-api-connector-config.json
1{
2 "api_group_name": "Thinkific",
3 "authentication": "None",
4 "shared_headers": [
5 {
6 "key": "X-Auth-API-Key",
7 "value": "<your-api-key-here>",
8 "private": true
9 },
10 {
11 "key": "X-Auth-Subdomain",
12 "value": "myschool",
13 "private": false
14 }
15 ]
16}

Pro tip: Bubble does not validate header names — if you mistype X-Auth-API-Key as X-Auth-Api-Key (lowercase 'pi'), Thinkific will silently reject the request with a 401. Copy-paste the header names exactly.

Expected result: The Thinkific API Group appears in your API Connector with both headers configured. The API key row shows a lock icon indicating the Private flag is active.

3

Step 3 — Add the Get Courses API call and run the Initialize call

Inside the Thinkific API Group you just created, click Add another call. A new call row appears beneath the group header. Configure this call: - Call name: GetCourses - Method: GET - URL: https://api.thinkific.com/api/v1/courses - Use as: Data (not Action) — this tells Bubble the call returns data that can be bound to UI elements like Repeating Groups - URL parameters: click Add parameter and add two: - page: default value 1 - limit: default value 50 (Thinkific's maximum items per page) The Initialize call is mandatory in Bubble's API Connector before you can use a Data call — Bubble needs a real, successful API response to detect the response schema (field names and types). Without this step, you cannot bind the API response to UI elements. Click Initialize call. Bubble sends the actual GET request to Thinkific using your configured headers. If both headers are correctly set, Thinkific returns a JSON response containing a data array of course objects and a meta object. Bubble automatically detects fields from the response — look for the data array expanding to show fields like id, name, slug, description, price, product_id, course_card_image_url, and percentage_completed. Click Save to lock in the detected schema. If the Initialize call fails with 'There was an issue setting up your call', it almost always means one of two things: (1) the X-Auth-API-Key header value is wrong or missing the Private flag, or (2) the X-Auth-Subdomain header contains the full domain (myschool.thinkific.com) instead of just the slug (myschool).

thinkific-get-courses-call.json
1{
2 "call_name": "GetCourses",
3 "method": "GET",
4 "url": "https://api.thinkific.com/api/v1/courses",
5 "use_as": "Data",
6 "url_parameters": [
7 { "key": "page", "value": "1" },
8 { "key": "limit", "value": "50" }
9 ],
10 "sample_response": {
11 "items": [
12 {
13 "id": 123456,
14 "name": "Introduction to Marketing",
15 "slug": "intro-to-marketing",
16 "price": 9900,
17 "description": "Learn the fundamentals of modern marketing.",
18 "course_card_image_url": "https://cdn.thinkific.com/..."
19 }
20 ],
21 "meta": {
22 "total_count": 12,
23 "next_page": 2,
24 "previous_page": null
25 }
26 }
27}

Pro tip: Thinkific's pagination response uses 'items' as the array key (not 'data' — double-check the actual response your school returns, as some API versions use 'items' and some use 'courses'). Run the Initialize call and observe the actual field names Bubble detects.

Expected result: The GetCourses call shows a green 'Initialized' status. Bubble has auto-detected fields like name, price, slug, and description from the items array. The call is ready to bind to UI elements.

4

Step 4 — Add calls for enrollments, users, and orders

Repeat the 'Add another call' process for the other main Thinkific endpoints you'll need. Here are the three most useful calls to add: GetEnrollments call: - Call name: GetEnrollments - Method: GET - URL: https://api.thinkific.com/api/v1/enrollments - Use as: Data - URL parameters: page (default: 1), limit (default: 50) - Key response fields Bubble will detect: id, user_id, user_email, course_id, percentage_completed, completed_at, activated_at, is_free_trial, updated_at GetUser call (look up a specific student): - Call name: GetUser - Method: GET - URL: https://api.thinkific.com/api/v1/users/[user_id] - Use as: Data - Add a path parameter placeholder: in the URL, type the literal brackets [user_id] — Bubble treats bracketed terms as dynamic parameters - Key response fields: id, first_name, last_name, email, created_at GetOrders call: - Call name: GetOrders - Method: GET - URL: https://api.thinkific.com/api/v1/orders - Use as: Data - URL parameters: page (default: 1), limit (default: 50) - Key response fields: id, user_id, amount_cents, status, created_at For the GetEnrollments call, run Initialize call with a real request. The enrollments endpoint returns all enrollments across all courses — filter to a specific student in Bubble workflows using the user_email or user_id field. Important notes on the price field: Thinkific stores all prices as integers in cents. A price of 9900 means $99.00, not $9,900. In Bubble, you will always need to divide this value by 100 before displaying it. The cleanest way: in your Repeating Group text element, set the value to Thinkific GetCourses's items price / 100 using Bubble's arithmetic expression builder. Free courses return a price value of 0, not null or empty — use = 0 (not is empty) in conditionals to detect free courses.

thinkific-additional-calls.json
1{
2 "calls": [
3 {
4 "name": "GetEnrollments",
5 "method": "GET",
6 "url": "https://api.thinkific.com/api/v1/enrollments",
7 "use_as": "Data",
8 "params": { "page": "1", "limit": "50" }
9 },
10 {
11 "name": "GetUser",
12 "method": "GET",
13 "url": "https://api.thinkific.com/api/v1/users/[user_id]",
14 "use_as": "Data",
15 "dynamic_params": ["user_id"]
16 },
17 {
18 "name": "GetOrders",
19 "method": "GET",
20 "url": "https://api.thinkific.com/api/v1/orders",
21 "use_as": "Data",
22 "params": { "page": "1", "limit": "50" }
23 }
24 ]
25}

Pro tip: Always run the Initialize call on each new API call before trying to use it in workflows. If you skip initialization and try to build a workflow, Bubble will show 'No fields detected' in the data binding dropdowns.

Expected result: You have three initialized API calls in the Thinkific group: GetCourses, GetEnrollments, GetUser, and GetOrders. Each shows detected fields in the Initialize panel.

5

Step 5 — Build a course catalog Repeating Group with price display and enrollment status

Now wire the API data to your Bubble UI. Open a page in the Bubble editor where you want to display the course catalog. Add a Repeating Group element: - Right-click the canvas → Add element → Repeating Group - In the property panel, set Type of content to Thinkific GetCourses's items (Bubble created this type automatically when you initialized the call) - Set Data source to Get data from external API → choose Thinkific - GetCourses - Set the page parameter to 1 and limit to 50 in the API call dialog - Choose List layout (rows or columns depending on your design) Inside the Repeating Group, add elements for each course: Course name (Text element): set value to Current cell's items's name Price display — this is where the cents-to-dollars conversion lives: - Add a Text element - Open the dynamic data editor - Set value to: Current cell's items's price / 100 (use Bubble's arithmetic expression: value :formatted as number with decimal places: 2) - Add a Condition: when Current cell's items's price = 0 → text content changes to 'Free' Progress bar (for enrolled student views): add a Shape element set to a progress bar style with width = (Current cell's items's percentage_completed / 100) × full bar width pixels Enroll button: add a Button element. In the workflow for When Button is clicked, add a step: Schedule API workflow → EnrollStudent (you'll build this in Step 6). Pass the current course ID as a parameter. Pagination: add a 'Load More' button below the Repeating Group. Create a custom state on the page called current_page (Number, default: 1). When Load More is clicked, set current_page = current_page + 1. In the Repeating Group's data source, change the page parameter from the hardcoded 1 to current_page state value. This implements Thinkific's page-based pagination. To show whether the next page exists, add a condition on the Load More button: visible only when Thinkific GetCourses's meta's next_page is not empty.

Pro tip: Bubble's expression builder doesn't have a native 'divide by 100' button — use the arithmetic operator: click on the price field value → click the + Math expression → choose ÷ → type 100. Format the result with ':formatted as number' and 2 decimal places for proper dollar display.

Expected result: Your course catalog Repeating Group displays live data from Thinkific with correctly formatted prices (e.g., '$99.00' not '9900'), a 'Free' label for free courses, and a working Load More button for paginated results.

6

Step 6 — Build the enrollment management Backend Workflow

Programmatic enrollment is the most powerful capability of the Thinkific integration. Instead of manually enrolling students in Thinkific's dashboard, a Bubble Backend Workflow handles it server-side — keeping your API key private and enabling enrollment from any Bubble trigger (button click, payment confirmation, form submission, etc.). Note: Backend Workflows require Bubble's Starter plan ($32/mo) or higher. On the Free plan, this step is not available. To create the Backend Workflow, go to your Bubble editor → click the tab icon in the left sidebar → select Backend workflows. Click Add new API workflow. Configure the workflow: - Name: EnrollStudent - Expose as public endpoint: yes (this allows front-end workflows to schedule it) - Parameters: add two parameters: - user_email (text type) - course_id (number type) Add the first workflow step: click Add step → Plugins → Thinkific - EnrollStudent (API Connector call). First, you need a separate POST API call for enrollment. Go back to the Plugins → API Connector → Thinkific group and add: - Call name: CreateEnrollment - Method: POST - URL: https://api.thinkific.com/api/v1/enrollments - Use as: Action - Body (JSON): set content type to JSON - Body content: { "course_id": <course_id>, "user_email": "<user_email>" } - Mark both body parameters as dynamic (using angle-bracket placeholders) Back in the Backend Workflow, the first step calls CreateEnrollment with course_id = Step's course_id parameter and user_email = Step's user_email parameter. Add a second step to record the enrollment in Bubble's own database: Create a new Thing → select your Enrollment data type (create it in Data tab if needed with fields: user_email text, course_id number, enrolled_at date, source text). Set source to 'thinkific'. Set up Privacy rules for the Enrollment data type: Data tab → Privacy → click Enrollment → Add a rule → 'Creator is Current User' — this ensures each user can only read their own enrollment records, not all students' records. To trigger the Backend Workflow from a front-end button: in the button's workflow, add the step Schedule API workflow → EnrollStudent → pass the current user's email and the selected course ID as parameters. RapidDev's team has built hundreds of Bubble apps with integrations like this — if your enrollment flow needs advanced logic like payment gating or multi-course bundles, book a free scoping call at rapidevelopers.com/contact.

thinkific-create-enrollment-call.json
1{
2 "call_name": "CreateEnrollment",
3 "method": "POST",
4 "url": "https://api.thinkific.com/api/v1/enrollments",
5 "use_as": "Action",
6 "content_type": "application/json",
7 "body": {
8 "course_id": "<course_id>",
9 "user_email": "<user_email>"
10 }
11}

Pro tip: Thinkific's POST /enrollments endpoint requires the user to already exist in Thinkific — if the user_email doesn't match a Thinkific user record, the API returns a 422 Unprocessable Entity. Create the user first via POST /api/v1/users before enrolling.

Expected result: Clicking the 'Enroll' button on any course card triggers the Backend Workflow, creates the enrollment in Thinkific, and records the enrollment in your Bubble database. The student's enrollment appears in their dashboard within seconds.

Common use cases

White-Label Student Dashboard

Build a fully branded student portal in Bubble that pulls live enrollment data from Thinkific. Students log into your Bubble app, see their enrolled courses, track progress via percentage_completed bars, and access course links — without ever seeing the Thinkific interface. Combine with Bubble's built-in user management for SSO-like experiences.

Bubble Prompt

Show a Repeating Group of this student's Thinkific enrollments with a progress bar (percentage_completed / 100) and a 'Continue Learning' button that opens the course URL.

Copy this prompt to try it in Bubble

Admin Enrollment Management Panel

Replace manual Thinkific dashboard operations with a Bubble admin panel. An admin selects a student (from Bubble's User table), selects a course from a Thinkific courses dropdown, and clicks 'Enroll'. A Backend Workflow fires a POST to /api/v1/enrollments, Thinkific creates the enrollment, and the admin panel refreshes with the new record — all without switching tools.

Bubble Prompt

When the admin clicks 'Enroll Student', trigger a Backend Workflow that POSTs to Thinkific's enrollment endpoint with the selected user's email and selected course ID, then show a success confirmation popup.

Copy this prompt to try it in Bubble

Course Catalog Storefront

Fetch all published Thinkific courses via the API and display them in a custom-designed Bubble storefront. Show correct pricing (divide API price in cents by 100), free vs paid badges (price = 0), enrollment counts, and a 'Buy Now' button that links to the Thinkific checkout page. Maintain complete brand control over layout, typography, and filtering logic.

Bubble Prompt

Fetch all courses from Thinkific API, display them in a 3-column Repeating Group with course name, price (formatted from cents), and an 'Enroll Free' or 'Buy for $X' button based on the price field.

Copy this prompt to try it in Bubble

Troubleshooting

Initialize call shows 'There was an issue setting up your call' with no HTTP status code

Cause: The X-Auth-Subdomain header value contains the full domain (e.g., myschool.thinkific.com) instead of just the subdomain slug (myschool). Alternatively, the X-Auth-API-Key header has a typo or the key was not correctly copied from Thinkific Settings.

Solution: Open the Thinkific API Group in the API Connector. Check the X-Auth-Subdomain header value — it must be only the slug (e.g., myschool), not the full URL. Then verify the API key by regenerating it in Thinkific Settings → Code & API → API if you're unsure of its accuracy.

API calls return 401 Unauthorized even though the Initialize call succeeded

Cause: The X-Auth-API-Key header was accidentally not marked as Private, and Bubble is not including it in server-side calls the same way. More commonly, the API key was regenerated in Thinkific after the API Connector was configured — the old key is now invalid.

Solution: Go to Plugins → API Connector → Thinkific API Group → check that the X-Auth-API-Key row has the Private checkbox checked. Confirm the key matches what's currently shown in Thinkific Settings → Code & API → API. If you've regenerated the key in Thinkific, update the value in Bubble and re-run the Initialize call.

The 'Code & API' section does not appear in Thinkific Settings

Cause: The Thinkific account is on the Free plan, which does not include API access. The Code & API section is only visible on Basic ($36/mo) and higher plans.

Solution: Upgrade the Thinkific school to the Basic plan or higher. As a temporary workaround for read-only data needs, Thinkific provides CSV export under Manage → Students → Export — import this CSV into a Bubble Data Type to display course data without API access.

Course prices display as large integers (e.g., 9900) instead of dollar amounts ($99.00)

Cause: Thinkific stores prices in cents as integers. The API returns 9900 for a $99 course — this is expected behavior, not an API bug.

Solution: In the Repeating Group Text element displaying price, set the expression to: [Thinkific course price] / 100, then apply :formatted as number with 2 decimal places. Add a conditional: when price = 0, show 'Free' instead. Do not use 'is empty' to check for free courses — free courses return 0, not null.

Backend Workflows option is not visible in the Bubble editor

Cause: The Bubble app is on the Free plan. Backend Workflows are a paid feature available on Starter ($32/mo) and higher plans.

Solution: Upgrade the Bubble app to the Starter plan to unlock Backend Workflows. For read-only operations (displaying courses, enrollments), the Free plan works — but for the enrollment POST call, upgrading is strongly recommended to keep the API key server-side. On the Free plan, a client-side API Connector call with the Private flag will still protect the key, but Bubble's Free plan is not suitable for production apps handling student data.

Enrollment POST returns 422 Unprocessable Entity

Cause: The user_email passed to POST /api/v1/enrollments does not match any existing Thinkific user account. Thinkific requires the student to exist as a user before they can be enrolled in a course.

Solution: First call POST /api/v1/users to create the student record in Thinkific (with first_name, last_name, email), then call POST /api/v1/enrollments with the returned user ID or email. Add both calls as sequential steps in your Backend Workflow: step 1 creates the user, step 2 creates the enrollment using the result from step 1.

Best practices

  • Always mark X-Auth-API-Key as Private in Bubble's API Connector — this ensures the key is stored and transmitted server-side only, never exposed in browser network requests or source code
  • Store the school subdomain in a Bubble App Setting (Settings → App Settings → create a setting called 'thinkific_subdomain') rather than hardcoding it in the header — this makes your Bubble template reusable for multiple Thinkific schools
  • Set privacy rules on any Enrollment or Course Data Types you create in Bubble: Data tab → Privacy → add a rule restricting each user to reading only their own records — without this, all students can read all other students' enrollment data
  • Use Thinkific's meta.next_page field to conditionally show or hide a 'Load More' button — do not call the enrollments or courses endpoint without checking if a next page exists, as unnecessary API calls consume Bubble Workload Units (WU)
  • Cache course data in Bubble's database for courses that don't change frequently — fetching the course catalog on every page load via API Connector costs WU; a daily Backend Workflow that refreshes a local Course data type is more efficient for large catalogs
  • For enrollment POST calls, always use a Backend Workflow rather than a direct client-side API Connector action — even though the Private header protects the key, Backend Workflows provide server-side execution, better error handling, and audit-log-friendly Logs tab entries
  • Add error handling in every workflow that calls Thinkific: if the API response's id field is empty or a specific error field is not empty, route to an error state instead of silently failing — Thinkific returns 200-level responses on some validation errors
  • Do not expose the raw Thinkific API endpoint URLs in your Bubble app's client-side JavaScript or visible text fields — even though the API key is protected, endpoint exposure combined with the subdomain header can enable subdomain enumeration

Alternatives

Frequently asked questions

Do I need to upgrade my Bubble plan to use Thinkific's API?

For read-only use cases (displaying courses, checking enrollment status), Bubble's Free plan works — the API Connector with Private headers runs correctly. However, for creating enrollments via Backend Workflows (the recommended approach for keeping your API key secure and your workflow logic server-side), you need Bubble's Starter plan ($32/mo) or higher. For any production app handling real student data, Starter plan is strongly recommended.

Why does Thinkific require two headers instead of just one API key?

Thinkific uses X-Auth-Subdomain to identify which school the request is targeting on their shared infrastructure — similar to how multi-tenant SaaS platforms use subdomains to route requests. The X-Auth-API-Key then authenticates the request against that specific school's credentials. Both are required for every request; missing either one returns a 401 with minimal error detail.

Can I show enrollment progress bars in my Bubble app?

Yes. The Thinkific enrollments endpoint returns a percentage_completed field (an integer from 0 to 100) for each enrollment. In Bubble, add a Shape element styled as a rectangle, set its width dynamically to (Current cell's enrollments's percentage_completed / 100) × your full bar width in pixels. Add a completed_at timestamp check: if completed_at is not empty, show a completion badge.

What happens if a student isn't in Thinkific yet when I try to enroll them?

Thinkific's POST /api/v1/enrollments returns a 422 Unprocessable Entity if the user_email doesn't match an existing Thinkific user. Your Backend Workflow should first call POST /api/v1/users to create the student record, then call POST /api/v1/enrollments using the returned user ID. Structure your enrollment workflow as two sequential steps — step 1 creates the user, step 2 creates the enrollment.

How do I handle more than 50 courses or enrollments in my Bubble app?

Thinkific's API limits each page to 50 items maximum. Use Thinkific's meta object in the response: meta.next_page contains the next page number (or null if you're on the last page). In Bubble, store a custom state called current_page (Number, starting at 1). Wire a 'Load More' button to increment current_page by 1, and pass that state as the page URL parameter in your API Connector call. Show the Load More button only when meta.next_page is not empty.

Is my Thinkific API key safe in Bubble's API Connector?

Yes — as long as you check the Private checkbox on the X-Auth-API-Key header. When marked Private, Bubble stores the key server-side and never includes it in data sent to the browser. Bubble's API Connector runs from Bubble's own servers, not from the user's browser, so your key is protected from network request inspection. Never put the API key in a client-side Text element, App Setting that's publicly readable, or unprotected workflow parameter.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire Bubble integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.