Build a job board on Bubble.io without writing code using CleanJobData's REST API.
Install the API Connector plugin from the Bubble marketplace.
Add CleanJobData as a new API in the connector.
API Name: CleanJobData
Base URL: https://api.cleanjobdata.com
Endpoints: GET /jobs → List jobsCreate Bubble pages with repeating groups for job listings.
Real-world patterns beyond the basic setup.
The exact call setup for the list endpoint, with dynamic search parameters bound to page elements — copy these settings into a new call on the CleanJobData API in the connector.
Call name: Search Jobs
Method: GET
URL: https://api.cleanjobdata.com/jobs
Headers:
X-API-Key your-key
Params (mark each as "editable" so workflows can pass a value):
title Search_Input's value
location Location_Input's value
remote Remote_Checkbox's checked
cursor (leave blank on first call; bind to a custom state on later pages)
limit 20
Response body type: JSON — click "Initialize call" against a live request
so Bubble auto-detects the "data" array and "pagination" object as
usable data types for your repeating group.Yes — bind your search inputs to CleanJobData query params in the API Connector call: a keyword input to `title`, a location input to `location` or `city_id`, a remote toggle to `remote=true`. Bubble's API Connector supports dynamic parameters, so each field's value flows straight into the request with no backend workflow required.
Yes. CleanJobData's list endpoint returns a `next_page` cursor token in the response's `pagination` object rather than page numbers — store that token in a Bubble custom state and pass it back as the `cursor` param on the next API Connector call to move forward. When `next_page` comes back null, you've reached the end of the result set.
Bubble's API Connector calls run from your app's server by default for GET requests configured as "Data" type calls — the key isn't exposed in the browser's network tab the way a raw client-side fetch would be. Double-check the call's privacy setting is not marked as exposable, and never bind the key itself to a page input or URL parameter.
Yes — pass the job's `id` (or the full data thing, if you're using Bubble's "Data" API Connector type) via the page's URL parameter when linking from the repeating group, then either reuse the already-fetched data or make a scoped detail call filtered to that one `id` on the destination page. Fetching one job by ID is cheaper than re-running the full search call just to show one detail view.