π‘ We check api.spacexdata.com (and 75+ other public dev APIs) with a plain GET every 30 minutes β see the live status page.
The community SpaceX API is the "fetch something cool" dataset of a whole era of tutorials: React launch trackers, Apollo Client's own GraphQL docs, YouTube build-alongs, take-home exercises. Three different endpoints carried that traffic, and right now all three fail:
api.spacexdata.com (the r/SpaceX REST API, v3/v4/v5) β answers HTTP 525 (an SSL handshake failure between Cloudflare and the origin) on every route. /v4/launches/latest, /v5/launches, /v4/rockets: all 525. Even before this outage, the project announced in late 2022 that it was no longer maintained β the data had stopped updating.api.spacex.land/graphql β the endpoint in years of Apollo/GraphQL tutorials β answers HTTP 520 and has been dead for years. Every launchesPast query in every pre-2022 Apollo tutorial fails at step one.spacex-production.up.railway.app β the GraphQL endpoint Apollo's newer docs moved to β answers HTTP 200 but every query returns an errors array, because under the hood it proxiesβ¦ api.spacexdata.com, which is down. "invalid json response bodyβ¦ Unexpected token '<'".If your tutorial just died on line one, here's a free launches API with the same bones β launches and rockets, filterable and sortable, served over both REST and GraphQL β plus things the original never had: writes that persist, failure-mode rehearsal, and data you can edit. No signup.
curl -s https://mockbird.mockbird.workers.dev/data/spacex.db.json \
| curl -s -X POST 'https://mockbird.mockbird.workers.dev/api/projects/import?name=launches' \
-H 'content-type: application/json' --data-binary @-
# β {"id":"YOUR_ID","adminKey":"β¦"} β save both
The dataset is 16 milestone launches (FalconSat through Starship IFT-1 β real missions, our own descriptions) and 4 rockets, in a v4-familiar shape: flight_number, name, date_utc, success, details, plus a rocketId foreign key and a patch image URL that actually renders (served by our placeholder-image API, so your launch cards get pictures).
| SpaceX API (v4) | Your Mockbird project |
|---|---|
/v4/launches | /launches |
/v4/launches/latest | /launches?sortBy=date_utc&order=desc&limit=1 |
/v4/launches/{id} | /launches/12 |
POST /v4/launches/query with {"query":{"success":false}} | /launches?success=false β a plain GET |
/v4/rockets | /rockets |
populate: "rocket" | /launches/12?_expand=rocket β the rocket object is joined inline |
| (no equivalent) | /rockets/2/launches β every Falcon 9 launch, nested-route style |
| (no equivalent) | /launches?q=starlink β full-text search |
BASE=https://mockbird.mockbird.workers.dev/m/YOUR_ID
curl "$BASE/launches?sortBy=date_utc&order=desc&limit=1" # the "latest launch" card
curl "$BASE/launches?success=false" # the three failures
curl "$BASE/launches/12?_expand=rocket" # Demo-2, rocket joined
Every project gets a GraphQL endpoint at /m/YOUR_ID/graphql β with GraphiQL when you open it in a browser. The launchesPast query from the Apollo tutorials translates directly:
query {
launches(limit: 5, sortBy: "date_utc", order: "desc") {
id
name
date_utc
success
rocket { name } # the rocketId relation, resolved
}
launchesCount
}
curl -s -X POST https://mockbird.mockbird.workers.dev/m/YOUR_ID/graphql \
-H 'content-type: application/json' \
-d '{"query":"{ launches(limit:3, sortBy:\"date_utc\", order:\"desc\"){ name success rocket { name } } }"}'
Filters use a typed where input β launches(where:{success:false}) returns exactly the three failures. One honest quirk: the single-record field is named by stripping the plural s, so it's launche(id: 9) β yes, really. Mutations (createLaunches, etc.) write the same records REST sees.
curl -s -X POST https://mockbird.mockbird.workers.dev/m/YOUR_ID/launches \
-H 'content-type: application/json' \
-d '{"flight_number":201,"name":"My Mission","date_utc":"2026-10-01T12:00:00Z",
"success":true,"rocketId":2,"details":"Launched from my tutorial."}'
# β 201 {"id":17,β¦} β and GET /launches/17 returns it. It persists.
The original API was read-only even when it worked. With writes, the launch-tracker tutorial grows into a full-CRUD portfolio piece: an admin page, an edit form, a delete button.
You found this page because an API your code depended on went down. Point your error handling at it on purpose:
# fail, fail, recover β retry/backoff drill
curl "https://mockbird.mockbird.workers.dev/m/YOUR_ID/launches?mock_seq=525,525,200"
# slow network for your loading skeletons
curl "https://mockbird.mockbird.workers.dev/m/YOUR_ID/launches?mock_delay=2000"
More recipes in testing loading & error states.
A mock is the wrong tool if your goal is showing users real upcoming launches. The actively maintained option is Launch Library 2 (ll.thespacedevs.com) β keyless, covers all agencies (not just SpaceX), and answered live during our checks. Mind its free-tier rate limit (about 15 requests/hour), which is exactly why you develop against a mock and swap the base URL for production.
The honest split: real data for real users β Launch Library 2. A stable fixture you control β offline dev, deterministic tests, CRUD, failure drills β Mockbird. They compose.
The one-paste block in section 1, or zero setup at all:
curl https://mockbird.mockbird.workers.dev/m/demo/products?limit=3
Facts checked live on September 17, 2026: api.spacexdata.com answered HTTP 525 on /v4/launches/latest, /v5/launches/latest, and /v4/rockets; api.spacex.land/graphql answered HTTP 520; spacex-production.up.railway.app answered 200 with an errors array quoting an invalid-JSON response from api.spacexdata.com. The r/SpaceX API repository announced the project was no longer maintained in November 2022. Launch Library 2 answered a keyless request during the same check. Every Mockbird command on this page was run against a live project before publishing.
Full API reference in the docs. More guides: Free GraphQL mock API Β· Mock API for React Β· SWAPI alternative Β· GitHub Jobs alternative Β· JSONPlaceholder alternative. Create your API β