Video — entry 021 of 37

STAPI

Verified Jul 2026

STAPI is a deep, independently maintained REST API covering Star Trek canon across every series and film — tens of thousands of records in aggregate across dozens of resource types (7,571 characters, 6,822 performers, 1,443 spacecraft, 860 episodes and 759 species when measured live), each with dozens of structured fields (birth dates, ranks, serial numbers, alternate-reality flags). Queries go through POST search endpoints under /api/v1/rest rather than simple GETs, and no key is required.

STAPI is a deep, independently maintained REST API covering Star Trek canon across every series and film. Its coverage runs to tens of thousands of records in aggregate, spread over dozens of resource types rather than concentrated in any one: an unfiltered live search this run counted 7,571 characters, 6,822 performers, 1,443 spacecraft, 860 episodes, and 759 species. Note the resource is named `spacecraft`, not `starship` -- a POST to `/starship/search` returns an HTTP 404 HTML page reading "No service was found." rather than a JSON error. Its documented interface is POST search endpoints under /api/v1/rest with a form-encoded body (e.g. `name=Jean-Luc`), and no key is required for any of it.

fandomstar-trekcharacters
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score88out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs14/20Documentation URL provided
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 88 on greatapis.com
<a href="https://greatapis.com/api/stapi/"><img src="https://greatapis.com/badge/stapi.svg" alt="Scored 88 on greatapis.com"></a>

Auth quickstart

  1. No API key required. A live `POST /character/search` with a form body and no credentials returned real character data this run; the same path also answered a plain `GET` with no body at all (see gotcha below), so nothing about the search endpoints is gated behind auth.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Search characters by name

POSThttps://stapi.co/api/v1/rest/character/search

name=Jean-Luc

200 application/json;charset=UTF-8

{"page":{"pageNumber":0,"pageSize":50,"numberOfElements":3,"totalElements":3,"totalPages":1,"firstPage":true,"lastPage":true},"sort":{"clauses":[]},"characters":[{"uid":"CHMA0000289509","name":"Jean-Luc Picard","gender":"M","yearOfBirth":2305,"monthOfBirth":7,"dayOfBirth":13,"placeOfBirth":"La Barre, France, Earth","yearOfDeath":null,"monthOfDeath":null,"dayOfDeath":null,"placeOfDeath":null,"height":null,"weight":null,"deceased":null,"bloodType":null,"maritalStatus":null,"serialNumber":"SP-937-215","hologramActivationDate":null,"hologramStatus":null,"hologramDateStatus":null,"hologram":false,"fictionalCharacter":false,"mirror":false,"alternateReality":false},{"uid":"CHMA0000112984","name":"Jean-Luc Picard","gender":null,"yearOfBirth":null,"monthOfBirth":null,"dayOfBirth":null,"placeOfBirth":null,"yearOfDeath":null,"monthOfDeath":null,"dayOfDeath":null,"placeOfDeath":null,"height":null,"weight":null,"deceased":null,"bloodType":null,"maritalStatus":null,"serialNumber":null,"hologramActivationDate":null,"hologramStatus":null,"hologramDateStatus":null,"hologram":false,"fictionalCharacter":false,"mirror":false,"alternateReality":false},{"uid":"CHMA0000019041","name":"Jean-Luc Riker","gender":null,"yearOfBirth":null,"monthOfBirth":null,"dayOfBirth":null,"placeOfBirth":null,"yearOfDeath":null,"monthOfDeath":null,"dayOfDeath":null,"placeOfDeath":null,"height":null,"weight":null,"deceased":null,"bloodType":null,"maritalStatus":null,"serialNumber":null,"hologramActivationDate":null,"hologramStatus":null,"hologramDateStatus":null,"hologram":true,"fictionalCharacter":false,"mirror":false,"alternateReality":false}]}

Try it

Developer reference

Base URLhttps://stapi.co/api/v1/rest
Key endpoints
  • POST/character/search
  • POST/episode/search

Gotchas & limits

  • The `/character/search` endpoint isn't POST-only despite the docs only showing POST: a live plain `GET` to the same URL with no body at all returned HTTP 200 with a full unfiltered page of results (`"totalElements":7571`) -- identical to what a `POST` with an empty body returns. A live `OPTIONS` preflight, though, advertises only `access-control-allow-methods: POST` -- so a browser sending a real GET works (GET is a CORS "simple request" and skips the preflight check entirely), but code that reads the preflight response to decide which methods are allowed would wrongly conclude GET is unsupported.
  • A search with no matches is HTTP 200 with an empty `characters` array and a `page` object reporting `"totalElements":0` -- there is no 404 for an unmatched name, confirmed live against a deliberately nonsensical name this run.
  • Sending no `name` field at all (or an empty one) is not an error and is not the same as "no matches": it returns the same unfiltered full-catalogue page described above (`totalElements:7571`, `totalPages:152`), so a caller that forgets to set the field silently gets the whole database's first page back instead of a 400.
  • CORS is Origin-conditional: a request with no `Origin` header gets no `access-control-allow-origin` header in the response at all, while the identical request with `Origin: https://example.com` gets back `access-control-allow-origin: *` and `access-control-allow-credentials: false`, confirmed on both the character-search and preflight probes this run.
  • Plain `http://stapi.co` is not redirected or blocked: a live `POST http://stapi.co/api/v1/rest/character/search` returned the same HTTP 200 JSON as the https:// version -- https:// is the documented scheme, but http:// currently still answers too.