# XIVAPI

> Look up Final Fantasy XIV game data through XIVAPI, the free community API that reads the game's own files: every item, action, quest, mount, recipe and map, 7,900 sheets in all, in English, Japanese, German and French, from patch 7.0 to the latest. Get an item by name or ID with its icon, levels, rarity and prices; search any sheet by name or with XIVAPI's query language; read a row or page through a sheet, field by field; list the sheets and game versions; and link to or download an icon, texture or zone map as a PNG, JPEG or WebP. Pin a game version and schema so a workflow keeps giving the same answers across patches. No API key needed.

App · Gaming · 8 actions. Web page: https://docs.lodol.com/docs/integrations/xivapi

## Actions

### Get a map

Get the map of a zone or city as an image, by the place's name, such as New Gridania, by the map's id, such as f1t1/00, or from a row of the Map sheet: a public link to it, where it is, and the file itself saved as a Lodol document when asked for. A place with several maps gives its main one.

**Inputs**

- Map (`map`, text, required): The map: a place's name, such as New Gridania or Limsa Lominsa Upper Decks, in English; a map id, such as f1t1/00; a Map sheet row's ID; or a Map row given whole.
- Format (`format`, text): The image format of the map: JPEG, PNG or WebP. Defaults to JPEG, the smallest. One of: `png`, `jpg` (JPEG), `webp`. Default: `jpg`.
- Game version (`version`, text): Optional. The game version to read, such as 7.0 or 7.2x1, as List game versions lists them. Leave empty for the latest. Pin it so a workflow keeps giving the same answers across patches.
- Save as file (`save_as_file`, true/false): Whether to download the image and save it as a Lodol document, to attach or send in a later step. Off by default: the step then only gives the image's address. Default: `false`.

**Outputs**

- `content_type` (text): The image's media type, e.g. 'image/jpeg'.
- `document_ref` (text): The saved file's document reference; empty when none was saved.
- `documents` (list): The saved file, as a list a later step can attach or send; empty when none was saved.
- `file_size_bytes` (number): The saved file's size in bytes; 0 when none was saved.
- `file_url` (text): Where Lodol serves the saved file from; empty when none was saved.
- `format` (text): The image's format: 'jpg', 'png' or 'webp'.
- `index` (text): The map's index within its territory, e.g. '00'.
- `map_id` (text): The map's id, its territory and index, e.g. 'f1t1/00'.
- `place_name` (text): The place the map is of, e.g. 'New Gridania'; null when unnamed.
- `region` (text): The region the place is in, e.g. 'The Black Shroud'; null when unnamed.
- `saved_as_file` (true/false): Whether the image was downloaded and saved as a Lodol document.
- `size_factor` (number): The map's scale, e.g. 200 for a city and 100 for a zone, as the game uses it to place coordinates.
- `sub_name` (text): The part of the place the map is of, e.g. 'Airship Landing'; null for the place's main map.
- `territory` (text): The map's territory, e.g. 'f1t1'.
- `url` (text): A link to the map, e.g. 'https://v2.xivapi.com/api/asset/map/f1t1/00?format=jpg'. Public: it works anywhere.
- `version` (text): The game version pinned, e.g. '7.0', or null for the latest.

**Example output**

```json
{
  "content_type": "image/jpeg",
  "document_ref": "",
  "documents": [],
  "file_size_bytes": 0,
  "file_url": "",
  "format": "jpg",
  "index": "00",
  "map_id": "f1t1/00",
  "place_name": "New Gridania",
  "region": "The Black Shroud",
  "saved_as_file": false,
  "size_factor": 200,
  "sub_name": null,
  "territory": "f1t1",
  "url": "https://v2.xivapi.com/api/asset/map/f1t1/00?format=jpg",
  "version": null
}
```

### Get a row

Read one row of any sheet by its ID, or one subrow as row:subrow, with the fields asked for, or every field when none are, which shows what a sheet holds. Fields of related rows, arrays, other languages and the companion transient sheet can be read too. Pin the game version and schema to keep the answer the same across patches.

**Inputs**

- Sheet (`sheet`, text, required): The sheet, the game's name for a table of data, such as Item, Action, Quest, Recipe, Mount or Map. Case does not matter. List sheets lists every one.
- Row (`row`, text, required): The row's ID, such as 4551, or row:subrow for a sheet with subrows, such as 262144:1. A search result can be given whole.
- Fields (`fields`, text): Optional. The fields to read, separated by commas, such as Name,Description,Icon. A related row's field is read with a dot, such as ItemUICategory.Name; a field in every entry of an array with [], such as BaseParam[].Name; a field in another language with @lang, such as Name@lang(ja); a relation as its number alone with @as(raw). Leave empty for every field, which can be a lot.
- Transient fields (`transient`, text): Optional. Fields to read from the sheet's companion transient sheet, where the game keeps text it rarely needs, such as Description for an Action. Written like Fields.
- Language (`language`, text): The language of names, descriptions and other text: English, Japanese, German or French. Defaults to English. A search looks for the name in this language. One of: `en` (English), `ja` (Japanese), `de` (German), `fr` (French). Default: `en`.
- Game version (`version`, text): Optional. The game version to read, such as 7.0 or 7.2x1, as List game versions lists them. Leave empty for the latest. Pin it so a workflow keeps giving the same answers across patches.
- Schema (`schema`, text): Optional. The schema to read the sheet with, as an earlier step's schema field gives it, such as exdschema@2:rev:<commit>. Leave empty for the latest. Pin it when a workflow depends on exact field names.

**Outputs**

- `fields` (object): The fields read, by name, e.g. {'Name': 'Potion'}. A related row is {'value', 'sheet', 'row_id', 'fields'}; an icon is {'id', 'path', 'path_hr1'}; a field read with a decorator keeps it in its name, e.g. 'Name@lang(ja)'.
- `row_id` (number): The row's ID in its sheet, e.g. 4551.
- `schema` (text): The schema the sheet was read with, e.g. 'exdschema@2:rev:e773c41...'. Give it as Schema to pin a later step to it.
- `sheet` (text): The sheet read, as the API spells it, e.g. 'Item'.
- `subrow_id` (number): The subrow's ID, for the few sheets whose rows have subrows, e.g. 1; null otherwise.
- `transient` (object): The transient fields read from the sheet's companion sheet, such as ActionTransient for Action, or null when none were asked for.
- `version` (text): The key of the game version read, e.g. '541c0c12e07da325'. Give it as Game version to pin a later step to it.

**Example output**

```json
{
  "fields": {
    "Icon": {
      "id": 104,
      "path": "ui/icon/000000/000104.tex",
      "path_hr1": "ui/icon/000000/000104_hr1.tex"
    },
    "Name": "Sprint"
  },
  "row_id": 3,
  "schema": "exdschema@2:rev:e773c41a90aed788cf4c1c48469fa85618ef01fb",
  "sheet": "Action",
  "subrow_id": null,
  "transient": {
    "Description": "Increases movement speed.\nDuration: 10s (20s when not in combat)\nAdditional Effect: Grants Jog when the effect expires\nJog Effect: Movement speed is increased\nEffect ends when enmity is generated. Has no effect in battle.\n\u203bUnavailable in PvP."
  },
  "version": "541c0c12e07da325"
}
```

### Get an asset

Get a game file, an item or action icon or any other texture, as a PNG, JPEG or WebP image: a public link to it, and the file itself saved as a Lodol document when asked for, to attach or send in a later step. Take the path from a row's Icon field, or give an icon's number.

**Inputs**

- Path (`path`, text, required): The game file's path, such as ui/icon/020000/020601.tex, an icon's number, such as 20601, or a row's Icon field given whole.
- Format (`format`, text): The image format to convert the file to: PNG, JPEG or WebP. Defaults to PNG. One of: `png`, `jpg` (JPEG), `webp`. Default: `png`.
- High resolution (`high_resolution`, true/false): Whether to take an icon's 80 by 80 version rather than its 40 by 40 one. On by default. Only icons have one. Default: `true`.
- Game version (`version`, text): Optional. The game version to read, such as 7.0 or 7.2x1, as List game versions lists them. Leave empty for the latest. Pin it so a workflow keeps giving the same answers across patches.
- Save as file (`save_as_file`, true/false): Whether to download the image and save it as a Lodol document, to attach or send in a later step. Off by default: the step then only gives the image's address. Default: `false`.

**Outputs**

- `content_type` (text): The image's media type, e.g. 'image/png'.
- `document_ref` (text): The saved file's document reference; empty when none was saved.
- `documents` (list): The saved file, as a list a later step can attach or send; empty when none was saved.
- `file_size_bytes` (number): The saved file's size in bytes; 0 when none was saved.
- `file_url` (text): Where Lodol serves the saved file from; empty when none was saved.
- `format` (text): The image's format: 'png', 'jpg' or 'webp'.
- `path` (text): The game file's path, e.g. 'ui/icon/020000/020601_hr1.tex'.
- `saved_as_file` (true/false): Whether the image was downloaded and saved as a Lodol document.
- `url` (text): A link to the image, e.g. 'https://v2.xivapi.com/api/asset?path=ui/icon/020000/020601_hr1.tex&format=png'. Public: it works anywhere.
- `version` (text): The game version pinned, e.g. '7.0', or null for the latest.

**Example output**

```json
{
  "content_type": "image/webp",
  "document_ref": "",
  "documents": [],
  "file_size_bytes": 0,
  "file_url": "",
  "format": "webp",
  "path": "ui/icon/020000/020601_hr1.tex",
  "saved_as_file": false,
  "url": "https://v2.xivapi.com/api/asset?path=ui/icon/020000/020601_hr1.tex&format=webp&version=7.0",
  "version": "7.0"
}
```

### Get an item

Get one item by its name or ID, with what its item window shows: description, icon, item and equip level, rarity, category, the jobs that can equip it, stack size, vendor prices, damage and defence, materia slots, and whether it is unique, untradable or can be high quality, in English, Japanese, German or French. A name is matched exactly first, then in any case, then as part of a name only one item has; a name nobody has fails.

**Inputs**

- Item (`item`, text, required): The item: its name, such as Potion or Ironworks Tool Set, in the chosen language, or its ID, such as 4551. A search result from the Item sheet can be given whole.
- Language (`language`, text): The language of names, descriptions and other text: English, Japanese, German or French. Defaults to English. A search looks for the name in this language. One of: `en` (English), `ja` (Japanese), `de` (German), `fr` (French). Default: `en`.
- Game version (`version`, text): Optional. The game version to read, such as 7.0 or 7.2x1, as List game versions lists them. Leave empty for the latest. Pin it so a workflow keeps giving the same answers across patches.

**Outputs**

- `item` (object): The item, with what its item window shows.
- `schema` (text): The schema the sheet was read with, e.g. 'exdschema@2:rev:e773c41...'. Give it as Schema to pin a later step to it.
- `version` (text): The key of the game version read, e.g. '541c0c12e07da325'. Give it as Game version to pin a later step to it.

**Example output**

```json
{
  "item": {
    "can_be_hq": true,
    "category": "Medicine",
    "class_jobs": null,
    "collectable": false,
    "description": "This weak concoction instantly restores a small amount of HP.",
    "equip_level": 1,
    "equippable": false,
    "glamorous": false,
    "icon_id": 20601,
    "icon_path": "ui/icon/020000/020601_hr1.tex",
    "icon_url": "https://v2.xivapi.com/api/asset?path=ui/icon/020000/020601_hr1.tex&format=png",
    "id": 4551,
    "indisposable": false,
    "item_level": 10,
    "language": "en",
    "magical_damage": 0,
    "magical_defense": 0,
    "materia_slots": 0,
    "name": "Potion",
    "physical_damage": 0,
    "physical_defense": 0,
    "plural": "potions",
    "rarity": 1,
    "rarity_name": "common",
    "search_category": "Medicine",
    "sell_price": 1,
    "singular": "potion",
    "stack_size": 999,
    "unique": false,
    "untradable": false,
    "vendor_price": 28
  },
  "schema": "exdschema@2:rev:e773c41a90aed788cf4c1c48469fa85618ef01fb",
  "version": "541c0c12e07da325"
}
```

### List game versions

List every game version XIVAPI holds, from patch 7.0 to the latest, oldest first, each with its key and names, and which is the latest. Any of them can be given as Game version to read the game as it was then.

**Inputs**: None.

**Outputs**

- `count` (number): How many versions there are.
- `latest` (object): The latest version, the one read by default.
- `versions` (list): Every version, oldest first.

**Example output**

```json
{
  "count": 45,
  "latest": {
    "key": "541c0c12e07da325",
    "name": "7.56x1"
  },
  "versions": [
    {
      "key": "f815390159effefd",
      "latest": false,
      "name": "7.0",
      "names": [
        "7.0"
      ]
    },
    {
      "key": "2139246928a48a9a",
      "latest": false,
      "name": "7.0x1",
      "names": [
        "7.0x1"
      ]
    },
    {
      "key": "9655898c640ad1ef",
      "latest": false,
      "name": "7.01",
      "names": [
        "7.01"
      ]
    },
    {
      "key": "9f49c502be94f1cb",
      "latest": false,
      "name": "7.05",
      "names": [
        "7.05"
      ]
    },
    {
      "key": "cb4adbbad896fd36",
      "latest": false,
      "name": "7.05x1",
      "names": [
        "7.05x1"
      ]
    },
    {
      "key": "aa91b22d53e320e2",
      "latest": false,
      "name": "7.05x2",
      "names": [
        "7.05x2"
      ]
    },
    {
      "key": "c5588cafa6193f5d",
      "latest": false,
      "name": "7.1",
      "names": [
        "7.1"
      ]
    },
    {
      "key": "0dcbb177b45846dd",
      "latest": false,
      "name": "7.11",
      "names": [
        "7.11"
      ]
    },
    {
      "key": "9304a94a499b09bd",
      "latest": false,
      "name": "7.15",
      "names": [
        "7.15"
      ]
    },
    {
      "key": "c407ffcb5501cb05",
      "latest": false,
      "name": "7.16",
      "names": [
        "7.16"
      ]
    },
    {
      "key": "b1cdf0cf781ca18f",
      "latest": false,
      "name": "7.16x1",
      "names": [
        "7.16x1"
      ]
    },
    {
      "key": "d165865617b32007",
      "latest": false,
      "name": "7.18",
      "names": [
        "7.18"
      ]
    },
    {
      "key": "ef196edd35f93b37",
      "latest": false,
      "name": "7.18x1",
      "names": [
        "7.18x1"
      ]
    },
    {
      "key": "74f6e4449ea4d505",
      "latest": false,
      "name": "7.2",
      "names": [
        "7.2"
      ]
    },
    {
      "key": "84fa1c82e217628b",
      "latest": false,
      "name": "7.2x1",
      "names": [
        "7.2x1"
      ]
    },
    {
      "key": "b790445c5b50ac36",
      "latest": false,
      "name": "7.21",
      "names": [
        "7.21"
      ]
    },
    {
      "key": "b5ca0769a630a7c4",
      "latest": false,
      "name": "7.25",
      "names": [
        "7.25"
      ]
    },
    {
      "key": "11efa3262e72927a",
      "latest": false,
      "name": "7.25x1",
      "names": [
        "7.25x1"
      ]
    },
    {
      "key": "e7c29057fb5d5300",
      "latest": false,
      "name": "7.25x2",
      "names": [
        "7.25x2"
      ]
    },
    {
      "key": "3b97153049d1232d",
      "latest": false,
      "name": "7.25x3",
      "names": [
        "7.25x3"
      ]
    },
    {
      "key": "994cabd497f33d52",
      "latest": false,
      "name": "7.3",
      "names": [
        "7.3"
      ]
    },
    {
      "key": "f9b9d5bb37918ad6",
      "latest": false,
      "name": "7.3x1",
      "names": [
        "7.3x1"
      ]
    },
    {
      "key": "c5c0a504f9fb8434",
      "latest": false,
      "name": "7.31",
      "names": [
        "7.31"
      ]
    },
    {
      "key": "a7c064d464246124",
      "latest": false,
      "name": "7.31x1",
      "names": [
        "7.31x1"
      ]
    },
    {
      "key": "bcb98a8d444ca9ca",
      "latest": false,
      "name": "7.35",
      "names": [
        "7.35"
      ]
    },
    {
      "key": "d151ba652709a159",
      "latest": false,
      "name": "7.35x1",
      "names": [
        "7.35x1"
      ]
    },
    {
      "key": "3309dd1cf84f989d",
      "latest": false,
      "name": "7.38",
      "names": [
        "7.38"
      ]
    },
    {
      "key": "b0cc20faae7dd1a6",
      "latest": false,
      "name": "7.4",
      "names": [
        "7.4"
      ]
    },
    {
      "key": "b8c6217fd8cf5074",
      "latest": false,
      "name": "7.4x1",
      "names": [
        "7.4x1"
      ]
    },
    {
      "key": "309a1e90d28b6bc6",
      "latest": false,
      "name": "7.4x2",
      "names": [
        "7.4x2"
      ]
    },
    {
      "key": "59d76de80e613d05",
      "latest": false,
      "name": "7.41",
      "names": [
        "7.41"
      ]
    },
    {
      "key": "98ec9341db247bc3",
      "latest": false,
      "name": "7.41x1",
      "names": [
        "7.41x1"
      ]
    },
    {
      "key": "d88a1cf841bc2ac8",
      "latest": false,
      "name": "7.45",
      "names": [
        "7.45"
      ]
    },
    {
      "key": "b15bb2cbb4ab3f96",
      "latest": false,
      "name": "7.45x1",
      "names": [
        "7.45x1"
      ]
    },
    {
      "key": "1710226608647fbb",
      "latest": false,
      "name": "7.45x2",
      "names": [
        "7.45x2"
      ]
    },
    {
      "key": "b270c087356fb0ac",
      "latest": false,
      "name": "7.5",
      "names": [
        "7.5"
      ]
    },
    {
      "key": "6621d5bc88409554",
      "latest": false,
      "name": "7.5x1",
      "names": [
        "7.5x1"
      ]
    },
    {
      "key": "9183b12d5dfc05bf",
      "latest": false,
      "name": "7.51",
      "names": [
        "7.51"
      ]
    },
    {
      "key": "9ed444e23f6a7217",
      "latest": false,
      "name": "7.51x1",
      "names": [
        "7.51x1"
      ]
    },
    {
      "key": "f8764efd76cdb31a",
      "latest": false,
      "name": "7.51x2",
      "names": [
        "7.51x2"
      ]
    },
    {
      "key": "7583112015aaef5d",
      "latest": false,
      "name": "7.55",
      "names": [
        "7.55"
      ]
    },
    {
      "key": "c3f948214b90e498",
      "latest": false,
      "name": "7.55x1",
      "names": [
        "7.55x1"
      ]
    },
    {
      "key": "284bb7f44b9c0976",
      "latest": false,
      "name": "7.55x2",
      "names": [
        "7.55x2"
      ]
    },
    {
      "key": "f5af21155b99a524",
      "latest": false,
      "name": "7.56",
      "names": [
        "7.56"
      ]
    },
    {
      "key": "541c0c12e07da325",
      "latest": true,
      "name": "7.56x1",
      "names": [
        "7.56x1",
        "latest"
      ]
    }
  ]
}
```

### List rows

Read the rows of any sheet in order of ID, a page at a time with the fields asked for, or the rows named by ID. Page on by giving the last row read as After. Row IDs are not contiguous: a page holds the rows that exist.

**Inputs**

- Sheet (`sheet`, text, required): The sheet, the game's name for a table of data, such as Item, Action, Quest, Recipe, Mount or Map. Case does not matter. List sheets lists every one.
- Fields (`fields`, text): Optional. The fields to read, separated by commas, such as Name,Description,Icon. A related row's field is read with a dot, such as ItemUICategory.Name; a field in every entry of an array with [], such as BaseParam[].Name; a field in another language with @lang, such as Name@lang(ja); a relation as its number alone with @as(raw). Leave empty for every field, which can be a lot.
- Limit (`limit`, number): How many rows to return at most, from 1 to 500. Defaults to 20. From 1 to 500. Default: `20`.
- After (`after`, text): Optional. Only rows after this one, such as 4550, or the next_after an earlier List rows step returned. Leave empty to start from the first row.
- Rows (`rows`, text): Optional. Only these rows, by ID separated by commas, such as 1,2,37362, or row:subrow. Cannot be combined with After. A row that does not exist fails the step.
- Language (`language`, text): The language of names, descriptions and other text: English, Japanese, German or French. Defaults to English. A search looks for the name in this language. One of: `en` (English), `ja` (Japanese), `de` (German), `fr` (French). Default: `en`.
- Game version (`version`, text): Optional. The game version to read, such as 7.0 or 7.2x1, as List game versions lists them. Leave empty for the latest. Pin it so a workflow keeps giving the same answers across patches.

**Outputs**

- `count` (number): How many rows this page holds.
- `next_after` (text): Give it as After to read the next page, e.g. '4552'; null when the page was not full, so there are no more, or rows were named.
- `rows` (list): This page of rows, in order of ID. Empty past the last row.
- `schema` (text): The schema the sheet was read with, e.g. 'exdschema@2:rev:e773c41...'. Give it as Schema to pin a later step to it.
- `sheet` (text): The sheet read, as the API spells it, e.g. 'Item'.
- `version` (text): The key of the game version read, e.g. '541c0c12e07da325'. Give it as Game version to pin a later step to it.

**Example output**

```json
{
  "count": 2,
  "next_after": "4552",
  "rows": [
    {
      "fields": {
        "Name": "Potion"
      },
      "row_id": 4551,
      "subrow_id": null,
      "transient": null
    },
    {
      "fields": {
        "Name": "Hi-Potion"
      },
      "row_id": 4552,
      "subrow_id": null,
      "transient": null
    }
  ],
  "schema": "exdschema@2:rev:e773c41a90aed788cf4c1c48469fa85618ef01fb",
  "sheet": "Item",
  "version": "541c0c12e07da325"
}
```

### List sheets

List the sheets XIVAPI can read, about 7,900 tables of game data from Achievement to World, by name, optionally only those with some text in their name. A sheet's name is what Get a row, List rows and Search take.

**Inputs**

- Name contains (`name`, text): Optional. Only sheets with this in their name, ignoring case, such as Item or Quest. Leave empty for every sheet.
- Limit (`limit`, number): How many names to return at most, from 1 to 10000. Defaults to 100. The total counts every sheet that matched. From 1 to 10000. Default: `100`.
- Game version (`version`, text): Optional. The game version to read, such as 7.0 or 7.2x1, as List game versions lists them. Leave empty for the latest. Pin it so a workflow keeps giving the same answers across patches.

**Outputs**

- `count` (number): How many names were returned.
- `sheets` (list): The sheets' names, in the API's order, e.g. 'Item'.
- `total` (number): How many sheets matched in all.

**Example output**

```json
{
  "count": 2,
  "sheets": [
    "ItemUICategory",
    "MYCTemporaryItemUICategory"
  ],
  "total": 2
}
```

### Search

Search one or more sheets for rows whose name contains some text, rows matching a query in XIVAPI's own language, or both, in order of relevance, a page at a time. A query is clauses such as +LevelItem>=50 or +ClassJob.Abbreviation="PCT": = is exact, ~ is part of a text, a leading plus means a clause must match and a leading minus that it must not. Read the fields asked for from every result, and page on with the cursor.

**Inputs**

- Sheets (`sheets`, text): The sheets to search, separated by commas, such as Item or Action,Item. Defaults to Item. A query can only use fields every listed sheet has. Default: `Item`.
- Name contains (`name`, text): Optional. Only rows with this in their name, ignoring case, in the chosen language, such as potion. Give this, a query, or both.
- Query (`query`, text): Optional. Clauses in XIVAPI's query language, such as +LevelItem>=50 or +ClassJob.Abbreviation="PCT" +IsPlayerAction=true: field, operator and value, where = is exact, ~ part of a text, and >, >=, <, <= compare numbers; a clause led by a plus must match, one led by a minus must not, and parentheses group clauses. Combined with Name contains when both are given.
- Fields (`fields`, text): Optional. The fields to read, separated by commas, such as Name,Description,Icon. A related row's field is read with a dot, such as ItemUICategory.Name; a field in every entry of an array with [], such as BaseParam[].Name; a field in another language with @lang, such as Name@lang(ja); a relation as its number alone with @as(raw). Leave empty for every field, which can be a lot.
- Language (`language`, text): The language of names, descriptions and other text: English, Japanese, German or French. Defaults to English. A search looks for the name in this language. One of: `en` (English), `ja` (Japanese), `de` (German), `fr` (French). Default: `en`.
- Limit (`limit`, number): How many rows to return at most, from 1 to 500. Defaults to 20. From 1 to 500. Default: `20`.
- Cursor (`cursor`, text): Optional. The next_cursor an earlier Search step returned, to read the next page of the same search. The sheets, name and query are then ignored.
- Game version (`version`, text): Optional. The game version to read, such as 7.0 or 7.2x1, as List game versions lists them. Leave empty for the latest. Pin it so a workflow keeps giving the same answers across patches.

**Outputs**

- `count` (number): How many results this page holds.
- `next_cursor` (text): Give it as Cursor to read the next page; null when this is the last.
- `query` (text): The query sent, e.g. '+Name~"potion" +LevelItem>=50'; null when a cursor was followed.
- `results` (list): This page of the rows that matched, best match first. Empty when none did.
- `schema` (text): The schema the sheet was read with, e.g. 'exdschema@2:rev:e773c41...'. Give it as Schema to pin a later step to it.
- `sheets` (list): The sheets searched, as the API spells them, e.g. ['Item']; empty when a cursor was followed.
- `version` (text): The key of the game version read, e.g. '541c0c12e07da325'. Give it as Game version to pin a later step to it.

**Example output**

```json
{
  "count": 5,
  "next_cursor": "4642c5aa-f023-4dab-a3ab-91adeb68e589",
  "query": "+Name~\"potion\" +LevelItem>=50",
  "results": [
    {
      "fields": {
        "LevelItem@as(raw)": 70,
        "Name": "X-Potion"
      },
      "row_id": 4554,
      "score": 1.75,
      "sheet": "Item",
      "subrow_id": null,
      "transient": null
    },
    {
      "fields": {
        "LevelItem@as(raw)": 150,
        "Name": "Max-Potion"
      },
      "row_id": 13637,
      "score": 1.6,
      "sheet": "Item",
      "subrow_id": null,
      "transient": null
    },
    {
      "fields": {
        "LevelItem@as(raw)": 290,
        "Name": "Super-Potion"
      },
      "row_id": 23167,
      "score": 1.5,
      "sheet": "Item",
      "subrow_id": null,
      "transient": null
    },
    {
      "fields": {
        "LevelItem@as(raw)": 560,
        "Name": "Hyper-Potion"
      },
      "row_id": 38956,
      "score": 1.5,
      "sheet": "Item",
      "subrow_id": null,
      "transient": null
    },
    {
      "fields": {
        "LevelItem@as(raw)": 690,
        "Name": "Ultra-Potion"
      },
      "row_id": 47701,
      "score": 1.5,
      "sheet": "Item",
      "subrow_id": null,
      "transient": null
    }
  ],
  "schema": "exdschema@2:rev:e773c41a90aed788cf4c1c48469fa85618ef01fb",
  "sheets": [
    "Item"
  ],
  "version": "541c0c12e07da325"
}
```
