Developers / public catalog
EQL Helper public API
The /api/v1 catalog API is versioned, read-only, and anonymous by default. JSON is the default representation; NDJSON and XML are available where noted. Optional account keys increase capacity and provide per-key usage guidance, but never grant write access.
Quick start
curl -H 'Accept: application/json' \
-H 'User-Agent: My-EQL-Tool/1.0 (+https://example.test)' \
'https://eql.gamertan.com/api/v1/items?q=brell&limit=10'Use the exact slug returned by a collection or search response:
curl 'https://eql.gamertan.com/api/v1/items/Block_of_Brellium'Endpoint map
| Purpose | Request | Use |
|---|---|---|
| Metadata | GET /api/v1/catalog | Revision, schema, hash, formats, and counts. |
| Collections | GET /api/v1/{collection} | Bounded search, filtering, sorting, and cursor paging. |
| Record | GET /api/v1/{collection}/{slug} | One canonical record using an exact returned slug. |
| Changes | GET /api/v1/changes?since=REVISION | Incremental synchronization after a known revision. |
| Cross-catalog search | GET /api/v1/search?q=TEXT | Compact discovery across record kinds. |
| Registries | GET /api/v1/profilesGET /api/v1/sourcesGET /api/v1/partners | Compatibility, provenance, and approved external references. |
| Travel | GET /api/v1/travel/* | Neighborhood discovery, goals, and journey planning. |
Collections: items, spells, actions, stances, quests, recipes, tradeskills, npcs, merchants, factions, and zones.
Paging, synchronization, and caching
- Collection pages default to 50 records and allow at most 200. Treat
cursoras opaque and follownext_cursoror theLinkheader. - Cursors are bound to a catalog revision. A
409means the catalog changed; restart the traversal from its first page. - Save
ETagand sendIf-None-Match. A304has no response body and should reuse the cached representation. - After an initial import, request
/api/v1/changes?since=REVISIONinstead of repeatedly scanning every collection. - Compression is negotiated with
Accept-Encodingby the public reverse proxy.
curl -i -H 'If-None-Match: "YOUR_ETAG"' \
'https://eql.gamertan.com/api/v1/items?limit=200'
curl 'https://eql.gamertan.com/api/v1/changes?since=42&limit=200'Representations
Use Accept: application/json, application/x-ndjson, or application/xml. A format=json|jsonl|xml convenience parameter is available when a client cannot set headers. NDJSON pagination metadata is sent in response headers and Link relations rather than as a synthetic first row.
curl -H 'Accept: application/x-ndjson' \
'https://eql.gamertan.com/api/v1/spells?limit=200'
curl -H 'Accept: application/xml' \
'https://eql.gamertan.com/api/v1/zones/Chardok'Evidence and compatibility
The default profile is eql-main, with evidence=include-unverified. That preserves useful legacy records without falsely claiming every field is confirmed for EQL. Use evidence=confirmed for stricter results, and inspect record provenance, evidence state, compatibility, and approved external references when correctness matters.
Errors and recovery
| Status | Meaning | Client action |
|---|---|---|
| 400 | Invalid or excessive bounded input. | Correct the request; do not retry unchanged. |
| 401 | A supplied API key was invalid or disabled. | Replace or remove it. Invalid credentials never silently downgrade to anonymous. |
| 404 | Route or exact canonical record was not found. | Discover the record and use its returned slug. |
| 409 | A cursor belongs to an older catalog revision. | Restart that traversal. |
| 429 | Temporary capacity limit. | Pause for Retry-After, then retry with bounded backoff. |
| 5xx | Transient service failure. | Retry conservatively; report persistent failures with request ID. |
API errors are compact problem documents. Conventional OpenAPI discovery routes are valid documentation requests and do not accrue abuse strikes.
Capacity and identification
Anonymous clients receive 120 requests per minute with a burst of 60 and up to four concurrent requests. Read keys receive 600 per minute with a burst of 200 and up to eight concurrent requests. Send a stable, descriptive User-Agent such as ProjectName/Version (+project-or-contact-URL); it helps us distinguish integrations and offer useful guidance if a client struggles.
Create an account or manage a key from API keys and usage. Send keys only as Authorization: Bearer …, never in URLs. Query strings are part of operational request logs, so credentials and private data do not belong there.