Endpoints
Locations
List wiki-visible locations with their parent ids or read one location with its public description.
Read locations whose hidden_from_wiki value is false in the campaign attached to your key. Every request goes through authentication and follows the same rate limits.
List locations
/api/public/v1/locationsYou get back a flat list of location metadata, sorted first by manual sort order and then by name. Build a hierarchy with parent_id. To read a description, fetch a single location.
| Parameter | Type | Description |
|---|---|---|
limit |
integer | Optional positive page size. Defaults to 50. Values above 100 are capped at 100. |
cursor |
string | Optional next_cursor from the previous page. Omit it for the first page. |
curl "https://app.saga20.com/api/public/v1/locations?limit=2" \
-H "Authorization: Bearer $SAGA20_API_KEY"
List response fields
Inside the response you will find data and pagination. See pagination for how to read another page.
| Field | Type | Description |
|---|---|---|
data |
array of objects | Records on this page, with the fields below. |
data[].id |
string | Entry id. Use it in a single-record request. |
data[].name |
string | Entry name. |
data[].icon |
string or null | Stored icon identifier or emoji, or null when unset. |
data[].hidden_from_wiki |
boolean | Always false for returned entries. |
data[].created_at |
string or null | Creation timestamp, or null. |
data[].updated_at |
string or null | Last update timestamp, or null. |
data[].type |
string | Stored location kind, such as settlement. The API returns it without changing the value. |
data[].parent_id |
string or null | Parent location id, or null for a root location. A hidden parent can be absent from list results. |
data[].image_url |
string or null | Public image URL, or null when no image is set. |
pagination |
object | Pagination values for this list. |
pagination.next_cursor |
string or null | Cursor for the next page, or null on the last page. |
pagination.has_more |
boolean | True when another page is available. |
{
"data": [
{
"id": "c81d4e0f-3a6b-49d2-b7f5-6e0a2c9d8b14",
"name": "Greywatch Keep",
"icon": "world-public:locations/city",
"hidden_from_wiki": false,
"created_at": "2026-09-02T18:05:00+00:00",
"updated_at": "2026-09-25T08:05:12+00:00",
"type": "settlement",
"parent_id": "2f6a9b13-e4d7-4c08-9a51-0b7d3e8c5f62",
"image_url": "https://example.com/greywatch-keep.webp"
}
],
"pagination": {
"next_cursor": null,
"has_more": false
}
}
Get one location
/api/public/v1/locations/{id}You get back one wiki-visible location along with its public description. Sections meant for the GM only are taken out. For how descriptions are formatted, see what the API returns.
| Parameter | Type | Description |
|---|---|---|
id |
string | Required path parameter. Use a location id from the list response. |
When a location is missing, hidden, or belongs to another campaign, you get 404 with {"error":"Entity not found"}.
curl "https://app.saga20.com/api/public/v1/locations/c81d4e0f-3a6b-49d2-b7f5-6e0a2c9d8b14" \
-H "Authorization: Bearer $SAGA20_API_KEY"
Location response fields
What you get back is the location object itself, with no data wrapper around it.
| Field | Type | Description |
|---|---|---|
id |
string | Entry id. Use it in a single-record request. |
name |
string | Entry name. |
icon |
string or null | Stored icon identifier or emoji, or null when unset. |
hidden_from_wiki |
boolean | Always false for returned entries. |
created_at |
string or null | Creation timestamp, or null. |
updated_at |
string or null | Last update timestamp, or null. |
type |
string | Stored location kind, such as settlement. The API returns it without changing the value. |
parent_id |
string or null | Parent location id, or null for a root location. A hidden parent can be absent from list results. |
image_url |
string or null | Public image URL, or null when no image is set. |
description_markdown |
string | Public description as normalized Markdown. Empty when no public description content is available. |
description_text |
string | Matching description without heading or bold markers or images. List and table markers can remain. |
{
"id": "c81d4e0f-3a6b-49d2-b7f5-6e0a2c9d8b14",
"name": "Greywatch Keep",
"icon": "world-public:locations/city",
"hidden_from_wiki": false,
"created_at": "2026-09-02T18:05:00+00:00",
"updated_at": "2026-09-25T08:05:12+00:00",
"type": "settlement",
"parent_id": "2f6a9b13-e4d7-4c08-9a51-0b7d3e8c5f62",
"image_url": "https://example.com/greywatch-keep.webp",
"description_markdown": "A fortress above the old road, held by the **Ashen Compact**.",
"description_text": "A fortress above the old road, held by the Ashen Compact."
}