PyCharm has no hosted REST API — the real integration is connecting Bubble to JetBrains Space (the DevOps hub JetBrains ships alongside PyCharm) via its REST API, or using PyCharm to build a Python Flask/FastAPI backend that Bubble calls. The API Connector handles both paths with a Bearer token kept Private, so your credentials never reach the browser.
| Fact | Value |
|---|---|
| Tool | PyCharm |
| Category | DevOps & Tools |
| Method | Bubble API Connector |
| Difficulty | Intermediate |
| Time required | 45–60 minutes |
| Last updated | July 2026 |
Two ways to connect Bubble and PyCharm
Most founders searching 'connect Bubble to PyCharm' want one of two things: they either want to display data from their development workflow (issues, CI runs, deployments) inside a Bubble app, or they want to use PyCharm to build the Python backend that powers their Bubble app's more complex logic. This guide covers both. For the first path, JetBrains Space is the hosted service you connect to — its REST API lives at https://{org}.jetbrains.space/api/http and uses Bearer token auth. For the second path, you build and deploy a Flask or FastAPI service in PyCharm, then point the Bubble API Connector at its HTTPS endpoint. Both paths use Bubble's server-side API Connector, which means your tokens and secrets stay on Bubble's servers and never appear in user browsers.
Integration method
Bubble's built-in API Connector calls the JetBrains Space REST API (or your custom Python backend) server-side, keeping your Bearer token in a Private header where it never reaches the browser.
Prerequisites
- A JetBrains Space account with at least one project (free tier supports up to 5 users at https://jetbrains.space)
- A Bubble account — any plan works for outbound API Connector calls
- Admin access to your JetBrains Space organization to create a Service Application (for Path 1)
- For Path 2: a deployed Python service with an HTTPS endpoint (Bubble requires HTTPS for API calls)
Step-by-step guide
Decide your path: JetBrains Space API or custom Python backend
Before opening Bubble, clarify what you actually want to connect. If your goal is to display project data — issues, code review status, deployment history — from your JetBrains development workflow inside a Bubble app, you want Path 1: the JetBrains Space REST API. Space is the hosted DevOps platform JetBrains ships with PyCharm Professional and Team subscriptions, and it has a documented REST API at https://{org}.jetbrains.space/api/http. No Python code required for this path. If your goal is for Bubble to call custom business logic — data transformations, ML models, file processing, third-party API orchestration that Bubble can't do natively — you want Path 2: build and deploy a Python service in PyCharm (Flask or FastAPI are the most beginner-friendly), then configure the Bubble API Connector to call that service's HTTPS URL. This tutorial walks through Path 1 in full detail (the Space API), then covers what changes for Path 2 in the final step. Non-technical founders should follow Path 1. Founders with a developer available should consider Path 2 for complex Bubble apps.
Pro tip: Not sure which path? If you can describe the data you want in Bubble as 'things my dev team tracks in JetBrains Space,' use Path 1. If you need custom logic not available in Bubble's toolkit, use Path 2.
Expected result: You know which integration path to follow and can move to the next step with a clear goal.
Create a JetBrains Space Service Application and copy the token
For Path 1, you need a Service Application token from JetBrains Space — this is safer than a Personal Token because it grants only the scopes your Bubble app needs, and it doesn't expire when a team member leaves. In your browser, go to your JetBrains Space organization: https://{org}.jetbrains.space. Click the gear icon in the top-right corner to open Administration. In the left sidebar, find Applications under the 'Authentication' section and click it. Click New Application in the top-right. Give it a name like 'Bubble Integration' and click Create. On the application's page, go to the Authorization tab. Click Configure Requirements. Add the following permissions based on what your Bubble app will display: - Projects → Project.Issues.View (to read issues) - Projects → Deployments.View (to read deployment status) - Projects → CodeReview.View (to read code review status) Click Save. Now go to the Permanent Tokens tab and click Generate Token. Copy the token immediately — it won't be shown again. Store it somewhere safe like a password manager. This token goes into Bubble's API Connector as a Private header, so it never touches the browser.
Pro tip: Use the least-privilege approach: only add the permission scopes your Bubble app actually needs. A read-only 'Project.Issues.View' scope is sufficient for a display-only dashboard.
Expected result: You have a JetBrains Space Service Application with appropriate scopes and a copied Bearer token ready to paste into Bubble.
Configure the Bubble API Connector with Space base URL and Private header
Open your Bubble app editor. In the left sidebar, click the Plugins tab (the puzzle piece icon). If you don't see the API Connector in your installed plugins list, click Add plugins, search for 'API Connector', find the one published by Bubble, and click Install. Return to the Plugins tab. Click API Connector in the installed plugins list. Click Add another API to create a new API group. In the 'API Name' field, enter 'JetBrains Space'. In the 'Shared headers for all calls' section, click Add a shared header. Set the key to `Authorization` and the value to `Bearer YOUR_TOKEN_HERE` — replace `YOUR_TOKEN_HERE` with the token you copied in the previous step. Critically, check the 'Private' checkbox to the right of this header. This tells Bubble to process this header server-side only, so the token never appears in the user's browser network tab. In the 'Base URL' field (if available at the API level) or in each call, you will use: `https://{org}.jetbrains.space/api/http` Replace `{org}` with your actual JetBrains Space organization subdomain. If your Space URL is myteam.jetbrains.space, the base URL is https://myteam.jetbrains.space/api/http. Using just jetbrains.space without your org subdomain will return a 404 error.
1{2 "API Name": "JetBrains Space",3 "Authentication": "None or Private Key in Header",4 "Shared Headers": {5 "Authorization": "Bearer <private>"6 },7 "Base URL": "https://{org}.jetbrains.space/api/http"8}Pro tip: Double-check your Space org subdomain. The URL pattern is always {orgName}.jetbrains.space — find it by logging into Space and looking at the URL in your browser's address bar.
Expected result: The JetBrains Space API group appears in your API Connector with a Private Authorization header configured. No calls added yet.
Add API calls for issues and deployments, then initialize
With the JetBrains Space API group configured, click Add another call inside it to define your first endpoint. For listing issues in a project: - Set the call name to 'Get Project Issues' - Set the method to GET - Set the URL to: `https://{org}.jetbrains.space/api/http/projects/id:{projectKey}/issues` - Replace `{org}` with your Space subdomain and `{projectKey}` with your project's key (found in Space under the project → Settings → General) - In the 'Parameters' section, add a parameter named `$top` with a value of `50` (limits results to 50 issues at a time, avoiding large payloads) - Set 'Use as' to 'Data' Click Initialize call. Bubble will make a live request to Space with your credentials. You need a real successful response for initialization to work — if your project has no issues, create a test issue in Space first. Once Bubble shows the response, it auto-detects fields like `id`, `title`, `status`, `assignee`, and `createdAt`. Click Save. For triggering a deployment (optional, for POST calls): - Add another call named 'Trigger Deployment' - Set method to POST - URL: `https://{org}.jetbrains.space/api/http/applications/{appId}/deployments/trigger` - Add a JSON body parameter for the deployment payload - Set 'Use as' to 'Action' Note: if the Initialize call returns 'There was an issue setting up your call', check that your Space token has the correct permission scope for that endpoint and that you're using the correct org subdomain.
1GET https://{org}.jetbrains.space/api/http/projects/id:{projectKey}/issues2Headers:3 Authorization: Bearer <private>4Query Params:5 $top: 506 $skip: 078Example response structure:9{10 "data": [11 {12 "id": "PROJ-1",13 "title": "Fix login page layout",14 "status": { "name": "Open" },15 "assignee": { "name": "Jane Doe" },16 "createdAt": "2026-06-01T10:00:00Z"17 }18 ],19 "next": "50"20}Pro tip: The Initialize call requires a real response from Space — make sure your project has at least one issue before clicking Initialize. After initialization, you can re-initialize any time the Space API response shape changes.
Expected result: Both calls are initialized successfully. Bubble shows detected fields (id, title, status, etc.) from the Space API response. The calls are ready to use in workflows and as data sources.
Build a Bubble page to display Space issues in a Repeating Group
Now connect the API data to a Bubble UI. Go to the Design tab and open (or create) the page where you want to display Space issues. From the UI Components panel, drag a Repeating Group onto the canvas. In the Repeating Group's property panel on the right, set: - Type of content: 'JetBrains Space Get Project Issues' (this is the Data Type Bubble created from your initialized call) - Data source: Click 'Get data from an external API', select 'JetBrains Space - Get Project Issues', and fill in your `projectKey` parameter Inside the Repeating Group's first cell (Bubble only lets you design the first cell — it repeats automatically), add text elements bound to the API fields: - Title text: Set 'Insert dynamic data' → Current cell's JetBrains Space Get Project Issues → title - Status text: Current cell's → status → name - Assignee text: Current cell's → assignee → name To avoid loading too many issues at once (Bubble's Repeating Group works best with under 100 items), use the `$top` parameter to limit results to 25-50. If you need pagination, add 'Previous' and 'Next' buttons that change the `$skip` value using a custom state. For the 'Trigger Deployment' call, add a Button element. Create a Workflow triggered by the button click. Add the action 'Plugins → JetBrains Space - Trigger Deployment' and fill in the required parameters. This gives non-technical team members a safe 'Deploy' button without any terminal access. If you are building Path 2 (calling your own Python backend instead), skip the Space-specific data binding and instead point a GET or POST call at your deployed FastAPI/Flask HTTPS endpoint. The API Connector setup is identical — just a different base URL and auth method matching your backend.
Pro tip: Set a page load condition to only run the Space API call when the user is logged in (if your Bubble app has authentication). This avoids unnecessary WU consumption from unauthenticated page visits.
Expected result: The Repeating Group displays live Space issues from your project. Clicking the Deploy button triggers a Space pipeline. The page is functional without any code or terminal commands.
Add Privacy Rules for any Bubble data created from Space API responses
If your Bubble app stores Space issue data in the database (for example, caching issues or saving user interactions like 'approved' status), you must configure Privacy Rules to prevent unauthorized data access. Go to the Data tab in your Bubble editor. Click Privacy in the left sidebar. For each data type that stores Space-derived data, click 'Define rules for {Type}'. By default in Bubble, data is accessible to anyone — this is a common security gap. Add a rule: 'When: Current User is logged in → Allow: Find this {Type}, View all fields'. Remove the 'Everyone else' rule if it grants too broad access. Also consider Workload Unit (WU) costs: every API Connector call in a Bubble Workflow costs approximately 1 WU. If your dashboard runs Space API calls on every page load for every user, multiply by your daily active user count. For a 1,000-user Bubble app polling Space on page load, that's 1,000 WU per day just for that one call. Mitigate this by caching Space data in a Bubble data type (updated every 15 minutes via a scheduled workflow) and loading from the Bubble database instead of calling Space directly on each page load. Note: scheduled backend workflows require a paid Bubble plan. RapidDev's team has configured hundreds of Bubble API integrations — if you're building a complex Space dashboard or Python backend integration and want expert guidance, book a free scoping call at rapidevelopers.com/contact.
Pro tip: If you're only displaying Space data and not saving it to Bubble's database, Privacy Rules are less critical — but add them anyway as a best practice for any user data your app creates (like approval records or comments).
Expected result: Privacy Rules are configured for any Bubble data types created from Space API data. WU cost is understood and mitigated with a caching strategy if needed.
Common use cases
Internal dev dashboard showing open Space issues and CI status
Display your JetBrains Space project issues and pipeline runs inside a Bubble internal tool. Non-technical team members can see what the dev team is working on, filter by assignee, and mark items reviewed — all without Space accounts.
Show me all open issues in my JetBrains Space project in a Bubble Repeating Group with status colors
Copy this prompt to try it in Bubble
Trigger a CI/CD deployment from a Bubble button
Give a product manager a Bubble page with a 'Deploy to Staging' button that fires a POST call to JetBrains Space, triggering a deployment pipeline — no terminal access required.
Add a workflow in Bubble so clicking 'Deploy' triggers a JetBrains Space pipeline for my appId
Copy this prompt to try it in Bubble
Bubble front-end calling a Python backend built in PyCharm
Use PyCharm to write a FastAPI or Flask service (data processing, ML inference, third-party API orchestration), deploy it to Railway or Render, then call it from Bubble's API Connector to power complex features that Bubble's built-in logic can't handle.
Call my deployed FastAPI endpoint from a Bubble workflow and display the JSON response in a text element
Copy this prompt to try it in Bubble
Troubleshooting
Initialize call returns 'There was an issue setting up your call' or a 401 error
Cause: The Bearer token is either incorrect, expired, or the Service Application lacks the permission scope for the endpoint you're calling.
Solution: Verify the token was copied completely (no trailing spaces). In JetBrains Space, go to Administration → Applications → your app → Authorization → check that the required permission (e.g., Project.Issues.View) is listed. If the token was generated before you added permissions, generate a new one — tokens reflect scopes at generation time.
API call returns a 404 with the message 'Resource not found'
Cause: The org subdomain is missing or incorrect in the base URL. Using jetbrains.space without the org-specific prefix always returns 404.
Solution: Confirm your Space organization URL by logging into Space and reading the subdomain in your browser. The base URL must be exactly: https://{yourOrg}.jetbrains.space/api/http — not jetbrains.space/api/http or space.jetbrains.com/api/http.
The API token appears in the browser's network tab (developer tools show the Authorization header)
Cause: The 'Private' checkbox was not checked on the Authorization header in the API Connector. Without this, Bubble exposes the header in client-side requests.
Solution: Go to Plugins → API Connector → JetBrains Space → find the Authorization shared header → check the 'Private' box → save. Re-test: refresh the page and inspect network requests — the Authorization header should no longer be visible.
Backend Workflow setup fails or the 'API Workflows' option is missing in Settings
Cause: Backend Workflows (used for receiving inbound webhooks from Space) are only available on paid Bubble plans. The Free plan does not expose API Workflow endpoints.
Solution: If you need to receive inbound webhook events from JetBrains Space (e.g., 'issue created' → trigger Bubble workflow), you must upgrade to a Bubble paid plan. The webhook endpoint URL format after upgrading is: https://yourappname.bubbleapps.io/api/1.1/wf/{workflowname}
The Repeating Group shows no data even though the Initialize call succeeded
Cause: The data source is configured with a hardcoded projectKey that doesn't match an actual Space project, or the project has no issues matching the query.
Solution: In the Repeating Group data source settings, open the API call parameters and confirm the projectKey matches exactly what Space shows in your project URL. Try testing the call in the API Connector 'Initialize' dialog first to see live data before connecting to a Repeating Group.
Best practices
- Always mark the Authorization header as Private in the API Connector — a non-Private token is visible in every user's browser network tab and is a security vulnerability.
- Use a JetBrains Space Service Application token (scoped permissions, no expiry) rather than a Personal Token — if the token leaks, you can revoke just the service app without affecting your personal account.
- Cache Space issue data in a Bubble data type updated on a schedule rather than calling the Space API on every page load — this dramatically reduces WU consumption for high-traffic Bubble apps.
- Limit API response sizes using the $top parameter (e.g., $top=50) to avoid loading hundreds of Space issues into a Repeating Group at once, which can slow Bubble page rendering.
- Configure Privacy Rules on any Bubble data types that store Space-derived data — Bubble data is accessible to everyone by default, which is a common security gap.
- For the Python backend path (Path 2), deploy your Flask or FastAPI service with HTTPS — Bubble's API Connector will not call HTTP endpoints, only HTTPS.
- Check Bubble's Logs tab → Workflow logs after each test run to see exactly what data was returned by the Space API and confirm WU consumption per call.
- If you need inbound webhook events from Space (issue created, PR merged), remember this requires a paid Bubble plan — plan your architecture accordingly before committing to the webhook approach.
Alternatives
GitLab is a self-contained DevOps platform with CI/CD, issue tracking, and a comprehensive REST API v4 — a strong alternative if your team already uses GitLab instead of JetBrains Space. GitLab's API uses a PRIVATE-TOKEN header rather than a Bearer token, but the Bubble API Connector setup is nearly identical.
Git itself is a version-control protocol without a REST API. If you want source control integration for Bubble (rather than DevOps pipeline visibility), the Git brief covers connecting Bubble to a git-based deployment workflow rather than to a hosted API like Space.
VS Code, like PyCharm, is a local IDE with no hosted REST API. If your team uses VS Code for Python development instead of PyCharm, the integration pattern is identical — connect Bubble to the hosted service your team uses for project management (GitHub, GitLab, or JetBrains Space), not to the IDE itself.
Frequently asked questions
Does PyCharm have a REST API I can call from Bubble?
No. PyCharm is a local desktop IDE — it runs on your developer's machine and has no hosted REST API. The hosted service that JetBrains ships alongside PyCharm is JetBrains Space (jetbrains.space), which has a full REST API that Bubble can call. If you see documentation for a 'PyCharm API,' it refers to PyCharm's internal plugin API for IDE extensions, not a web service.
Do I need a paid Bubble plan to connect to JetBrains Space?
No — outbound API Connector calls to the JetBrains Space REST API work on all Bubble plans including Free. A paid Bubble plan is only required if you want to receive inbound webhook events from Space (for example, triggering a Bubble workflow when a new issue is created in Space). Those inbound webhooks use Bubble's Backend Workflows feature, which is a paid-plan feature.
What is the difference between a Personal Token and a Service Application token in JetBrains Space?
A Personal Token is tied to your user account and grants the same access as you have personally. If your account is deactivated or you leave the organization, the token stops working and any Bubble workflows using it break. A Service Application token belongs to a dedicated application identity, has explicitly scoped permissions (only what you grant it), and persists independently of any user account. For production Bubble apps, always use a Service Application token.
Can I use PyCharm to build a Python API and have Bubble call it?
Yes — this is Path 2 covered in this tutorial. You write your Python service in PyCharm using Flask, FastAPI, or Django, then deploy it to a hosting provider that gives you an HTTPS URL (Railway, Render, and Heroku are popular choices). Once deployed, configure Bubble's API Connector with that HTTPS URL and any auth headers your service requires. Bubble calls it server-side, so no CORS issues arise.
How much does calling the JetBrains Space API cost in Bubble WU?
Each API Connector call executed inside a Bubble Workflow costs approximately 1 Workload Unit. If your page loads the Space issues list on every visit and you have 200 daily active users, that's roughly 200 WU per day from that single call. Cache Space data in a Bubble data type (refreshed every 15 minutes via a scheduled API Workflow) and serve most users from the cached data — this reduces WU consumption by 90%+ on high-traffic apps.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation