Connect Bubble to Udacity by building an enterprise L&D portal on top of Udacity's enterprise API (Bearer token, requires Enterprise plan) or by importing Udacity for Business CSV exports into a Bubble Data Type. Bubble's API Connector handles the API path server-side with a Private header; the CSV path works on any plan. Either way, build cohort dashboards, at-risk learner views, and manager notification workflows — the reporting layer Udacity's own admin panel cannot provide.
| Fact | Value |
|---|---|
| Tool | Udacity |
| Category | Education |
| Method | Bubble API Connector |
| Difficulty | Intermediate |
| Time required | 35 minutes |
| Last updated | July 2026 |
Why Connect Bubble to Udacity?
Organizations using Udacity for employee upskilling face a consistent gap: Udacity's native admin dashboard shows learner data one program at a time, but L&D managers and HR business partners need an aggregated view — which cohorts are completing on schedule, which engineers are stuck in their Nanodegree, and whether the investment in specific programs is translating to completion rates that justify renewal.
Building that visibility layer in Bubble lets you combine Udacity data with your own user records, department structures, and notification workflows — all in a branded internal portal that non-technical stakeholders can actually use. Bubble's visual editor handles the dashboard UI; its API Connector handles the Udacity data fetch server-side with a Private header, keeping credentials off the browser entirely.
For corporate L&D teams not yet on Udacity's Enterprise tier, the CSV-backed approach provides the same dashboard without any API access at all: export the weekly progress report from the Udacity for Business admin portal, upload it via Bubble's CSV Import tool, and all the same Repeating Group queries and completion calculations work immediately from Bubble's database.
The result is a self-service L&D operations portal: cohort-level completion charts, an at-risk learner view filtered by inactivity, and a 'Send Reminder' button that triggers a Backend Workflow to email or Slack a manager. None of this is possible inside Udacity's native interface.
Integration method
Bubble connects to Udacity's enterprise API via the API Connector plugin. The Bearer token is stored in a 'Private' shared header so it never reaches the browser. For organizations without enterprise API access, Bubble's native CSV Import tool loads Udacity for Business admin exports directly into a Bubble Data Type — no API required.
Prerequisites
- A Udacity for Business or Enterprise account — contact Udacity enterprise sales to enable API access and receive credentials
- Alternatively, access to the Udacity for Business admin portal to download progress CSV exports (Business plan or higher)
- A Bubble account with the API Connector plugin installed (Plugins tab → Add plugins → search 'API Connector')
- For scheduled data refresh or manager notification workflows: a paid Bubble plan (Starter or above) — Free plan cannot run scheduled API Workflows
- Optional: Bubble Environment Variables configured (App Data → Environment Variables) to store your Udacity token without exposing it in API Connector header fields visible in the editor
Step-by-step guide
Obtain Udacity credentials and choose your integration path
Udacity's API is not self-service — individual accounts cannot generate an API key from a dashboard. Enterprise API access requires an active Udacity for Business or Enterprise plan and a request to your Udacity account manager or customer success team. When API access is enabled, Udacity provides a base URL (commonly https://api.udacity.com/api/v1/enterprise/ — verify with your account manager, as subdomains can be account-specific) and an authentication token. Note whether the token uses 'Bearer' or 'Token' prefix in the Authorization header, because Udacity API versions vary on this point — you will test both formats in Step 2. If you do not yet have enterprise API credentials, choose the CSV path: log into the Udacity for Business admin portal at https://business.udacity.com and navigate to Reports or Analytics to download the progress export. The export includes fields for learner email, program title, cohort name, enrollment date, progress percentage, status, and last activity date — these map directly to the Bubble Data Type you will create in Step 3. Either way, note the exact column names in the CSV or endpoint field names from Udacity's documentation before building your Bubble Data Type — a mismatch between Udacity's export column headers and your Bubble field names will produce empty data on import and is the most common first-import issue.
Pro tip: Ask your Udacity account manager for the API documentation PDF or Confluence link during onboarding — Udacity's enterprise API docs are not publicly indexed, and the exact endpoint paths and pagination format vary by contract tier.
Expected result: You have either an enterprise API token and base URL ready to configure in Bubble, or a CSV export from the Udacity for Business admin portal downloaded and ready to import.
Create the UdacityLearner Data Type and import CSV data
Whether you use the API or CSV path, you need a Bubble Data Type to store learner records — the database becomes your fast query layer that avoids hitting Udacity's API on every page load. In your Bubble editor, click the Data tab in the left sidebar, then click 'Add a new type' and name it 'UdacityLearner'. Add the following fields: - email (text) - name (text) - program_title (text) - cohort_name (text) - enrollment_date (date) - progress_percentage (number) - status (text — values: enrolled, in_progress, completed, withdrawn) - last_activity_date (date) - manager_email (text) - department (text) - imported_at (date) For the CSV import path: in the Data tab, click 'CSV Import'. Select your Udacity for Business CSV export. Map each Udacity column to the corresponding Bubble field. If Udacity's column headers do not exactly match, use the dropdown on each field to remap. After import, verify a few records in the Data tab's App Data view to confirm field values populated correctly — specifically check that progress_percentage is a number (not a text field with a % symbol) and that dates parsed correctly. Add privacy rules immediately after creating this Data Type: Data tab → Privacy → Add a new rule for UdacityLearner. Set the rule so that 'Only the logged-in user with role = admin' can view all fields. Without this rule, any logged-in user can query all learner records including emails and completion rates from the browser.
Pro tip: If Udacity's CSV export includes a percentage symbol in the progress field (e.g., '67%' instead of '67'), use a spreadsheet to clean the column before importing — strip the % sign and save as plain number. Bubble's number field will reject non-numeric values silently.
Expected result: The UdacityLearner Data Type exists in Bubble with all fields defined, privacy rules applied, and at least one batch of records imported. You can see learner data in the App Data tab.
Configure the Udacity API Connector (enterprise API path)
If you have enterprise API credentials, configure Bubble's API Connector to fetch live enrollment data. In the Bubble editor, click Plugins in the left sidebar, then 'Add plugins' and search for 'API Connector'. Install it (by Bubble). In the API Connector panel, click 'Add another API' and name it 'Udacity'. Set the base URL to your Udacity enterprise API endpoint (e.g., https://api.udacity.com/api/v1/enterprise/ — use the exact URL from your Udacity account manager). Under Shared Headers, click 'Add a shared header' and enter: - Key: Authorization - Value: Bearer YOUR_ENTERPRISE_TOKEN Check the 'Private' checkbox next to this header. This is critical — Private marks the header as server-side only, so it never appears in browser network traffic regardless of how the call is used in your app. Add a second shared header: Key = Content-Type, Value = application/json. Now add your first call: click 'Add another call' inside the Udacity API. Name it 'Get Enrollments'. Set Method to GET. Set the path to /enrollments (append to the base URL). Add parameters for pagination: add a parameter named 'page' with a default value of '1', and 'per_page' with a default of '50'. Set 'Use as' to Data and click 'Initialize call'. The Initialize Call requires a REAL successful response from Udacity's API — Bubble uses the actual response JSON structure to auto-detect field names. If the call returns a 401, check whether Udacity requires 'Token' prefix instead of 'Bearer' — update the Authorization header value and re-initialize. After successful initialization, Bubble shows the detected fields (learner_email, program_title, cohort_name, etc.) in the 'Expand response' section. These fields are now available in the Bubble editor for use in Repeating Groups and Text elements.
1{2 "method": "GET",3 "url": "https://api.udacity.com/api/v1/enterprise/enrollments",4 "headers": {5 "Authorization": "Bearer <private>",6 "Content-Type": "application/json"7 },8 "params": {9 "page": "1",10 "per_page": "50"11 }12}Pro tip: If the Initialize Call fails with a 401, try changing the header value from 'Bearer YOUR_TOKEN' to 'Token YOUR_TOKEN' — Udacity's API version for your enterprise tier may use the Token prefix. Ask your account manager to confirm the correct format if both fail.
Expected result: The 'Get Enrollments' call in the API Connector shows 'Initialized' status and a list of auto-detected fields from Udacity's enrollment response. The call is ready to use in Bubble workflows and Repeating Groups.
Build the cohort dashboard with Repeating Groups
Now build the L&D portal's main view: a cohort completion dashboard that gives managers an at-a-glance view of program progress. Create a new Bubble page named 'cohort-dashboard'. Add a Group element at the top for filters: insert a Dropdown element with options for department (pulled from a search for UdacityLearner's unique department values using :unique items). Add a second Dropdown for status (enrolled, in_progress, completed). Add a Repeating Group below the filters. Set its Data source to 'Search for UdacityLearners' with constraints matching your filter Dropdowns. Set Layout to 'Full List'. In the Repeating Group's first cell, add: - Text element: Current cell's UdacityLearner's name - Text element: Current cell's UdacityLearner's program_title - Text element: Current cell's UdacityLearner's cohort_name - Text element: 'Progress: ' + Current cell's UdacityLearner's progress_percentage + '%' - Text element: 'Last active: ' + Current cell's UdacityLearner's last_activity_date:formatted as [Day] [Month abbr] [Year] - A colored Shape element used as a status indicator: set its background color to a conditional — if status = 'completed' then green; if status = 'in_progress' then orange; otherwise red. Above the Repeating Group, add stat Text elements showing aggregate values: - Total enrolled: Search for UdacityLearners:count - Completed: Search for UdacityLearners with constraint status = completed :count - Average progress: Search for UdacityLearners:average of progress_percentage:formatted as '0' + '%' All Bubble aggregations (:count, :average, :sum) run as database queries — they do not require JavaScript or additional API calls. For cohort grouping: add a second Repeating Group grouped by cohort_name. Set its Data source to 'Search for UdacityLearners' and in the cell, display the cohort_name and a count of learners in that cohort using ':filtered' to scope back to just that cohort's name.
Pro tip: Bubble's Repeating Group 'Search for...' queries run server-side. Avoid adding more than 3-4 constraints at once on large datasets — break complex filtering into a second step using :filtered on the result rather than nesting all constraints in the original search.
Expected result: The cohort dashboard page loads showing a filterable Repeating Group of learners with status indicators, and stat elements above showing org-wide totals. Dropdown filters update the list when changed.
Build the at-risk learner view and manager notification workflow
The most operationally valuable part of the L&D portal is proactive identification of learners who have gone quiet — and triggering a manager notification before they drop the program entirely. Add a new Tab or Group on your dashboard labeled 'At Risk'. Inside it, add a Repeating Group with data source: Search for UdacityLearners with constraints: - last_activity_date < Current date/time + days(-14) - status is not completed This query returns every learner who has been inactive for 14 or more days and has not yet finished their program. Style the Repeating Group cells with a yellow or orange background to make the at-risk status visually clear. Show the learner's name, program_title, progress_percentage, and a calculated 'Days inactive' field: Current date/time - Current cell's UdacityLearner's last_activity_date:formatted as '[difference in days] days'. Add a 'Send Reminder' button in each Repeating Group cell. Set the button's workflow: on click → 'Schedule API Workflow on a list' (paid plan required) — OR for the simpler approach on any plan, use a 'Send email' action directly in the button click workflow, pulling the manager_email from the current cell's UdacityLearner record and including the learner's name and program_title in the email body. For the paid-plan automated version: Settings → API → enable 'This app exposes a Workflow API'. Create a Backend Workflow named 'notify_at_risk_learner' with parameters for learner_name (text), program_title (text), and manager_email (text). In the workflow, add a Send Email action (or an API call to a Slack webhook) using these parameters. In your page workflow, use 'Schedule API Workflow on a list' to trigger notify_at_risk_learner for each at-risk learner in the Repeating Group. For weekly automated checks (paid plan): go to the Backend Workflows section and add a 'Recurring event' that runs every Monday at 8 AM. In its workflow, run a search for at-risk learners and schedule notify_at_risk_learner for each result. Note: 'Schedule API Workflow', 'Recurring events', and Backend Workflows all require a paid Bubble plan. Free-plan apps cannot run scheduled or backend workflows. If you are on Free, use the manual 'Send Reminder' button approach on the at-risk page instead. RapidDev's team has built hundreds of Bubble L&D portals with multi-source data integrations like this — if you want a free scoping call to discuss your architecture, visit rapidevelopers.com/contact.
Pro tip: The 'At-risk' constraint 'last_activity_date < Current date/time - 14 days' requires the last_activity_date field to be populated. If some records have a blank last_activity_date (never logged in), add a second search condition using 'OR last_activity_date is empty' to catch those learners as well.
Expected result: The at-risk view shows a Repeating Group of inactive learners with a Send Reminder button. Clicking the button triggers an email or Slack notification to the learner's manager. On paid plans, a recurring Backend Workflow sends these notifications automatically each Monday.
Schedule weekly data refresh and add privacy rules
Since Udacity's enterprise API does not push updates to Bubble, set up a weekly refresh workflow to keep the UdacityLearner Data Type current. For the API path (paid Bubble plan): in Backend Workflows, add a Recurring event named 'refresh_udacity_data' set to run weekly. In its workflow, add an API Connector call action using your 'Get Enrollments' call. For each returned enrollment record, use 'Create or update a UdacityLearner' — search for an existing record matching the email field, and if found, update progress_percentage, status, and last_activity_date; if not found, create a new record. This prevents duplicate entries on each refresh. For the CSV path: export a fresh CSV from the Udacity for Business admin portal each week. Before importing, note any column name changes — Udacity may rename export columns when they update their admin interface. Import via Data tab → CSV Import, remapping columns as needed. Privacy rules are mandatory before you share this app with any non-admin users. In the Data tab, click 'Privacy'. Click 'Add a new rule' for UdacityLearner. In the rule editor: - Set the condition to 'Current User's role = admin' (or however your app defines admin users) - Check 'View all fields' under this condition - Leave all checkboxes unchecked for the default (no condition) row — this blocks all access by default This ensures that learner emails, progress percentages, and manager email addresses are only visible to authorized admin users. Without this rule, any logged-in user in your Bubble app can retrieve all UdacityLearner records via a direct client-side search — Bubble's database is not private by default. Also verify that the API Connector's Bearer token header has the 'Private' checkbox checked — re-open Plugins → API Connector → Udacity → Shared Headers and confirm the checkbox is active. Bubble shows a lock icon next to private headers.
Pro tip: After a successful weekly refresh workflow run, check Logs tab → Workflow logs in the Bubble editor. Look for any 'There was an issue setting up your call' errors — these typically indicate Udacity API token expiry. If your enterprise token has an expiration date, set a Bubble calendar reminder to rotate it before it lapses.
Expected result: A weekly refresh process is in place (automated on paid plan, manual CSV on free plan). Privacy rules block non-admin users from viewing learner records. The Logs tab shows successful workflow runs.
Common use cases
Nanodegree cohort completion tracker
Build a Bubble dashboard that groups all active Udacity enrollments by cohort and Nanodegree program, displaying completion rates, average progress percentages, and days remaining. L&D managers filter by department or cohort start date to see which groups are on track and which need intervention — all from a Repeating Group reading from the UdacityLearner Data Type.
Build a cohort dashboard Repeating Group grouped by cohort_name. Each row shows program_title, total enrolled count, average progress_percentage (using :average), and completed count (using :count where status = completed). Add a dropdown filter for department and a date range for enrollment_date.
Copy this prompt to try it in Bubble
At-risk learner identification panel
Build a Bubble view that queries UdacityLearner records where last_activity_date is more than 14 days ago and status is not 'completed'. Display these at-risk learners in a highlighted Repeating Group with a 'Send Reminder' button that triggers a Backend Workflow emailing or Slacking the manager — creating the proactive re-engagement flow that Udacity's admin panel lacks.
Show a Repeating Group of UdacityLearner where last_activity_date < Current date/time - 14 days and status is not completed. Add a Send Reminder button that triggers a Backend Workflow sending an email to the learner's manager_email field with their program_title and days_since_activity.
Copy this prompt to try it in Bubble
Executive L&D ROI dashboard
Build an executive-facing Bubble page that aggregates Udacity completion data alongside internal HR records. Use Bubble's built-in :count and :average operators to calculate org-wide completion rates per program. Display trend lines using Bubble's Chart plugin, and surface cost-per-completion by joining with a Bubble Data Type holding your Udacity seat pricing per cohort.
Create a stats panel showing total enrolled, total completed, and org-wide average progress_percentage from a search of UdacityLearner. Add a Chart (bar type) of completion_rate by cohort_name. Add a Cost-per-completion KPI: divide total_seat_cost by completed_count from a joined CohortBudget Data Type.
Copy this prompt to try it in Bubble
Troubleshooting
API Connector returns 401 Unauthorized even after entering the correct token
Cause: Udacity enterprise API versions vary by contract tier. Some use 'Bearer TOKEN' as the Authorization header value; others require 'Token TOKEN' with a different prefix. Additionally, enterprise tokens may have an expiration period that is not immediately obvious from the token string itself.
Solution: Open Plugins → API Connector → Udacity → Shared Headers and try changing the Authorization header value from 'Bearer YOUR_TOKEN' to 'Token YOUR_TOKEN'. Click Initialize call again after the change. If both formats fail, contact your Udacity account manager to confirm the exact header format for your enterprise tier. Also ask whether tokens expire and at what interval — set a Bubble reminder to rotate the token before expiry.
'There was an issue setting up your call' appears in Bubble Logs when running the enrollment fetch workflow
Cause: This Bubble-native error appears when the Initialize Call was set up with test credentials that differ from the credentials now in use, or when the Udacity API endpoint URL has changed (Udacity may use account-specific subdomains). It can also appear if the API Connector call was never initialized successfully — Bubble requires a real successful response to initialize the schema.
Solution: Open the API Connector and click 'Initialize call' again while the correct API token is active in the Private header. Confirm the base URL with your Udacity account manager — it may be an account-specific subdomain (e.g., https://api-acme.udacity.com) rather than the generic https://api.udacity.com. After a successful re-initialization, re-publish your Bubble app.
Progress_percentage values are empty or show as 0 for all learners despite active enrollments in Udacity
Cause: Udacity's enterprise API may not include progress data in the bulk enrollment list endpoint — progress may require a separate per-learner call to an endpoint like /learners/{id}/progress. For the CSV import path, this happens when the progress column in the export contains a '%' symbol (e.g., '67%'), causing Bubble's number field to reject the value silently.
Solution: For the API path: check whether the enrollment list response includes a progress_percentage field. If not, you need a separate API Connector call (e.g., 'Get Learner Progress') that takes a learner_id as a dynamic path parameter. Use a Backend Workflow (paid plan) to iterate through learner IDs and fetch progress individually, storing results in UdacityLearner records. For the CSV path: clean the progress column in a spreadsheet — strip the '%' sign from all values and ensure the column is formatted as a plain number before importing.
Recurring Backend Workflow for weekly data refresh does not appear to run
Cause: Recurring events in Bubble's Backend Workflows require a paid plan. On the Free plan, the workflow is saved but never executes. Additionally, the Workflow API must be enabled in Settings → API for Backend Workflows to function.
Solution: Verify your Bubble plan includes Backend Workflows (Starter or higher). Go to Settings → API and confirm 'This app exposes a Workflow API' is enabled. Check the Logs tab → Workflow logs for any error entries from the expected run time. If no logs appear at all, the recurring event is not triggering — ensure the event is activated (the toggle next to the recurring event name in Backend Workflows must be on).
CSV import fails or maps data to wrong Bubble fields
Cause: Udacity for Business CSV exports may use different column names across plan tiers or after Udacity admin interface updates. Column names like 'Learner Email' vs 'email' or 'Progress (%)' vs 'progress_percentage' cause Bubble's CSV importer to map to wrong fields or skip columns entirely.
Solution: Before each CSV import, open the file in a spreadsheet and check the header row. Rename any columns that don't match your expected names, and strip any non-numeric characters from numeric fields (especially the percentage column). In Bubble's CSV Import tool, use the field mapping dropdowns to manually assign each column to its correct Bubble field — do not rely on automatic name matching when Udacity's column headers differ.
Best practices
- Always check the 'Private' checkbox on the Authorization header in Bubble's API Connector — this single checkbox is the difference between your Udacity enterprise token being server-side only versus potentially visible in browser developer tools.
- Add privacy rules to the UdacityLearner Data Type before sharing your Bubble app with any non-admin users — without rules, logged-in users can query all learner records including emails and completion data directly from the browser.
- Use a Bubble Data Type as your query layer rather than fetching from Udacity's API on every page load — Bubble database queries are sub-100ms, while enterprise API calls can be several seconds, especially for large cohorts.
- For large enterprises with hundreds of enrolled learners, use a Backend Workflow to pre-fetch progress data and store it in UdacityLearner records nightly — fetching per-learner progress on page load for 200+ users will hit rate limits and make the page unusable.
- Display a 'Last updated' timestamp on your dashboard pulled from the most recent UdacityLearner imported_at value — stakeholders need to know whether they are looking at real-time API data or a cached snapshot from a weekly CSV import.
- Build your at-risk learner query using Bubble's server-side search constraints rather than filtering on the frontend — this keeps WU consumption low and ensures the filter works correctly even for managers who are not Bubble admins.
- Confirm whether your Udacity enterprise token has an expiration date at onboarding — if it does, add a Bubble reminder workflow that sends an admin alert 7 days before expiry, so the Logs tab never fills up with 401 errors from a lapsed token.
- Test the full integration with a single cohort or small pilot group (5-10 learners) before expanding to the full organization — validate that field names, progress values, and date formats all display correctly before bulk-importing thousands of records.
Alternatives
Choose Coursera if your organization uses Coursera for Business, which offers broader course variety beyond tech-focused Nanodegrees and a partner API with more programmatic data access than Udacity's enterprise-gated model.
Choose Codecademy if your team primarily needs interactive coding exercises for individual skill development — Codecademy has no public API at all, so the Bubble integration is entirely CSV-based, but the content is strong for coding fundamentals.
Choose Skillshare if your organization needs creative and business skills alongside technical content, with an affiliate API accessible without enterprise plan requirements — a very different access model from Udacity's gated enterprise API.
Frequently asked questions
Does Udacity offer a public REST API that I can use without an enterprise account?
No. Udacity's API access is exclusively available to enterprise customers through their Udacity for Business or Enterprise tier plans. Individual consumer accounts cannot generate API keys from any dashboard. Contact Udacity's enterprise sales team to enable API access for your organization — your Udacity account manager will provide credentials and API documentation specific to your contract tier.
What is the difference between 'Bearer' and 'Token' in the Authorization header for Udacity?
Udacity's enterprise API versions vary by contract and API version. Some enterprise customers use 'Authorization: Bearer YOUR_TOKEN' while others use 'Authorization: Token YOUR_TOKEN'. In Bubble's API Connector, enter whichever format your Udacity account manager specifies in the shared header value field (marked Private). If both fail with 401 errors, confirm the exact prefix with Udacity support.
Do Backend Workflows and scheduled recurring events require a paid Bubble plan?
Yes. Backend Workflows, scheduled recurring events, and the 'Schedule API Workflow on a list' action all require a paid Bubble plan (Starter or higher). The Free plan cannot run any backend or scheduled workflows. If you are on Free, use manual 'Send Reminder' button actions and perform CSV imports manually rather than automating them.
How do I handle the case where progress data is not included in Udacity's enrollment list response?
Udacity's enterprise API may require a separate per-learner progress endpoint call (e.g., /learners/{id}/progress) to get detailed progress data. For large cohorts, making one API call per learner on page load is impractical. Use a Backend Workflow that runs nightly on a schedule (paid plan required), iterates through all UdacityLearner records, fetches progress for each, and updates the progress_percentage field in Bubble's database. Your dashboard then reads from the database rather than calling Udacity on every load.
What should I do if Udacity does not provide API access for my subscription tier?
Build the CSV-backed path: export enrollment and progress reports from the Udacity for Business admin portal as CSV files, and use Bubble's built-in CSV Import tool (Data tab → CSV Import) to load them into the UdacityLearner Data Type. All the same dashboard views, at-risk filters, and stat calculations work identically — the only difference is that data freshness depends on how often you run the export and import cycle.
How do I prevent unauthorized users from viewing sensitive learner data in my Bubble app?
Add privacy rules to the UdacityLearner Data Type immediately after creating it: Data tab → Privacy → Add a new rule. Set the rule to allow 'View all fields' only when the current user has an admin role or is in an authorized admin group. Without this rule, any logged-in user in your Bubble app can retrieve all learner records — including emails, progress percentages, and manager information — directly from the browser. Privacy rules are Bubble's equivalent of row-level security.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation