JSON API

Everything on this site as JSON under https://forever.marni.ac/api/v1, version v1. No key, no sign-up; the machine-readable description is /api/v1/openapi.json (OpenAPI 3.1).

Conventions

Envelope

Every response is JSON in UTF-8. A single entity comes as { "data": … }; detail endpoints accept include=raw to add the raw client rows as raw. Lists come as { "data": [ … ], "page": { "page", "per_page", "total", "pages" }, "links": { "self", "first", "prev", "next", "last" }, "ignored": [] }, and with include=facets also facets.

Pagination

page is 1-based and per_page takes 1 to 200 (default 50). Lists also send an RFC 8288 Link header and X-Total-Count. Every sort ends with the id as a tiebreaker, so pages are stable; a page beyond the end answers 200 with an empty data.

Ranges, times and money

A range is one parameter: level=50..60, cast_time=..1.5s, stat.strength=10..; a single value means equality. Times accept ms, s, m and h (a bare number is seconds). Money accepts copper or 1g50s25c; distances are yards.

Enum keys and numbers

Enum parameters accept the stable key (school=fire) or the client’s number (school=4), repeated or comma-separated. Every enum parameter p also takes p_mode=any|all (and exact for masks) and p_not=. Responses carry enum values as { "value", "key", "label" }; /api/v1/enums lists every key. Keys are frozen within /api/v1.

Errors

Errors use RFC 9457 application/problem+json: { "type", "title", "status", "detail", "invalid_params": [ { "name", "reason" } ] }. Invalid or unknown parameters answer 400 with every problem listed, unknown ids 404, and rate limiting 429 with Retry-After. The type links to one of these entries:

invalid-parameters 400 Invalid parameters
A parameter is unknown or its value is invalid. invalid_params lists every problem with the parameter name and the reason; fix them all and retry.
not-found 404 Not found
The path does not exist, or there is no entity with this id in the dataset.
method-not-allowed 405 Method not allowed
The API is read-only: only GET and HEAD are answered (and CORS preflights). The Allow header lists the methods.
payload-too-large 413 Payload too large
The request carried a body; GET requests take their parameters in the query string.
uri-too-long 414 URI too long
The query string is longer than 2048 bytes. Use fewer or shorter parameters, or split an id list into several requests.
rate-limited 429 Too many requests
Too many requests from your address. Wait for the number of seconds in Retry-After, and cache responses.
internal 500 Internal server error
A bug on our side. The body carries a request_id; please include it when you report the problem.
unavailable 503 Service unavailable
The server is busy or the request took longer than 10 seconds. Retry later, with a simpler query if it keeps happening.
error 400 Error
Any other client error.

Caching and ETags

Responses carry a weak ETag derived from the server build and the dataset; send it back in If-None-Match to get a 304. API responses are cacheable for an hour (Cache-Control: public, max-age=3600, stale-while-revalidate=86400), and every response names its dataset in X-Dataset-Id. CORS is open (Access-Control-Allow-Origin: *), and preflights are answered, so browser clients may send If-None-Match.

Rate limits

20 API requests per second per IP with bursts of 60; icons and static assets are not limited. Please cache responses and use id=1,2,3 lookups instead of many single requests.

Stability

Within /api/v1 changes are additive only: new fields, parameters and enum values may appear; renames, removals and type changes need /api/v2. Clients should ignore fields they do not know.

Embedding

Embedding tooltip cards on other sites is out of scope for v1; the JSON tooltips (/api/v1/tooltip/{kind}/{id}) are there to render your own. Icons may be hot-linked.

Endpoints

GET /api/v1

The API index.

1 parameter
Parameters of /api/v1
NameInTypeDescriptionExample
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
Links to every collection, the OpenAPI document and the docs
ApiIndex
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1'

GET /api/v1/buffs

`308` to `/api/v1/spells?has_aura=1` plus the original query.

308
Redirect to `/api/v1/spells?has_aura=1` with the same query
curl -s 'https://forever.marni.ac/api/v1/buffs'

GET /api/v1/classes

Every class (unpaginated).

1 parameter
Parameters of /api/v1/classes
NameInTypeDescriptionExample
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
Every class
DataResponse_Vec_ClassRef
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/classes'
Example response (sample data)
{
  "data": [
    {
      "api_url": "/api/v1/classes/mage",
      "color": "#3fc7eb",
      "icon": {
        "fdid": 626001,
        "name": "classicon_mage",
        "urls": {
          "36": "/icons/e51e286ba9a5d393.webp",
          "64": "/icons/e51e286ba9a5d3c1.webp"
        }
      },
      "id": 8,
      "key": "mage",
      "name": "Mage",
      "url": "/classes/mage"
    },
    {
      "api_url": "/api/v1/classes/warrior",
      "color": "#c69b6d",
      "icon": {
        "fdid": 626008,
        "name": "classicon_warrior",
        "urls": {
          "36": "/icons/38a27c7e24af380e.webp",
          "64": "/icons/38a27c7e24af385c.webp"
        }
      },
      "id": 1,
      "key": "warrior",
      "name": "Warrior",
      "url": "/classes/warrior"
    }
  ]
}

GET /api/v1/classes/{id}

One class by id or slug: talent trees and abilities.

2 parameters
Parameters of /api/v1/classes/{id}
NameInTypeDescriptionExample
id requiredpathstringClass id or slug (`8` or `mage`)
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
The class
ItemResponse_ClassDetail
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
404
No such class
Problem
curl -s 'https://forever.marni.ac/api/v1/classes/mage'
Example response (sample data)
{
  "data": {
    "ability_groups": [
      {
        "skill_line": {
          "api_url": "/api/v1/skill-lines/8",
          "icon": {
            "fdid": 135810,
            "name": "spell_fire_firebolt02",
            "urls": {
              "36": "/icons/322dd9bad8b67c9c.webp",
              "64": "/icons/322dd9bad8b67cce.webp"
            }
          },
          "id": 8,
          "name": "Fire",
          "url": "/skill-lines/8/fire"
        },
        "spells": [
          {
            "api_url": "/api/v1/spells/25306",
            "aura_kind": {
              "key": "debuff",
              "label": "Debuff",
              "value": 2
            },
            "base_level": 60,
            "cast": {
              "channeled": false,
              "label": "1.5 sec cast",
              "ms": 1500,
              "next_melee": false
            },
            "classes": [
              {
                "api_url": "/api/v1/classes/mage",
                "color": "#3fc7eb",
                "icon": {
                  "fdid": 626001,
                  "name": "classicon_mage",
                  "urls": {
                    "36": "/icons/e51e286ba9a5d393.webp",
                    "64": "/icons/e51e286ba9a5d3c1.webp"
                  }
                },
                "id": 8,
                "key": "mage",
                "name": "Mage",
                "url": "/classes/mage"
              }
            ],
            "dispel": {
              "key": "magic",
              "label": "Magic",
              "value": 1
            },
            "duration": {
              "infinite": false,
              "ms": 4000
            },
            "effect_count": 2,
            "gcd_ms": 1500,
            "has_aura": true,
            "icon": {
              "fdid": 135812,
              "name": "spell_fire_flamebolt",
              "urls": {
                "36": "/icons/6e9ccd2dd74b74e2.webp",
                "64": "/icons/6e9ccd2dd74b74b0.webp"
              }
            },
            "id": 25306,
            "is_player_spell": true,
            "is_talent": false,
            "level": 60,
            "max_level": 65,
            "max_range_yd": 35.0,
            "min_range_yd": 0.0,
            "name": "Fireball",
            "power": {
              "amount": 410,
              "power_type": {
                "key": "mana",
                "label": "Mana",
                "value": 0
              }
            },
            "rank": {
              "count": 12,
              "group": 133,
              "highest": true,
              "number": 12
            },
            "school_relevant": true,
            "schools": [
              {
                "key": "fire",
                "label": "Fire",
                "value": 4
              }
            ],
            "status": "complete",
            "subtext": "Rank 12",
            "url": "/spells/25306/fireball"
          }
        ]
      }
    ],
    "api_url": "/api/v1/classes/mage",
    "color": "#3fc7eb",
    "icon": {
      "fdid": 626001,
      "name": "classicon_mage",
      "urls": {
        "36": "/icons/e51e286ba9a5d393.webp",
        "64": "/icons/e51e286ba9a5d3c1.webp"
      }
    },
    "id": 8,
    "key": "mage",
    "name": "Mage",
    "power_type": {
      "key": "mana",
      "label": "Mana",
      "value": 0
    },
    "slug": "mage",
    "spell_count": 3,
    "talent_tabs": [
      {
        "cells": [
          {
            "column": 1,
            "ranks": [
              {
                "api_url": "/api/v1/spells/11069",
                "icon": {
                  "fdid": 135812,
                  "name": "spell_fire_flamebolt",
                  "urls": {
                    "36": "/icons/6e9ccd2dd74b74e2.webp",
                    "64": "/icons/6e9ccd2dd74b74b0.webp"
                  }
                },
                "id": 11069,
                "name": "Improved Fireball",
                "status": "complete",
                "subtext": "Rank 1",
                "url": "/spells/11069/improved-fireball"
              }
            ],
            "tier": 0
          },
          {
            "column": 1,
            "prerequisite": {
              "column": 1,
              "tier": 0
            },
            "ranks": [
              {
                "api_url": "/api/v1/spells/11366",
                "icon": {
                  "fdid": 135812,
                  "name": "spell_fire_flamebolt",
                  "urls": {
                    "36": "/icons/6e9ccd2dd74b74e2.webp",
                    "64": "/icons/6e9ccd2dd74b74b0.webp"
                  }
                },
                "id": 11366,
                "name": "Pyroblast",
                "status": "complete",
                "subtext": "Rank 1",
                "url": "/spells/11366/pyroblast"
              }
            ],
            "tier": 2
          }
        ],
        "icon": {
          "fdid": 135810,
          "name": "spell_fire_firebolt02",
          "urls": {
            "36": "/icons/322dd9bad8b67c9c.webp",
            "64": "/icons/322dd9bad8b67cce.webp"
          }
        },
        "id": 41,
        "name": "Fire",
        "order": 1
      }
    ],
    "url": "/classes/mage"
  }
}

GET /api/v1/coverage

The extraction report: table status, coverage, orphans, mismatches, text and icon coverage.

1 parameter
Parameters of /api/v1/coverage
NameInTypeDescriptionExample
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
Extraction report
ExtractionReport
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/coverage'

GET /api/v1/enchantments

Enchantment search.

10 parameters
Parameters of /api/v1/enchantments
NameInTypeDescriptionExample
qquerystringText search (prefix match per word). At most 100 characters.agility
idqueryarray of integerExact ids (at most 100). Repeat the parameter or separate ids with commas; at most 100 ids.[1887]
effect_kindqueryarray of string | integerHas an effect of this kind. Values are keys or numbers of the enum `enchant_type` (`/api/v1/enums/enchant_type`); repeat the parameter or separate values with commas (at most 32). `effect_kind_mode` (`any` or `all`, default `any`) combines them; `effect_kind_not` excludes values.["stat"]
effect_kind_modequerystring
one of any, all
How the values of `effect_kind` combine.all
effect_kind_notqueryarray of string | integerValues that `effect_kind` must not have; same syntax as `effect_kind`.["stat"]
includequerystring
one of facets
`facets` adds facet counts (API only).facets
sortquerystring
one of relevance, name, -name, id, -id
Sort key, `-` prefix for descending. Every sort ends with `id` as the tiebreaker.name
pagequeryinteger1-based page.2
per_pagequeryintegerRows per page, 1 to 200 (default 50).100
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
One page of enchantments
ListResponse_EnchantmentSummary
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/enchantments?q=agility'
Example response (sample data)
{
  "data": [
    {
      "api_url": "/api/v1/enchantments/1887",
      "applied_by_count": 1,
      "effect_kinds": [
        {
          "key": "stat",
          "label": "Stat",
          "value": 5
        }
      ],
      "id": 1887,
      "name": "+7 Agility",
      "url": "/enchantments/1887/7-agility"
    }
  ],
  "ignored": [],
  "links": {
    "first": "/api/v1/enchantments?page=1",
    "last": "/api/v1/enchantments?page=1",
    "self": "/api/v1/enchantments?page=1"
  },
  "page": {
    "page": 1,
    "pages": 1,
    "per_page": 50,
    "total": 1
  }
}

GET /api/v1/enchantments/{id}

One enchantment, with its applying spells and socket-bonus items.

3 parameters
Parameters of /api/v1/enchantments/{id}
NameInTypeDescriptionExample
id requiredpathinteger (int32)Enchantment id
includequerystring`raw` adds the raw client rows (`raw: [RawRow]`).raw
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
The enchantment
ItemResponse_EnchantmentDetail
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
404
No such enchantment
Problem
curl -s 'https://forever.marni.ac/api/v1/enchantments/1887'
Example response (sample data)
{
  "data": {
    "api_url": "/api/v1/enchantments/1887",
    "applied_by": [
      {
        "api_url": "/api/v1/spells/20023",
        "icon": {
          "fdid": 135932,
          "name": "spell_holy_magicalsentry",
          "urls": {
            "36": "/icons/989ddc2182359e9a.webp",
            "64": "/icons/989ddc2182359ec8.webp"
          }
        },
        "id": 20023,
        "name": "Enchant Boots - Greater Agility",
        "status": "complete",
        "url": "/spells/20023/enchant-boots-greater-agility"
      }
    ],
    "effects": [
      {
        "amount_max": 7,
        "amount_min": 7,
        "arg_display": {
          "raw": 3,
          "role": "stat",
          "slot": 0,
          "values": [
            {
              "key": "agility",
              "label": "Agility",
              "value": 3
            }
          ]
        },
        "kind": {
          "key": "stat",
          "label": "Stat",
          "value": 5
        }
      }
    ],
    "id": 1887,
    "name": "+7 Agility",
    "notes": [],
    "required_skill": {
      "rank": 295,
      "skill_line": {
        "api_url": "/api/v1/skill-lines/333",
        "id": 333,
        "name": "Enchanting",
        "url": "/skill-lines/333/enchanting"
      }
    },
    "slug": "7-agility",
    "socket_bonus_of": [],
    "tooltip": {
      "lines": [
        {
          "left": [
            {
              "text": "+7 Agility",
              "type": "text"
            }
          ],
          "style": {
            "type": "spell"
          }
        }
      ]
    },
    "url": "/enchantments/1887/7-agility"
  }
}

GET /api/v1/enums

Every enum with its values (keys are what filters accept).

1 parameter
Parameters of /api/v1/enums
NameInTypeDescriptionExample
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
Every enum
DataResponse_Vec_EnumListEntry
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/enums'

GET /api/v1/enums/{name}

One enum.

2 parameters
Parameters of /api/v1/enums/{name}
NameInTypeDescriptionExample
name requiredpathstringEnum name (`school`)
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
The enum
DataResponse_EnumListEntry
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
404
No such enum
Problem
curl -s 'https://forever.marni.ac/api/v1/enums/school'

GET /api/v1/item-sets

Item set search.

18 parameters
Parameters of /api/v1/item-sets
NameInTypeDescriptionExample
qquerystringText search (prefix match per word). At most 100 characters.might
idqueryarray of integerExact ids (at most 100). Repeat the parameter or separate ids with commas; at most 100 ids.[209]
classqueryarray of stringUsable by this class. Values are keys or numbers of the enum `class` (`/api/v1/enums/class`); repeat the parameter or separate values with commas (at most 32). `class_mode` (`any`, `all` or `exact`, default `any`) combines them; `class_not` excludes values.["warrior"]
class_modequerystring
one of any, all, exact
How the values of `class` combine.exact
class_notqueryarray of stringValues that `class` must not have; same syntax as `class`.["warrior"]
item_levelquerystringLowest item level over complete members. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.60..
qualityqueryarray of string | integerHighest quality over complete members. Values are keys or numbers of the enum `item_quality` (`/api/v1/enums/item_quality`); repeat the parameter or separate values with commas (at most 32). `quality_mode` (`any` or `all`, default `any`) combines them; `quality_not` excludes values.["epic"]
quality_modequerystring
one of any, all
How the values of `quality` combine.all
quality_notqueryarray of string | integerValues that `quality` must not have; same syntax as `quality`.["epic"]
required_skillqueryarray of stringRequired skill line. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `required_skill_mode` (`any` or `all`, default `any`) combines them; `required_skill_not` excludes values.["tailoring"]
required_skill_modequerystring
one of any, all
How the values of `required_skill` combine.all
required_skill_notqueryarray of stringValues that `required_skill` must not have; same syntax as `required_skill`.["tailoring"]
statusquerystring
one of complete, partial, missing, all
Data completeness: `complete` (default), `partial`, `missing`, `all`.all
includequerystring
one of facets
`facets` adds facet counts (API only).facets
sortquerystring
one of relevance, name, -name, id, -id, item_level, -item_level, item_count, -item_count
Sort key, `-` prefix for descending. Every sort ends with `id` as the tiebreaker.name
pagequeryinteger1-based page.2
per_pagequeryintegerRows per page, 1 to 200 (default 50).100
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
One page of item sets
ListResponse_ItemSetSummaryRow
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/item-sets?class=warrior'
Example response (sample data)
{
  "data": [
    {
      "api_url": "/api/v1/item-sets/209",
      "classes": [
        {
          "api_url": "/api/v1/classes/warrior",
          "color": "#c69b6d",
          "icon": {
            "fdid": 626008,
            "name": "classicon_warrior",
            "urls": {
              "36": "/icons/38a27c7e24af380e.webp",
              "64": "/icons/38a27c7e24af385c.webp"
            }
          },
          "id": 1,
          "key": "warrior",
          "name": "Warrior",
          "url": "/classes/warrior"
        }
      ],
      "id": 209,
      "item_count": 8,
      "max_quality": {
        "key": "epic",
        "label": "Epic",
        "value": 4
      },
      "min_item_level": 66,
      "name": "Battlegear of Might",
      "url": "/item-sets/209/battlegear-of-might"
    }
  ],
  "ignored": [],
  "links": {
    "first": "/api/v1/item-sets?page=1",
    "last": "/api/v1/item-sets?page=1",
    "self": "/api/v1/item-sets?page=1"
  },
  "page": {
    "page": 1,
    "pages": 1,
    "per_page": 50,
    "total": 1
  }
}

GET /api/v1/item-sets/{id}

One item set.

2 parameters
Parameters of /api/v1/item-sets/{id}
NameInTypeDescriptionExample
id requiredpathinteger (int32)Item set id
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
The item set
ItemResponse_ItemSetDetail
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
404
No such item set
Problem
curl -s 'https://forever.marni.ac/api/v1/item-sets/211'
Example response (sample data)
{
  "data": {
    "api_url": "/api/v1/item-sets/209",
    "bonuses": [
      {
        "spell": {
          "api_url": "/api/v1/spells/21838",
          "icon": {
            "fdid": 133073,
            "name": "inv_helmet_09",
            "urls": {
              "36": "/icons/a3117180ed5de013.webp",
              "64": "/icons/a3117180ed5de041.webp"
            }
          },
          "id": 21838,
          "name": "Battlegear of Might Bonus",
          "status": "complete",
          "url": "/spells/21838/battlegear-of-might-bonus"
        },
        "text": [
          {
            "text": "+20 Armor.",
            "type": "text"
          }
        ],
        "threshold": 3
      },
      {
        "spell": {
          "api_url": "/api/v1/spells/21839",
          "icon": {
            "fdid": 133073,
            "name": "inv_helmet_09",
            "urls": {
              "36": "/icons/a3117180ed5de013.webp",
              "64": "/icons/a3117180ed5de041.webp"
            }
          },
          "id": 21839,
          "name": "Battlegear of Might Bonus",
          "status": "complete",
          "url": "/spells/21839/battlegear-of-might-bonus"
        },
        "text": [
          {
            "text": "Increases the threat you generate.",
            "type": "text"
          }
        ],
        "threshold": 5
      },
      {
        "spell": {
          "api_url": "/api/v1/spells/21840",
          "icon": {
            "fdid": 133073,
            "name": "inv_helmet_09",
            "urls": {
              "36": "/icons/a3117180ed5de013.webp",
              "64": "/icons/a3117180ed5de041.webp"
            }
          },
          "id": 21840,
          "name": "Battlegear of Might Bonus",
          "status": "complete",
          "url": "/spells/21840/battlegear-of-might-bonus"
        },
        "text": [
          {
            "text": "Heals you for a portion of your damage.",
            "type": "text"
          }
        ],
        "threshold": 8
      }
    ],
    "class_mask": 1,
    "classes": [
      {
        "api_url": "/api/v1/classes/warrior",
        "color": "#c69b6d",
        "icon": {
          "fdid": 626008,
          "name": "classicon_warrior",
          "urls": {
            "36": "/icons/38a27c7e24af380e.webp",
            "64": "/icons/38a27c7e24af385c.webp"
          }
        },
        "id": 1,
        "key": "warrior",
        "name": "Warrior",
        "url": "/classes/warrior"
      }
    ],
    "flags": 0,
    "id": 209,
    "items": [
      {
        "api_url": "/api/v1/items/16861",
        "icon": {
          "fdid": 133073,
          "name": "inv_helmet_09",
          "urls": {
            "36": "/icons/a3117180ed5de013.webp",
            "64": "/icons/a3117180ed5de041.webp"
          }
        },
        "id": 16861,
        "name": "Bracers of Might",
        "quality": {
          "key": "epic",
          "label": "Epic",
          "value": 4
        },
        "status": "complete",
        "url": "/items/16861/bracers-of-might"
      },
      {
        "api_url": "/api/v1/items/16862",
        "icon": {
          "fdid": 133073,
          "name": "inv_helmet_09",
          "urls": {
            "36": "/icons/a3117180ed5de013.webp",
            "64": "/icons/a3117180ed5de041.webp"
          }
        },
        "id": 16862,
        "name": "Sabatons of Might",
        "quality": {
          "key": "epic",
          "label": "Epic",
          "value": 4
        },
        "status": "complete",
        "url": "/items/16862/sabatons-of-might"
      },
      {
        "api_url": "/api/v1/items/16863",
        "icon": {
          "fdid": 133073,
          "name": "inv_helmet_09",
          "urls": {
            "36": "/icons/a3117180ed5de013.webp",
            "64": "/icons/a3117180ed5de041.webp"
          }
        },
        "id": 16863,
        "name": "Gauntlets of Might",
        "quality": {
          "key": "epic",
          "label": "Epic",
          "value": 4
        },
        "status": "complete",
        "url": "/items/16863/gauntlets-of-might"
      },
      {
        "api_url": "/api/v1/items/16864",
        "icon": {
          "fdid": 133073,
          "name": "inv_helmet_09",
          "urls": {
            "36": "/icons/a3117180ed5de013.webp",
            "64": "/icons/a3117180ed5de041.webp"
          }
        },
        "id": 16864,
        "name": "Belt of Might",
        "quality": {
          "key": "epic",
          "label": "Epic",
          "value": 4
        },
        "status": "complete",
        "url": "/items/16864/belt-of-might"
      },
      {
        "api_url": "/api/v1/items/16865",
        "icon": {
          "fdid": 133073,
          "name": "inv_helmet_09",
          "urls": {
            "36": "/icons/a3117180ed5de013.webp",
            "64": "/icons/a3117180ed5de041.webp"
          }
        },
        "id": 16865,
        "name": "Breastplate of Might",
        "quality": {
          "key": "epic",
          "label": "Epic",
          "value": 4
        },
        "status": "complete",
        "url": "/items/16865/breastplate-of-might"
      },
      {
        "api_url": "/api/v1/items/16866",
        "icon": {
          "fdid": 133073,
          "name": "inv_helmet_09",
          "urls": {
            "36": "/icons/a3117180ed5de013.webp",
            "64": "/icons/a3117180ed5de041.webp"
          }
        },
        "id": 16866,
        "name": "Helm of Might",
        "quality": {
          "key": "epic",
          "label": "Epic",
          "value": 4
        },
        "status": "complete",
        "url": "/items/16866/helm-of-might"
      },
      {
        "api_url": "/api/v1/items/16867",
        "icon": {
          "fdid": 133073,
          "name": "inv_helmet_09",
          "urls": {
            "36": "/icons/a3117180ed5de013.webp",
            "64": "/icons/a3117180ed5de041.webp"
          }
        },
        "id": 16867,
        "name": "Legplates of Might",
        "quality": {
          "key": "epic",
          "label": "Epic",
          "value": 4
        },
        "status": "complete",
        "url": "/items/16867/legplates-of-might"
      },
      {
        "api_url": "/api/v1/items/16868",
        "icon": {
          "fdid": 133073,
          "name": "inv_helmet_09",
          "urls": {
            "36": "/icons/a3117180ed5de013.webp",
            "64": "/icons/a3117180ed5de041.webp"
          }
        },
        "id": 16868,
        "name": "Pauldrons of Might",
        "quality": {
          "key": "epic",
          "label": "Epic",
          "value": 4
        },
        "status": "complete",
        "url": "/items/16868/pauldrons-of-might"
      }
    ],
    "max_quality": {
      "key": "epic",
      "label": "Epic",
      "value": 4
    },
    "min_item_level": 66,
    "name": "Battlegear of Might",
    "notes": [],
    "slug": "battlegear-of-might",
    "tooltip": {
      "lines": [
        {
          "left": [
            {
              "text": "Battlegear of Might (0/8)",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_name"
          }
        },
        {
          "left": [
            {
              "text": "Bracers of Might",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_item"
          }
        },
        {
          "left": [
            {
              "text": "Sabatons of Might",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_item"
          }
        },
        {
          "left": [
            {
              "text": "Gauntlets of Might",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_item"
          }
        },
        {
          "left": [
            {
              "text": "Belt of Might",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_item"
          }
        },
        {
          "left": [
            {
              "text": "Breastplate of Might",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_item"
          }
        },
        {
          "left": [
            {
              "text": "Helm of Might",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_item"
          }
        },
        {
          "left": [
            {
              "text": "Legplates of Might",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_item"
          }
        },
        {
          "left": [
            {
              "text": "Pauldrons of Might",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_item"
          }
        },
        {
          "left": [
            {
              "text": "(3) Set: +20 Armor.",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_bonus"
          }
        },
        {
          "left": [
            {
              "text": "(5) Set: Increases the threat you generate.",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_bonus"
          }
        },
        {
          "left": [
            {
              "text": "(8) Set: Heals you for a portion of your damage.",
              "type": "text"
            }
          ],
          "style": {
            "type": "set_bonus"
          }
        }
      ]
    },
    "url": "/item-sets/209/battlegear-of-might"
  }
}

GET /api/v1/items

Item search.

104 parameters
Parameters of /api/v1/items
NameInTypeDescriptionExample
qquerystringText search (prefix match per word). At most 100 characters.arcanite
inquerystring
one of name, all
Where `q` searches: `name` (default) or `all` (adds flavour and spell texts).all
idqueryarray of integerExact ids (at most 100); with `sort=input` the given order is kept. Repeat the parameter or separate ids with commas; at most 100 ids.[12784,19019]
qualityqueryarray of string | integerQuality. Values are keys or numbers of the enum `item_quality` (`/api/v1/enums/item_quality`); repeat the parameter or separate values with commas (at most 32). `quality_mode` (`any` or `all`, default `any`) combines them; `quality_not` excludes values.["epic"]
quality_modequerystring
one of any, all
How the values of `quality` combine.all
quality_notqueryarray of string | integerValues that `quality` must not have; same syntax as `quality`.["epic"]
classqueryarray of string | integerItem class. Values are keys or numbers of the enum `item_class` (`/api/v1/enums/item_class`); repeat the parameter or separate values with commas (at most 32). `class_mode` (`any` or `all`, default `any`) combines them; `class_not` excludes values.["weapon"]
class_modequerystring
one of any, all
How the values of `class` combine.all
class_notqueryarray of string | integerValues that `class` must not have; same syntax as `class`.["weapon"]
subclassqueryarray of stringItem subclass as `<class_key>.<subclass_key>`. Values are keys or numbers of the enum `item_subclass` (`/api/v1/enums/item_subclass`); repeat the parameter or separate values with commas (at most 32). `subclass_mode` (`any` or `all`, default `any`) combines them; `subclass_not` excludes values.["weapon.sword_1h"]
subclass_modequerystring
one of any, all
How the values of `subclass` combine.all
subclass_notqueryarray of stringValues that `subclass` must not have; same syntax as `subclass`.["weapon.sword_1h"]
slotqueryarray of string | integerInventory type. Values are keys or numbers of the enum `inventory_type` (`/api/v1/enums/inventory_type`); repeat the parameter or separate values with commas (at most 32). `slot_mode` (`any` or `all`, default `any`) combines them; `slot_not` excludes values.["head"]
slot_modequerystring
one of any, all
How the values of `slot` combine.all
slot_notqueryarray of string | integerValues that `slot` must not have; same syntax as `slot`.["head"]
bondingqueryarray of string | integerBonding. Values are keys or numbers of the enum `bonding` (`/api/v1/enums/bonding`); repeat the parameter or separate values with commas (at most 32). `bonding_mode` (`any` or `all`, default `any`) combines them; `bonding_not` excludes values.["on_equip"]
bonding_modequerystring
one of any, all
How the values of `bonding` combine.all
bonding_notqueryarray of string | integerValues that `bonding` must not have; same syntax as `bonding`.["on_equip"]
materialqueryarray of string | integerMaterial. Values are keys or numbers of the enum `material` (`/api/v1/enums/material`); repeat the parameter or separate values with commas (at most 32). `material_mode` (`any` or `all`, default `any`) combines them; `material_not` excludes values.["metal"]
material_modequerystring
one of any, all
How the values of `material` combine.all
material_notqueryarray of string | integerValues that `material` must not have; same syntax as `material`.["metal"]
socket_colorqueryarray of string | integerHas a socket of this colour. Values are keys or numbers of the enum `socket_color` (`/api/v1/enums/socket_color`); repeat the parameter or separate values with commas (at most 32). `socket_color_mode` (`any` or `all`, default `any`) combines them; `socket_color_not` excludes values.["red"]
socket_color_modequerystring
one of any, all
How the values of `socket_color` combine.all
socket_color_notqueryarray of string | integerValues that `socket_color` must not have; same syntax as `socket_color`.["red"]
bag_familyqueryarray of string | integerBag family. Values are keys or numbers of the enum `bag_family` (`/api/v1/enums/bag_family`); repeat the parameter or separate values with commas (at most 32). `bag_family_mode` (`any`, `all` or `exact`, default `any`) combines them; `bag_family_not` excludes values.["arrows"]
bag_family_modequerystring
one of any, all, exact
How the values of `bag_family` combine.exact
bag_family_notqueryarray of string | integerValues that `bag_family` must not have; same syntax as `bag_family`.["arrows"]
armor_typequeryarray of stringShorthand for `subclass` within armor (`plate`). Values are keys or numbers of the enum `item_subclass` (`/api/v1/enums/item_subclass`); repeat the parameter or separate values with commas (at most 32). `armor_type_mode` (`any` or `all`, default `any`) combines them; `armor_type_not` excludes values.["plate"]
armor_type_modequerystring
one of any, all
How the values of `armor_type` combine.all
armor_type_notqueryarray of stringValues that `armor_type` must not have; same syntax as `armor_type`.["plate"]
weapon_typequeryarray of stringShorthand for `subclass` within weapons (`sword_1h`). Values are keys or numbers of the enum `item_subclass` (`/api/v1/enums/item_subclass`); repeat the parameter or separate values with commas (at most 32). `weapon_type_mode` (`any` or `all`, default `any`) combines them; `weapon_type_not` excludes values.["sword_1h"]
weapon_type_modequerystring
one of any, all
How the values of `weapon_type` combine.all
weapon_type_notqueryarray of stringValues that `weapon_type` must not have; same syntax as `weapon_type`.["sword_1h"]
class_usablequeryarray of stringUsable by this class (no restriction, or one including it). Values are keys or numbers of the enum `class` (`/api/v1/enums/class`); repeat the parameter or separate values with commas (at most 32). `class_usable_mode` (`any`, `all` or `exact`, default `any`) combines them; `class_usable_not` excludes values.["warrior"]
class_usable_modequerystring
one of any, all, exact
How the values of `class_usable` combine.exact
class_usable_notqueryarray of stringValues that `class_usable` must not have; same syntax as `class_usable`.["warrior"]
racequeryarray of stringUsable by this race. Values are keys or numbers of the enum `race` (`/api/v1/enums/race`); repeat the parameter or separate values with commas (at most 32). `race_mode` (`any`, `all` or `exact`, default `any`) combines them; `race_not` excludes values.["human"]
race_modequerystring
one of any, all, exact
How the values of `race` combine.exact
race_notqueryarray of stringValues that `race` must not have; same syntax as `race`.["human"]
skillqueryarray of stringRequired profession. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `skill_mode` (`any` or `all`, default `any`) combines them; `skill_not` excludes values.["blacksmithing"]
skill_modequerystring
one of any, all
How the values of `skill` combine.all
skill_notqueryarray of stringValues that `skill` must not have; same syntax as `skill`.["blacksmithing"]
skill_rankquerystringRequired profession rank. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...300
factionqueryarray of integerRequired reputation faction id. Values are ids; repeat the parameter or separate values with commas (at most 32). `faction_mode` (`any` or `all`, default `any`) combines them; `faction_not` excludes values.["529"]
faction_modequerystring
one of any, all
How the values of `faction` combine.all
faction_notqueryarray of integerValues that `faction` must not have; same syntax as `faction`.["529"]
standingquerystringRequired standing (0 hated .. 7 exalted). Range `lo..hi`, `lo..` or `..hi`; a single value means equality.5..
pvp_rankquerystringRequired PvP rank. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.10..
statqueryarray of string | integerItem has these stats (default mode `all`; `stat_mode=any`). Values are keys or numbers of the enum `item_mod` (`/api/v1/enums/item_mod`); repeat the parameter or separate values with commas (at most 32). `stat_mode` (`any` or `all`, default `all`) combines them; `stat_not` excludes values.["strength"]
stat_modequerystring
one of any, all
How the values of `stat` combine.any
stat_notqueryarray of string | integerValues that `stat` must not have; same syntax as `stat`.["strength"]
stat.<key>querystringAmount of one stat (`stat.strength=10..`). Range `lo..hi`, `lo..` or `..hi`; a single value means equality.10..
triggerqueryarray of string | integerItem has a spell with this trigger. Values are keys or numbers of the enum `item_trigger` (`/api/v1/enums/item_trigger`); repeat the parameter or separate values with commas (at most 32). `trigger_mode` (`any` or `all`, default `any`) combines them; `trigger_not` excludes values.["use"]
trigger_modequerystring
one of any, all
How the values of `trigger` combine.all
trigger_notqueryarray of string | integerValues that `trigger` must not have; same syntax as `trigger`.["use"]
spell_effqueryarray of stringThe `eff` clause syntax applied to the item's spells. Repeatable, at most 8. The effect is a `spell_effect` or `aura_type` key (prefix `effect.` or `aura.` when a key is in both or for numbers); `misc` takes a number or a key decoded by the effect's misc role; `value` is a decimal range at level 60; `target` a `target` key.["mod_damage_done"]
spell_triggerqueryarray of string | integerRestricts `spell_eff` to spells with this trigger. Values are keys or numbers of the enum `item_trigger` (`/api/v1/enums/item_trigger`); repeat the parameter or separate values with commas (at most 32). `spell_trigger_mode` (`any` or `all`, default `any`) combines them; `spell_trigger_not` excludes values.["use"]
spell_trigger_modequerystring
one of any, all
How the values of `spell_trigger` combine.all
spell_trigger_notqueryarray of string | integerValues that `spell_trigger` must not have; same syntax as `spell_trigger`.["use"]
flagqueryarray of string | stringItem flag bits as `item_flagsN.key` or `N:bit` (default mode `all`); `flag_not` for must-be-clear. Repeat the parameter or separate values with commas (at most 32); unnamed bits are `<word>:<bit>` (words 0 to 4); `flag_mode` is `any` or `all` (default `all`).["item_flags0.conjured"]
flag_modequerystring
one of any, all
How the values of `flag` combine.any
flag_notqueryarray of string | stringValues that `flag` must not have; same syntax as `flag`.["item_flags0.conjured"]
setquerystringMember of this set id, `any` set or `none`.any
usequeryinteger
one of 0, 1
Has an on-use spell. `1` or `0`.1
equipqueryinteger
one of 0, 1
Has an equip spell. `1` or `0`.1
procqueryinteger
one of 0, 1
Has a chance-on-hit spell. `1` or `0`.1
learnqueryinteger
one of 0, 1
Teaches a spell. `1` or `0`.1
socketsqueryinteger
one of 0, 1
Has sockets. `1` or `0`.1
uniquequeryinteger
one of 0, 1
Is unique. `1` or `0`.1
has_iconqueryinteger
one of 0, 1
Has an icon. `1` or `0`.1
starts_questqueryinteger
one of 0, 1
Begins a quest. `1` or `0`.1
has_flavorqueryinteger
one of 0, 1
Has flavour text. `1` or `0`.1
limited_durationqueryinteger
one of 0, 1
Has a limited duration. `1` or `0`.1
bound_toqueryinteger
one of 0, 1
Is bound to an instance or zone. `1` or `0`.1
reagentqueryinteger
one of 0, 1
Is a reagent of some spell. `1` or `0`.1
crafted_byqueryarray of stringSkill line of a spell that creates the item. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `crafted_by_mode` (`any` or `all`, default `any`) combines them; `crafted_by_not` excludes values.["blacksmithing"]
crafted_by_modequerystring
one of any, all
How the values of `crafted_by` combine.all
crafted_by_notqueryarray of stringValues that `crafted_by` must not have; same syntax as `crafted_by`.["blacksmithing"]
reagent_for_skillqueryarray of stringUsed as a reagent by this profession. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `reagent_for_skill_mode` (`any` or `all`, default `any`) combines them; `reagent_for_skill_not` excludes values.["alchemy"]
reagent_for_skill_modequerystring
one of any, all
How the values of `reagent_for_skill` combine.all
reagent_for_skill_notqueryarray of stringValues that `reagent_for_skill` must not have; same syntax as `reagent_for_skill`.["alchemy"]
teaches_skillqueryarray of stringRecipe for this profession. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `teaches_skill_mode` (`any` or `all`, default `any`) combines them; `teaches_skill_not` excludes values.["enchanting"]
teaches_skill_modequerystring
one of any, all
How the values of `teaches_skill` combine.all
teaches_skill_notqueryarray of stringValues that `teaches_skill` must not have; same syntax as `teaches_skill`.["enchanting"]
item_levelquerystringItem level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.60..
required_levelquerystringRequired level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...60
dpsquerystringWeapon damage per second. Decimal range `lo..hi`, `lo..` or `..hi`; a single value means equality.50..
speedquerystringWeapon speed. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality...2s
armorquerystringArmor. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.500..
damage_minquerystringMinimum weapon damage. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.100..
damage_maxquerystringMaximum weapon damage. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...300
sell_pricequerystringSell price (copper or `1g50s25c`). Money range `lo..hi`, `lo..` or `..hi` in copper or `1g50s25c`; a single value means equality.1g..
buy_pricequerystringBuy price (copper or `1g50s25c`). Money range `lo..hi`, `lo..` or `..hi` in copper or `1g50s25c`; a single value means equality...50s
stack_sizequerystringStack size. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.20..
container_slotsquerystringContainer slots. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.16..
schoolqueryarray of string | integerWeapon damage school. Values are keys or numbers of the enum `school` (`/api/v1/enums/school`); repeat the parameter or separate values with commas (at most 32). `school_mode` (`any` or `all`, default `any`) combines them; `school_not` excludes values.["fire"]
school_modequerystring
one of any, all
How the values of `school` combine.all
school_notqueryarray of string | integerValues that `school` must not have; same syntax as `school`.["fire"]
statusquerystring
one of complete, partial, missing, all
Data completeness: `complete` (default), `partial`, `missing`, `all`.all
includequerystring
one of facets
`facets` adds facet counts (API only).facets
sortquerystring | stringSort key, `-` prefix for descending; `stat.<key>` sorts by a stat. Every sort ends with `id` as the tiebreaker.-item_level
pagequeryinteger1-based page.2
per_pagequeryintegerRows per page, 1 to 200 (default 50).100
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
One page of items
ListResponse_ItemSummary
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/items?quality=epic&slot=2hweapon&sort=-dps&per_page=5'
Example response (sample data)
{
  "data": [
    {
      "api_url": "/api/v1/items/12784",
      "bonding": {
        "key": "on_equip",
        "label": "Binds when equipped",
        "value": 2
      },
      "buy_price": {
        "copper": 382142
      },
      "class": {
        "key": "weapon",
        "label": "Weapon",
        "value": 2
      },
      "icon": {
        "fdid": 132400,
        "name": "inv_axe_09",
        "urls": {
          "36": "/icons/b33a70d94a8dacc6.webp",
          "64": "/icons/b33a70d94a8dac94.webp"
        }
      },
      "id": 12784,
      "inventory_type": {
        "key": "2hweapon",
        "label": "Two-Hand",
        "value": 17
      },
      "item_level": 63,
      "name": "Arcanite Reaper",
      "quality": {
        "key": "rare",
        "label": "Rare",
        "value": 3
      },
      "required_level": 58,
      "sell_price": {
        "copper": 76428
      },
      "socket_count": 0,
      "stats": [
        {
          "amount": 13,
          "stat": {
            "key": "strength",
            "label": "Strength",
            "value": 4
          }
        },
        {
          "amount": 13,
          "stat": {
            "key": "stamina",
            "label": "Stamina",
            "value": 7
          }
        }
      ],
      "status": "complete",
      "subclass": {
        "key": "weapon.axe_2h",
        "label": "Two-Handed Axes",
        "value": 513
      },
      "url": "/items/12784/arcanite-reaper",
      "weapon": {
        "dps": 53.8,
        "max": 256,
        "min": 153,
        "speed_ms": 3800
      }
    },
    {
      "api_url": "/api/v1/items/19019",
      "bonding": {
        "key": "on_acquire",
        "label": "Binds when picked up",
        "value": 1
      },
      "class": {
        "key": "weapon",
        "label": "Weapon",
        "value": 2
      },
      "icon": {
        "fdid": 135349,
        "name": "inv_sword_39",
        "urls": {
          "36": "/icons/4847a6b09f950aef.webp",
          "64": "/icons/4847a6b09f950abd.webp"
        }
      },
      "id": 19019,
      "inventory_type": {
        "key": "weapon",
        "label": "One-Hand",
        "value": 13
      },
      "item_level": 80,
      "name": "Thunderfury, Blessed Blade of the Windseeker",
      "quality": {
        "key": "legendary",
        "label": "Legendary",
        "value": 5
      },
      "required_level": 60,
      "sell_price": {
        "copper": 255355
      },
      "socket_count": 0,
      "stats": [
        {
          "amount": 5,
          "stat": {
            "key": "agility",
            "label": "Agility",
            "value": 3
          }
        },
        {
          "amount": 8,
          "stat": {
            "key": "stamina",
            "label": "Stamina",
            "value": 7
          }
        },
        {
          "amount": 8,
          "stat": {
            "key": "fire_resistance",
            "label": "Fire Resistance",
            "value": 51
          }
        },
        {
          "amount": 9,
          "stat": {
            "key": "nature_resistance",
            "label": "Nature Resistance",
            "value": 55
          }
        }
      ],
      "status": "complete",
      "subclass": {
        "key": "weapon.sword_1h",
        "label": "One-Handed Swords",
        "value": 519
      },
      "url": "/items/19019/thunderfury-blessed-blade-of-the-windseeker",
      "weapon": {
        "dps": 41.6,
        "max": 103,
        "min": 55,
        "speed_ms": 1900
      }
    }
  ],
  "ignored": [],
  "links": {
    "first": "/api/v1/items?page=1",
    "last": "/api/v1/items?page=1",
    "self": "/api/v1/items?page=1"
  },
  "page": {
    "page": 1,
    "pages": 1,
    "per_page": 50,
    "total": 2
  }
}

GET /api/v1/items/facets

Facet counts of an item search.

104 parameters
Parameters of /api/v1/items/facets
NameInTypeDescriptionExample
qquerystringText search (prefix match per word). At most 100 characters.arcanite
inquerystring
one of name, all
Where `q` searches: `name` (default) or `all` (adds flavour and spell texts).all
idqueryarray of integerExact ids (at most 100); with `sort=input` the given order is kept. Repeat the parameter or separate ids with commas; at most 100 ids.[12784,19019]
qualityqueryarray of string | integerQuality. Values are keys or numbers of the enum `item_quality` (`/api/v1/enums/item_quality`); repeat the parameter or separate values with commas (at most 32). `quality_mode` (`any` or `all`, default `any`) combines them; `quality_not` excludes values.["epic"]
quality_modequerystring
one of any, all
How the values of `quality` combine.all
quality_notqueryarray of string | integerValues that `quality` must not have; same syntax as `quality`.["epic"]
classqueryarray of string | integerItem class. Values are keys or numbers of the enum `item_class` (`/api/v1/enums/item_class`); repeat the parameter or separate values with commas (at most 32). `class_mode` (`any` or `all`, default `any`) combines them; `class_not` excludes values.["weapon"]
class_modequerystring
one of any, all
How the values of `class` combine.all
class_notqueryarray of string | integerValues that `class` must not have; same syntax as `class`.["weapon"]
subclassqueryarray of stringItem subclass as `<class_key>.<subclass_key>`. Values are keys or numbers of the enum `item_subclass` (`/api/v1/enums/item_subclass`); repeat the parameter or separate values with commas (at most 32). `subclass_mode` (`any` or `all`, default `any`) combines them; `subclass_not` excludes values.["weapon.sword_1h"]
subclass_modequerystring
one of any, all
How the values of `subclass` combine.all
subclass_notqueryarray of stringValues that `subclass` must not have; same syntax as `subclass`.["weapon.sword_1h"]
slotqueryarray of string | integerInventory type. Values are keys or numbers of the enum `inventory_type` (`/api/v1/enums/inventory_type`); repeat the parameter or separate values with commas (at most 32). `slot_mode` (`any` or `all`, default `any`) combines them; `slot_not` excludes values.["head"]
slot_modequerystring
one of any, all
How the values of `slot` combine.all
slot_notqueryarray of string | integerValues that `slot` must not have; same syntax as `slot`.["head"]
bondingqueryarray of string | integerBonding. Values are keys or numbers of the enum `bonding` (`/api/v1/enums/bonding`); repeat the parameter or separate values with commas (at most 32). `bonding_mode` (`any` or `all`, default `any`) combines them; `bonding_not` excludes values.["on_equip"]
bonding_modequerystring
one of any, all
How the values of `bonding` combine.all
bonding_notqueryarray of string | integerValues that `bonding` must not have; same syntax as `bonding`.["on_equip"]
materialqueryarray of string | integerMaterial. Values are keys or numbers of the enum `material` (`/api/v1/enums/material`); repeat the parameter or separate values with commas (at most 32). `material_mode` (`any` or `all`, default `any`) combines them; `material_not` excludes values.["metal"]
material_modequerystring
one of any, all
How the values of `material` combine.all
material_notqueryarray of string | integerValues that `material` must not have; same syntax as `material`.["metal"]
socket_colorqueryarray of string | integerHas a socket of this colour. Values are keys or numbers of the enum `socket_color` (`/api/v1/enums/socket_color`); repeat the parameter or separate values with commas (at most 32). `socket_color_mode` (`any` or `all`, default `any`) combines them; `socket_color_not` excludes values.["red"]
socket_color_modequerystring
one of any, all
How the values of `socket_color` combine.all
socket_color_notqueryarray of string | integerValues that `socket_color` must not have; same syntax as `socket_color`.["red"]
bag_familyqueryarray of string | integerBag family. Values are keys or numbers of the enum `bag_family` (`/api/v1/enums/bag_family`); repeat the parameter or separate values with commas (at most 32). `bag_family_mode` (`any`, `all` or `exact`, default `any`) combines them; `bag_family_not` excludes values.["arrows"]
bag_family_modequerystring
one of any, all, exact
How the values of `bag_family` combine.exact
bag_family_notqueryarray of string | integerValues that `bag_family` must not have; same syntax as `bag_family`.["arrows"]
armor_typequeryarray of stringShorthand for `subclass` within armor (`plate`). Values are keys or numbers of the enum `item_subclass` (`/api/v1/enums/item_subclass`); repeat the parameter or separate values with commas (at most 32). `armor_type_mode` (`any` or `all`, default `any`) combines them; `armor_type_not` excludes values.["plate"]
armor_type_modequerystring
one of any, all
How the values of `armor_type` combine.all
armor_type_notqueryarray of stringValues that `armor_type` must not have; same syntax as `armor_type`.["plate"]
weapon_typequeryarray of stringShorthand for `subclass` within weapons (`sword_1h`). Values are keys or numbers of the enum `item_subclass` (`/api/v1/enums/item_subclass`); repeat the parameter or separate values with commas (at most 32). `weapon_type_mode` (`any` or `all`, default `any`) combines them; `weapon_type_not` excludes values.["sword_1h"]
weapon_type_modequerystring
one of any, all
How the values of `weapon_type` combine.all
weapon_type_notqueryarray of stringValues that `weapon_type` must not have; same syntax as `weapon_type`.["sword_1h"]
class_usablequeryarray of stringUsable by this class (no restriction, or one including it). Values are keys or numbers of the enum `class` (`/api/v1/enums/class`); repeat the parameter or separate values with commas (at most 32). `class_usable_mode` (`any`, `all` or `exact`, default `any`) combines them; `class_usable_not` excludes values.["warrior"]
class_usable_modequerystring
one of any, all, exact
How the values of `class_usable` combine.exact
class_usable_notqueryarray of stringValues that `class_usable` must not have; same syntax as `class_usable`.["warrior"]
racequeryarray of stringUsable by this race. Values are keys or numbers of the enum `race` (`/api/v1/enums/race`); repeat the parameter or separate values with commas (at most 32). `race_mode` (`any`, `all` or `exact`, default `any`) combines them; `race_not` excludes values.["human"]
race_modequerystring
one of any, all, exact
How the values of `race` combine.exact
race_notqueryarray of stringValues that `race` must not have; same syntax as `race`.["human"]
skillqueryarray of stringRequired profession. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `skill_mode` (`any` or `all`, default `any`) combines them; `skill_not` excludes values.["blacksmithing"]
skill_modequerystring
one of any, all
How the values of `skill` combine.all
skill_notqueryarray of stringValues that `skill` must not have; same syntax as `skill`.["blacksmithing"]
skill_rankquerystringRequired profession rank. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...300
factionqueryarray of integerRequired reputation faction id. Values are ids; repeat the parameter or separate values with commas (at most 32). `faction_mode` (`any` or `all`, default `any`) combines them; `faction_not` excludes values.["529"]
faction_modequerystring
one of any, all
How the values of `faction` combine.all
faction_notqueryarray of integerValues that `faction` must not have; same syntax as `faction`.["529"]
standingquerystringRequired standing (0 hated .. 7 exalted). Range `lo..hi`, `lo..` or `..hi`; a single value means equality.5..
pvp_rankquerystringRequired PvP rank. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.10..
statqueryarray of string | integerItem has these stats (default mode `all`; `stat_mode=any`). Values are keys or numbers of the enum `item_mod` (`/api/v1/enums/item_mod`); repeat the parameter or separate values with commas (at most 32). `stat_mode` (`any` or `all`, default `all`) combines them; `stat_not` excludes values.["strength"]
stat_modequerystring
one of any, all
How the values of `stat` combine.any
stat_notqueryarray of string | integerValues that `stat` must not have; same syntax as `stat`.["strength"]
stat.<key>querystringAmount of one stat (`stat.strength=10..`). Range `lo..hi`, `lo..` or `..hi`; a single value means equality.10..
triggerqueryarray of string | integerItem has a spell with this trigger. Values are keys or numbers of the enum `item_trigger` (`/api/v1/enums/item_trigger`); repeat the parameter or separate values with commas (at most 32). `trigger_mode` (`any` or `all`, default `any`) combines them; `trigger_not` excludes values.["use"]
trigger_modequerystring
one of any, all
How the values of `trigger` combine.all
trigger_notqueryarray of string | integerValues that `trigger` must not have; same syntax as `trigger`.["use"]
spell_effqueryarray of stringThe `eff` clause syntax applied to the item's spells. Repeatable, at most 8. The effect is a `spell_effect` or `aura_type` key (prefix `effect.` or `aura.` when a key is in both or for numbers); `misc` takes a number or a key decoded by the effect's misc role; `value` is a decimal range at level 60; `target` a `target` key.["mod_damage_done"]
spell_triggerqueryarray of string | integerRestricts `spell_eff` to spells with this trigger. Values are keys or numbers of the enum `item_trigger` (`/api/v1/enums/item_trigger`); repeat the parameter or separate values with commas (at most 32). `spell_trigger_mode` (`any` or `all`, default `any`) combines them; `spell_trigger_not` excludes values.["use"]
spell_trigger_modequerystring
one of any, all
How the values of `spell_trigger` combine.all
spell_trigger_notqueryarray of string | integerValues that `spell_trigger` must not have; same syntax as `spell_trigger`.["use"]
flagqueryarray of string | stringItem flag bits as `item_flagsN.key` or `N:bit` (default mode `all`); `flag_not` for must-be-clear. Repeat the parameter or separate values with commas (at most 32); unnamed bits are `<word>:<bit>` (words 0 to 4); `flag_mode` is `any` or `all` (default `all`).["item_flags0.conjured"]
flag_modequerystring
one of any, all
How the values of `flag` combine.any
flag_notqueryarray of string | stringValues that `flag` must not have; same syntax as `flag`.["item_flags0.conjured"]
setquerystringMember of this set id, `any` set or `none`.any
usequeryinteger
one of 0, 1
Has an on-use spell. `1` or `0`.1
equipqueryinteger
one of 0, 1
Has an equip spell. `1` or `0`.1
procqueryinteger
one of 0, 1
Has a chance-on-hit spell. `1` or `0`.1
learnqueryinteger
one of 0, 1
Teaches a spell. `1` or `0`.1
socketsqueryinteger
one of 0, 1
Has sockets. `1` or `0`.1
uniquequeryinteger
one of 0, 1
Is unique. `1` or `0`.1
has_iconqueryinteger
one of 0, 1
Has an icon. `1` or `0`.1
starts_questqueryinteger
one of 0, 1
Begins a quest. `1` or `0`.1
has_flavorqueryinteger
one of 0, 1
Has flavour text. `1` or `0`.1
limited_durationqueryinteger
one of 0, 1
Has a limited duration. `1` or `0`.1
bound_toqueryinteger
one of 0, 1
Is bound to an instance or zone. `1` or `0`.1
reagentqueryinteger
one of 0, 1
Is a reagent of some spell. `1` or `0`.1
crafted_byqueryarray of stringSkill line of a spell that creates the item. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `crafted_by_mode` (`any` or `all`, default `any`) combines them; `crafted_by_not` excludes values.["blacksmithing"]
crafted_by_modequerystring
one of any, all
How the values of `crafted_by` combine.all
crafted_by_notqueryarray of stringValues that `crafted_by` must not have; same syntax as `crafted_by`.["blacksmithing"]
reagent_for_skillqueryarray of stringUsed as a reagent by this profession. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `reagent_for_skill_mode` (`any` or `all`, default `any`) combines them; `reagent_for_skill_not` excludes values.["alchemy"]
reagent_for_skill_modequerystring
one of any, all
How the values of `reagent_for_skill` combine.all
reagent_for_skill_notqueryarray of stringValues that `reagent_for_skill` must not have; same syntax as `reagent_for_skill`.["alchemy"]
teaches_skillqueryarray of stringRecipe for this profession. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `teaches_skill_mode` (`any` or `all`, default `any`) combines them; `teaches_skill_not` excludes values.["enchanting"]
teaches_skill_modequerystring
one of any, all
How the values of `teaches_skill` combine.all
teaches_skill_notqueryarray of stringValues that `teaches_skill` must not have; same syntax as `teaches_skill`.["enchanting"]
item_levelquerystringItem level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.60..
required_levelquerystringRequired level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...60
dpsquerystringWeapon damage per second. Decimal range `lo..hi`, `lo..` or `..hi`; a single value means equality.50..
speedquerystringWeapon speed. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality...2s
armorquerystringArmor. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.500..
damage_minquerystringMinimum weapon damage. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.100..
damage_maxquerystringMaximum weapon damage. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...300
sell_pricequerystringSell price (copper or `1g50s25c`). Money range `lo..hi`, `lo..` or `..hi` in copper or `1g50s25c`; a single value means equality.1g..
buy_pricequerystringBuy price (copper or `1g50s25c`). Money range `lo..hi`, `lo..` or `..hi` in copper or `1g50s25c`; a single value means equality...50s
stack_sizequerystringStack size. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.20..
container_slotsquerystringContainer slots. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.16..
schoolqueryarray of string | integerWeapon damage school. Values are keys or numbers of the enum `school` (`/api/v1/enums/school`); repeat the parameter or separate values with commas (at most 32). `school_mode` (`any` or `all`, default `any`) combines them; `school_not` excludes values.["fire"]
school_modequerystring
one of any, all
How the values of `school` combine.all
school_notqueryarray of string | integerValues that `school` must not have; same syntax as `school`.["fire"]
statusquerystring
one of complete, partial, missing, all
Data completeness: `complete` (default), `partial`, `missing`, `all`.all
includequerystring
one of facets
`facets` adds facet counts (API only).facets
sortquerystring | stringSort key, `-` prefix for descending; `stat.<key>` sorts by a stat. Every sort ends with `id` as the tiebreaker.-item_level
pagequeryinteger1-based page.2
per_pagequeryintegerRows per page, 1 to 200 (default 50).100
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
Facet counts for the filters
DataResponse_Facets
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/items/facets?quality=epic'

GET /api/v1/items/{id}

One item (partial and missing included).

3 parameters
Parameters of /api/v1/items/{id}
NameInTypeDescriptionExample
id requiredpathinteger (int32)Item id
includequerystring`raw` adds the raw client rows (`raw: [RawRow]`).raw
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
The item
ItemResponse_ItemDetail
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
404
No such item
Problem
curl -s 'https://forever.marni.ac/api/v1/items/12784'
Example response (sample data)
{
  "data": {
    "api_url": "/api/v1/items/12784",
    "bag_family": [],
    "bonding": {
      "key": "on_equip",
      "label": "Binds when equipped",
      "value": 2
    },
    "buy_price": {
      "copper": 382142
    },
    "class": {
      "key": "weapon",
      "label": "Weapon",
      "value": 2
    },
    "created_by": [
      {
        "api_url": "/api/v1/spells/16994",
        "icon": {
          "fdid": 132400,
          "name": "inv_axe_09",
          "urls": {
            "36": "/icons/b33a70d94a8dacc6.webp",
            "64": "/icons/b33a70d94a8dac94.webp"
          }
        },
        "id": 16994,
        "name": "Arcanite Reaper",
        "status": "complete",
        "url": "/spells/16994/arcanite-reaper"
      }
    ],
    "created_by_groups": [
      {
        "skill_line": {
          "api_url": "/api/v1/skill-lines/164",
          "icon": {
            "fdid": 136235,
            "name": "trade_blacksmithing",
            "urls": {
              "36": "/icons/dc46eeaf2b5e7bb1.webp",
              "64": "/icons/dc46eeaf2b5e7be3.webp"
            }
          },
          "id": 164,
          "name": "Blacksmithing",
          "url": "/skill-lines/164/blacksmithing"
        },
        "spells": [
          {
            "min_rank": 300,
            "spell": {
              "api_url": "/api/v1/spells/16994",
              "icon": {
                "fdid": 132400,
                "name": "inv_axe_09",
                "urls": {
                  "36": "/icons/b33a70d94a8dacc6.webp",
                  "64": "/icons/b33a70d94a8dac94.webp"
                }
              },
              "id": 16994,
              "name": "Arcanite Reaper",
              "status": "complete",
              "url": "/spells/16994/arcanite-reaper"
            },
            "trivial_high": 320,
            "trivial_low": 300
          }
        ]
      }
    ],
    "flags": [],
    "icon": {
      "fdid": 132400,
      "name": "inv_axe_09",
      "urls": {
        "36": "/icons/b33a70d94a8dacc6.webp",
        "64": "/icons/b33a70d94a8dac94.webp"
      }
    },
    "id": 12784,
    "inventory_type": {
      "key": "2hweapon",
      "label": "Two-Hand",
      "value": 17
    },
    "item_level": 63,
    "material": {
      "key": "metal",
      "label": "Metal",
      "value": 1
    },
    "name": "Arcanite Reaper",
    "notes": [],
    "quality": {
      "key": "rare",
      "label": "Rare",
      "value": 3
    },
    "reagent_for": [],
    "reagent_for_groups": [],
    "referenced_by": [],
    "required_level": 58,
    "requirements": {
      "class_mask": 0,
      "classes": [],
      "level": 58,
      "race_mask": 0,
      "races": []
    },
    "sell_price": {
      "copper": 76428
    },
    "shares_appearance_with": [],
    "sheathe": {
      "key": "main_hand",
      "label": "Main Hand",
      "value": 1
    },
    "slug": "arcanite-reaper",
    "sockets": [],
    "spells": [],
    "stats": [
      {
        "amount": 13,
        "display": "primary",
        "stat": {
          "key": "strength",
          "label": "Strength",
          "value": 4
        },
        "text": "+13 Strength"
      },
      {
        "amount": 13,
        "display": "primary",
        "stat": {
          "key": "stamina",
          "label": "Stamina",
          "value": 7
        },
        "text": "+13 Stamina"
      }
    ],
    "status": "complete",
    "subclass": {
      "key": "weapon.axe_2h",
      "label": "Two-Handed Axes",
      "value": 513
    },
    "teaches": [],
    "tool_for": [],
    "tooltip": {
      "lines": [
        {
          "left": [
            {
              "text": "Arcanite Reaper",
              "type": "text"
            }
          ],
          "style": {
            "quality": 3,
            "type": "title"
          }
        },
        {
          "left": [
            {
              "text": "Binds when equipped",
              "type": "text"
            }
          ],
          "style": {
            "type": "normal"
          }
        },
        {
          "left": [
            {
              "text": "Two-Hand",
              "type": "text"
            }
          ],
          "right": [
            {
              "text": "Axe",
              "type": "text"
            }
          ],
          "style": {
            "type": "normal"
          }
        },
        {
          "left": [
            {
              "text": "153 - 256 Damage",
              "type": "text"
            }
          ],
          "right": [
            {
              "text": "Speed 3.80",
              "type": "text"
            }
          ],
          "style": {
            "type": "normal"
          }
        },
        {
          "left": [
            {
              "text": "(53.8 damage per second)",
              "type": "text"
            }
          ],
          "style": {
            "type": "normal"
          }
        },
        {
          "left": [
            {
              "text": "+13 Strength",
              "type": "text"
            }
          ],
          "style": {
            "type": "normal"
          }
        },
        {
          "left": [
            {
              "text": "+13 Stamina",
              "type": "text"
            }
          ],
          "style": {
            "type": "normal"
          }
        },
        {
          "left": [
            {
              "text": "Requires Level 58",
              "type": "text"
            }
          ],
          "style": {
            "type": "requirement"
          }
        },
        {
          "left": [
            {
              "text": "Sell Price: ",
              "type": "text"
            },
            {
              "copper": 76428,
              "type": "money"
            }
          ],
          "style": {
            "type": "normal"
          }
        }
      ]
    },
    "url": "/items/12784/arcanite-reaper",
    "weapon": {
      "dps": 53.8,
      "max": 256,
      "min": 153,
      "quality_modifier": 0.0,
      "school": {
        "key": "physical",
        "label": "Physical",
        "value": 1
      },
      "source_table": "ItemDamageTwoHand",
      "speed_ms": 3800,
      "table_dps": 53.95,
      "verified": true
    }
  }
}

GET /api/v1/meta

The dataset metadata plus the server build id.

1 parameter
Parameters of /api/v1/meta
NameInTypeDescriptionExample
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
Dataset metadata
MetaResponse
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/meta'

GET /api/v1/openapi.json

The OpenAPI 3.1 document.

1 parameter
Parameters of /api/v1/openapi.json
NameInTypeDescriptionExample
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
The OpenAPI 3.1 document
object
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/openapi.json'

GET /api/v1/skill-lines

Skill lines (unpaginated), optionally filtered by category and class.

3 parameters
Parameters of /api/v1/skill-lines
NameInTypeDescriptionExample
categoryquerystringSkill line category (`skill_category` key or value: `class`, `profession`, ...).profession
classquerystringClass key, slug or id: lines of that class.mage
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
Every matching skill line
DataResponse_Vec_SkillLineRef
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/skill-lines?category=profession'
Example response (sample data)
{
  "data": [
    {
      "api_url": "/api/v1/skill-lines/8",
      "icon": {
        "fdid": 135810,
        "name": "spell_fire_firebolt02",
        "urls": {
          "36": "/icons/322dd9bad8b67c9c.webp",
          "64": "/icons/322dd9bad8b67cce.webp"
        }
      },
      "id": 8,
      "name": "Fire",
      "url": "/skill-lines/8/fire"
    },
    {
      "api_url": "/api/v1/skill-lines/164",
      "icon": {
        "fdid": 136235,
        "name": "trade_blacksmithing",
        "urls": {
          "36": "/icons/dc46eeaf2b5e7bb1.webp",
          "64": "/icons/dc46eeaf2b5e7be3.webp"
        }
      },
      "id": 164,
      "name": "Blacksmithing",
      "url": "/skill-lines/164/blacksmithing"
    }
  ]
}

GET /api/v1/skill-lines/{id}

One skill line with its abilities.

2 parameters
Parameters of /api/v1/skill-lines/{id}
NameInTypeDescriptionExample
id requiredpathinteger (int32)Skill line id
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
The skill line
ItemResponse_SkillLineDetail
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
404
No such skill line
Problem
curl -s 'https://forever.marni.ac/api/v1/skill-lines/8'
Example response (sample data)
{
  "data": {
    "abilities": [
      {
        "acquire": {
          "key": "learned",
          "label": "Learned",
          "value": 0
        },
        "level": 1,
        "min_rank": 1,
        "rank": {
          "count": 12,
          "group": 133,
          "highest": false,
          "number": 1
        },
        "spell": {
          "api_url": "/api/v1/spells/133",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 133,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 1",
          "url": "/spells/133/fireball"
        },
        "trivial_high": 0,
        "trivial_low": 0
      },
      {
        "acquire": {
          "key": "learned",
          "label": "Learned",
          "value": 0
        },
        "level": 6,
        "min_rank": 1,
        "rank": {
          "count": 12,
          "group": 133,
          "highest": false,
          "number": 2
        },
        "spell": {
          "api_url": "/api/v1/spells/143",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 143,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 2",
          "url": "/spells/143/fireball"
        },
        "trivial_high": 0,
        "trivial_low": 0
      },
      {
        "acquire": {
          "key": "learned",
          "label": "Learned",
          "value": 0
        },
        "level": 12,
        "min_rank": 1,
        "rank": {
          "count": 12,
          "group": 133,
          "highest": false,
          "number": 3
        },
        "spell": {
          "api_url": "/api/v1/spells/145",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 145,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 3",
          "url": "/spells/145/fireball"
        },
        "trivial_high": 0,
        "trivial_low": 0
      }
    ],
    "api_url": "/api/v1/skill-lines/8",
    "category": {
      "key": "class",
      "label": "Class",
      "value": 7
    },
    "class_mask": 128,
    "classes": [
      {
        "api_url": "/api/v1/classes/mage",
        "color": "#3fc7eb",
        "icon": {
          "fdid": 626001,
          "name": "classicon_mage",
          "urls": {
            "36": "/icons/e51e286ba9a5d393.webp",
            "64": "/icons/e51e286ba9a5d3c1.webp"
          }
        },
        "id": 8,
        "key": "mage",
        "name": "Mage",
        "url": "/classes/mage"
      }
    ],
    "description": "Mage fire spells.",
    "icon": {
      "fdid": 135810,
      "name": "spell_fire_firebolt02",
      "urls": {
        "36": "/icons/322dd9bad8b67c9c.webp",
        "64": "/icons/322dd9bad8b67cce.webp"
      }
    },
    "id": 8,
    "name": "Fire",
    "races": [],
    "slug": "fire",
    "url": "/skill-lines/8/fire"
  }
}

GET /api/v1/spells

Spell search.

113 parameters
Parameters of /api/v1/spells
NameInTypeDescriptionExample
qquerystringText search (prefix match per word). At most 100 characters.fireball
inquerystring
one of name, all
Where `q` searches: `name` (name and rank, default) or `all` (adds descriptions).all
idqueryarray of integerExact ids (at most 100); with `sort=input` the given order is kept. Repeat the parameter or separate ids with commas; at most 100 ids.[133,116]
classqueryarray of stringClass of the spell. Values are keys or numbers of the enum `class` (`/api/v1/enums/class`); repeat the parameter or separate values with commas (at most 32). `class_mode` (`any`, `all` or `exact`, default `any`) combines them; `class_not` excludes values.["mage"]
class_modequerystring
one of any, all, exact
How the values of `class` combine.exact
class_notqueryarray of stringValues that `class` must not have; same syntax as `class`.["mage"]
racequeryarray of stringRace the spell is restricted to. Values are keys or numbers of the enum `race` (`/api/v1/enums/race`); repeat the parameter or separate values with commas (at most 32). `race_mode` (`any`, `all` or `exact`, default `any`) combines them; `race_not` excludes values.["night_elf"]
race_modequerystring
one of any, all, exact
How the values of `race` combine.exact
race_notqueryarray of stringValues that `race` must not have; same syntax as `race`.["night_elf"]
skillqueryarray of stringSkill line of the spell. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `skill_mode` (`any` or `all`, default `any`) combines them; `skill_not` excludes values.["fire"]
skill_modequerystring
one of any, all
How the values of `skill` combine.all
skill_notqueryarray of stringValues that `skill` must not have; same syntax as `skill`.["fire"]
skill_categoryqueryarray of string | integerCategory of the spell's skill line. Values are keys or numbers of the enum `skill_category` (`/api/v1/enums/skill_category`); repeat the parameter or separate values with commas (at most 32). `skill_category_mode` (`any` or `all`, default `any`) combines them; `skill_category_not` excludes values.["class"]
skill_category_modequerystring
one of any, all
How the values of `skill_category` combine.all
skill_category_notqueryarray of string | integerValues that `skill_category` must not have; same syntax as `skill_category`.["class"]
acquirequeryarray of string | integerHow the spell is learned. Values are keys or numbers of the enum `skill_acquire` (`/api/v1/enums/skill_acquire`); repeat the parameter or separate values with commas (at most 32). `acquire_mode` (`any` or `all`, default `any`) combines them; `acquire_not` excludes values.["learned_on_skill_value"]
acquire_modequerystring
one of any, all
How the values of `acquire` combine.all
acquire_notqueryarray of string | integerValues that `acquire` must not have; same syntax as `acquire`.["learned_on_skill_value"]
schoolqueryarray of string | integerSchool; `school_mode=exact` finds pure schools. Values are keys or numbers of the enum `school` (`/api/v1/enums/school`); repeat the parameter or separate values with commas (at most 32). `school_mode` (`any`, `all` or `exact`, default `any`) combines them; `school_not` excludes values.["fire"]
school_modequerystring
one of any, all, exact
How the values of `school` combine.exact
school_notqueryarray of string | integerValues that `school` must not have; same syntax as `school`.["fire"]
effectqueryarray of string | integerSpell has an effect of this type. Values are keys or numbers of the enum `spell_effect` (`/api/v1/enums/spell_effect`); repeat the parameter or separate values with commas (at most 32). `effect_mode` (`any` or `all`, default `any`) combines them; `effect_not` excludes values.["school_damage"]
effect_modequerystring
one of any, all
How the values of `effect` combine.all
effect_notqueryarray of string | integerValues that `effect` must not have; same syntax as `effect`.["school_damage"]
auraqueryarray of string | integerSpell has an aura of this type. Values are keys or numbers of the enum `aura_type` (`/api/v1/enums/aura_type`); repeat the parameter or separate values with commas (at most 32). `aura_mode` (`any` or `all`, default `any`) combines them; `aura_not` excludes values.["periodic_damage"]
aura_modequerystring
one of any, all
How the values of `aura` combine.all
aura_notqueryarray of string | integerValues that `aura` must not have; same syntax as `aura`.["periodic_damage"]
effqueryarray of stringEffect clause `<effect_or_aura>[:misc=<v>][:value=<lo>..<hi>][:target=<t>]`; repeatable, clauses are ANDed, each binds to one effect. Repeatable, at most 8. The effect is a `spell_effect` or `aura_type` key (prefix `effect.` or `aura.` when a key is in both or for numbers); `misc` takes a number or a key decoded by the effect's misc role; `value` is a decimal range at level 60; `target` a `target` key.["mod_stat:misc=intellect"]
mechanicqueryarray of string | integerMechanic. Values are keys or numbers of the enum `mechanic` (`/api/v1/enums/mechanic`); repeat the parameter or separate values with commas (at most 32). `mechanic_mode` (`any` or `all`, default `any`) combines them; `mechanic_not` excludes values.["snare"]
mechanic_modequerystring
one of any, all
How the values of `mechanic` combine.all
mechanic_notqueryarray of string | integerValues that `mechanic` must not have; same syntax as `mechanic`.["snare"]
dispelqueryarray of string | integerDispel type. Values are keys or numbers of the enum `dispel` (`/api/v1/enums/dispel`); repeat the parameter or separate values with commas (at most 32). `dispel_mode` (`any` or `all`, default `any`) combines them; `dispel_not` excludes values.["magic"]
dispel_modequerystring
one of any, all
How the values of `dispel` combine.all
dispel_notqueryarray of string | integerValues that `dispel` must not have; same syntax as `dispel`.["magic"]
power_typequeryarray of string | integerPower type of the cost. Values are keys or numbers of the enum `power_type` (`/api/v1/enums/power_type`); repeat the parameter or separate values with commas (at most 32). `power_type_mode` (`any` or `all`, default `any`) combines them; `power_type_not` excludes values.["mana"]
power_type_modequerystring
one of any, all
How the values of `power_type` combine.all
power_type_notqueryarray of string | integerValues that `power_type` must not have; same syntax as `power_type`.["mana"]
familyqueryarray of string | integerSpell family (SpellClassSet). Values are keys or numbers of the enum `spell_family` (`/api/v1/enums/spell_family`); repeat the parameter or separate values with commas (at most 32). `family_mode` (`any` or `all`, default `any`) combines them; `family_not` excludes values.["mage"]
family_modequerystring
one of any, all
How the values of `family` combine.all
family_notqueryarray of string | integerValues that `family` must not have; same syntax as `family`.["mage"]
categoryqueryarray of integerShared cooldown category id. Values are ids; repeat the parameter or separate values with commas (at most 32). `category_mode` (`any` or `all`, default `any`) combines them; `category_not` excludes values.["11"]
category_modequerystring
one of any, all
How the values of `category` combine.all
category_notqueryarray of integerValues that `category` must not have; same syntax as `category`.["11"]
dmg_classqueryarray of string | integerDamage class. Values are keys or numbers of the enum `dmg_class` (`/api/v1/enums/dmg_class`); repeat the parameter or separate values with commas (at most 32). `dmg_class_mode` (`any` or `all`, default `any`) combines them; `dmg_class_not` excludes values.["magic"]
dmg_class_modequerystring
one of any, all
How the values of `dmg_class` combine.all
dmg_class_notqueryarray of string | integerValues that `dmg_class` must not have; same syntax as `dmg_class`.["magic"]
preventionqueryarray of string | integerPrevention type. Values are keys or numbers of the enum `prevention` (`/api/v1/enums/prevention`); repeat the parameter or separate values with commas (at most 32). `prevention_mode` (`any` or `all`, default `any`) combines them; `prevention_not` excludes values.["silence"]
prevention_modequerystring
one of any, all
How the values of `prevention` combine.all
prevention_notqueryarray of string | integerValues that `prevention` must not have; same syntax as `prevention`.["silence"]
kindqueryarray of string | integerAura classification of aura-bearing spells (`buff`, `debuff`, `passive`). Values are keys or numbers of the enum `aura_kind` (`/api/v1/enums/aura_kind`); repeat the parameter or separate values with commas (at most 32). `kind_mode` (`any` or `all`, default `any`) combines them; `kind_not` excludes values.["buff"]
kind_modequerystring
one of any, all
How the values of `kind` combine.all
kind_notqueryarray of string | integerValues that `kind` must not have; same syntax as `kind`.["buff"]
targetqueryarray of string | integerAn implicit target of any effect. Values are keys or numbers of the enum `target` (`/api/v1/enums/target`); repeat the parameter or separate values with commas (at most 32). `target_mode` (`any` or `all`, default `any`) combines them; `target_not` excludes values.["unit_target_enemy"]
target_modequerystring
one of any, all
How the values of `target` combine.all
target_notqueryarray of string | integerValues that `target` must not have; same syntax as `target`.["unit_target_enemy"]
formqueryarray of stringRequired shapeshift form. Values are keys or numbers of the enum `shapeshift_form` (`/api/v1/enums/shapeshift_form`); repeat the parameter or separate values with commas (at most 32). `form_mode` (`any` or `all`, default `any`) combines them; `form_not` excludes values.["bear_form"]
form_modequerystring
one of any, all
How the values of `form` combine.all
form_notqueryarray of stringValues that `form` must not have; same syntax as `form`.["bear_form"]
equipped_classqueryarray of string | integerRequired equipped item class. Values are keys or numbers of the enum `item_class` (`/api/v1/enums/item_class`); repeat the parameter or separate values with commas (at most 32). `equipped_class_mode` (`any` or `all`, default `any`) combines them; `equipped_class_not` excludes values.["weapon"]
equipped_class_modequerystring
one of any, all
How the values of `equipped_class` combine.all
equipped_class_notqueryarray of string | integerValues that `equipped_class` must not have; same syntax as `equipped_class`.["weapon"]
proc_flagsqueryarray of string | stringProc trigger flags (default mode `all`). Repeat the parameter or separate values with commas (at most 32); unnamed bits are `<word>:<bit>` (words 0 to 1); `proc_flags_mode` is `any` or `all` (default `all`).["proc_flags.deal_melee_swing"]
proc_flags_modequerystring
one of any, all
How the values of `proc_flags` combine.any
proc_flags_notqueryarray of string | stringValues that `proc_flags` must not have; same syntax as `proc_flags`.["proc_flags.deal_melee_swing"]
attrqueryarray of string | stringAttribute bits as `spell_attrN.key` or `N:bit` (default mode `all`); `attr_not` for must-be-clear. Repeat the parameter or separate values with commas (at most 32); unnamed bits are `<word>:<bit>` (words 0 to 16); `attr_mode` is `any` or `all` (default `all`).["spell_attr0.passive"]
attr_modequerystring
one of any, all
How the values of `attr` combine.any
attr_notqueryarray of string | stringValues that `attr` must not have; same syntax as `attr`.["spell_attr0.passive"]
has_auraqueryinteger
one of 0, 1
Spell applies an aura. `1` or `0`.1
passivequeryinteger
one of 0, 1
Spell is flagged passive (`spell_attr0` passive; any spell). `1` or `0`.1
hiddenqueryinteger
one of 0, 1
Aura has no icon. `1` or `0`.0
channeledqueryinteger
one of 0, 1
Channeled spell. `1` or `0`.1
instantqueryinteger
one of 0, 1
Instant cast. `1` or `0`.1
has_reagentsqueryinteger
one of 0, 1
Spell needs reagents. `1` or `0`.1
has_cooldownqueryinteger
one of 0, 1
Spell has a cooldown or category cooldown. `1` or `0`.1
has_iconqueryinteger
one of 0, 1
Spell has an icon. `1` or `0`.1
talentqueryinteger
one of 0, 1
Spell is a talent rank. `1` or `0`.1
procqueryinteger
one of 0, 1
Spell has proc settings. `1` or `0`.1
focusqueryinteger
one of 0, 1
Spell requires a spell focus. `1` or `0`.1
has_triggersqueryinteger
one of 0, 1
Spell triggers other spells. `1` or `0`.1
triggeredqueryinteger
one of 0, 1
Spell is triggered by other spells. `1` or `0`.1
taught_by_itemqueryinteger
one of 0, 1
Spell is taught by an item. `1` or `0`.1
used_by_itemqueryinteger
one of 0, 1
Spell is carried by an item. `1` or `0`.1
set_bonusqueryinteger
one of 0, 1
Spell is an item set bonus. `1` or `0`.1
enchantqueryinteger
one of 0, 1
Spell applies an enchantment. `1` or `0`.1
playerqueryinteger
one of 0, 1
A player can have the spell. `1` or `0`.1
unknown_tokensqueryinteger
one of 0, 1
A rendered text has unresolved tokens. `1` or `0`.1
infinitequeryinteger
one of 0, 1
Permanent duration. `1` or `0`.1
levelquerystringSpell level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.50..60
base_levelquerystringBase level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...20
max_levelquerystringMax level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.60
cast_timequerystringCast time. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality...1.5s
durationquerystringDuration. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality.30m..
cooldownquerystringThe larger of cooldown and category cooldown. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality.1m..
category_cooldownquerystringCategory cooldown. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality.2m
gcdquerystringGlobal cooldown. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality.1500ms
min_rangequerystringMinimum range in yards. Range in yards `lo..hi`, `lo..` or `..hi` (optional `yd` suffix); a single value means equality.5..
max_rangequerystringMaximum range in yards. Range in yards `lo..hi`, `lo..` or `..hi` (optional `yd` suffix); a single value means equality.30..40
power_costquerystringFlat power cost. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...100
proc_chancequerystringProc chance in percent. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.10..
ppmquerystringProcs per minute. Decimal range `lo..hi`, `lo..` or `..hi`; a single value means equality.1..
max_stacksquerystringMaximum stacks. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.5..
max_targetsquerystringMaximum targets. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.3..
effect_countquerystringNumber of effects. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.3
triggersqueryintegerSpell triggers this spell id.12654
reagentqueryintegerSpell uses this item as a reagent.2589
createsquerystringSpell creates this item, or `any` item.12784
ranksquerystring
one of all, highest, lowest
Which ranks of a rank group to list: `all` (API default), `highest` (HTML default), `lowest`.highest
statusquerystring
one of complete, partial, missing, all
Data completeness: `complete` (default), `partial`, `missing`, `all`.all
includequerystring
one of facets
`facets` adds facet counts (API only).facets
sortquerystring
one of relevance, name, -name, id, -id, level, -level, base_level, -base_level, max_level, -max_level, cast_time and 36 more
Sort key, `-` prefix for descending. Every sort ends with `id` as the tiebreaker.-level
pagequeryinteger1-based page.2
per_pagequeryintegerRows per page, 1 to 200 (default 50).100
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
One page of spells
ListResponse_SpellSummary
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/spells?school=fire&kind=debuff&per_page=5'
Example response (sample data)
{
  "data": [
    {
      "api_url": "/api/v1/spells/133",
      "aura_kind": {
        "key": "debuff",
        "label": "Debuff",
        "value": 2
      },
      "base_level": 1,
      "cast": {
        "channeled": false,
        "label": "1.5 sec cast",
        "ms": 1500,
        "next_melee": false
      },
      "classes": [
        {
          "api_url": "/api/v1/classes/mage",
          "color": "#3fc7eb",
          "icon": {
            "fdid": 626001,
            "name": "classicon_mage",
            "urls": {
              "36": "/icons/e51e286ba9a5d393.webp",
              "64": "/icons/e51e286ba9a5d3c1.webp"
            }
          },
          "id": 8,
          "key": "mage",
          "name": "Mage",
          "url": "/classes/mage"
        }
      ],
      "dispel": {
        "key": "magic",
        "label": "Magic",
        "value": 1
      },
      "duration": {
        "infinite": false,
        "ms": 4000
      },
      "effect_count": 2,
      "gcd_ms": 1500,
      "has_aura": true,
      "icon": {
        "fdid": 135812,
        "name": "spell_fire_flamebolt",
        "urls": {
          "36": "/icons/6e9ccd2dd74b74e2.webp",
          "64": "/icons/6e9ccd2dd74b74b0.webp"
        }
      },
      "id": 133,
      "is_player_spell": true,
      "is_talent": false,
      "level": 1,
      "max_level": 6,
      "max_range_yd": 35.0,
      "min_range_yd": 0.0,
      "name": "Fireball",
      "power": {
        "amount": 30,
        "power_type": {
          "key": "mana",
          "label": "Mana",
          "value": 0
        }
      },
      "rank": {
        "count": 12,
        "group": 133,
        "highest": false,
        "number": 1
      },
      "school_relevant": true,
      "schools": [
        {
          "key": "fire",
          "label": "Fire",
          "value": 4
        }
      ],
      "status": "complete",
      "subtext": "Rank 1",
      "url": "/spells/133/fireball"
    },
    {
      "api_url": "/api/v1/spells/10",
      "aura_kind": {
        "key": "debuff",
        "label": "Debuff",
        "value": 2
      },
      "cast": {
        "channeled": true,
        "label": "Channeled",
        "ms": 0,
        "next_melee": false
      },
      "classes": [
        {
          "api_url": "/api/v1/classes/mage",
          "color": "#3fc7eb",
          "icon": {
            "fdid": 626001,
            "name": "classicon_mage",
            "urls": {
              "36": "/icons/e51e286ba9a5d393.webp",
              "64": "/icons/e51e286ba9a5d3c1.webp"
            }
          },
          "id": 8,
          "key": "mage",
          "name": "Mage",
          "url": "/classes/mage"
        }
      ],
      "duration": {
        "infinite": false,
        "ms": 8000
      },
      "effect_count": 1,
      "has_aura": true,
      "icon": {
        "fdid": 135857,
        "name": "spell_frost_icestorm",
        "urls": {
          "36": "/icons/3e5d32c9376344b3.webp",
          "64": "/icons/3e5d32c9376344e1.webp"
        }
      },
      "id": 10,
      "is_player_spell": true,
      "is_talent": false,
      "name": "Blizzard",
      "school_relevant": true,
      "schools": [
        {
          "key": "frost",
          "label": "Frost",
          "value": 16
        }
      ],
      "status": "complete",
      "subtext": "Rank 1",
      "url": "/spells/10/blizzard"
    }
  ],
  "ignored": [],
  "links": {
    "first": "/api/v1/spells?page=1",
    "last": "/api/v1/spells?page=1",
    "self": "/api/v1/spells?page=1"
  },
  "page": {
    "page": 1,
    "pages": 1,
    "per_page": 50,
    "total": 2
  }
}

GET /api/v1/spells/facets

Facet counts of a spell search.

113 parameters
Parameters of /api/v1/spells/facets
NameInTypeDescriptionExample
qquerystringText search (prefix match per word). At most 100 characters.fireball
inquerystring
one of name, all
Where `q` searches: `name` (name and rank, default) or `all` (adds descriptions).all
idqueryarray of integerExact ids (at most 100); with `sort=input` the given order is kept. Repeat the parameter or separate ids with commas; at most 100 ids.[133,116]
classqueryarray of stringClass of the spell. Values are keys or numbers of the enum `class` (`/api/v1/enums/class`); repeat the parameter or separate values with commas (at most 32). `class_mode` (`any`, `all` or `exact`, default `any`) combines them; `class_not` excludes values.["mage"]
class_modequerystring
one of any, all, exact
How the values of `class` combine.exact
class_notqueryarray of stringValues that `class` must not have; same syntax as `class`.["mage"]
racequeryarray of stringRace the spell is restricted to. Values are keys or numbers of the enum `race` (`/api/v1/enums/race`); repeat the parameter or separate values with commas (at most 32). `race_mode` (`any`, `all` or `exact`, default `any`) combines them; `race_not` excludes values.["night_elf"]
race_modequerystring
one of any, all, exact
How the values of `race` combine.exact
race_notqueryarray of stringValues that `race` must not have; same syntax as `race`.["night_elf"]
skillqueryarray of stringSkill line of the spell. Values are keys or numbers of the enum `skill_line` (`/api/v1/enums/skill_line`); repeat the parameter or separate values with commas (at most 32). `skill_mode` (`any` or `all`, default `any`) combines them; `skill_not` excludes values.["fire"]
skill_modequerystring
one of any, all
How the values of `skill` combine.all
skill_notqueryarray of stringValues that `skill` must not have; same syntax as `skill`.["fire"]
skill_categoryqueryarray of string | integerCategory of the spell's skill line. Values are keys or numbers of the enum `skill_category` (`/api/v1/enums/skill_category`); repeat the parameter or separate values with commas (at most 32). `skill_category_mode` (`any` or `all`, default `any`) combines them; `skill_category_not` excludes values.["class"]
skill_category_modequerystring
one of any, all
How the values of `skill_category` combine.all
skill_category_notqueryarray of string | integerValues that `skill_category` must not have; same syntax as `skill_category`.["class"]
acquirequeryarray of string | integerHow the spell is learned. Values are keys or numbers of the enum `skill_acquire` (`/api/v1/enums/skill_acquire`); repeat the parameter or separate values with commas (at most 32). `acquire_mode` (`any` or `all`, default `any`) combines them; `acquire_not` excludes values.["learned_on_skill_value"]
acquire_modequerystring
one of any, all
How the values of `acquire` combine.all
acquire_notqueryarray of string | integerValues that `acquire` must not have; same syntax as `acquire`.["learned_on_skill_value"]
schoolqueryarray of string | integerSchool; `school_mode=exact` finds pure schools. Values are keys or numbers of the enum `school` (`/api/v1/enums/school`); repeat the parameter or separate values with commas (at most 32). `school_mode` (`any`, `all` or `exact`, default `any`) combines them; `school_not` excludes values.["fire"]
school_modequerystring
one of any, all, exact
How the values of `school` combine.exact
school_notqueryarray of string | integerValues that `school` must not have; same syntax as `school`.["fire"]
effectqueryarray of string | integerSpell has an effect of this type. Values are keys or numbers of the enum `spell_effect` (`/api/v1/enums/spell_effect`); repeat the parameter or separate values with commas (at most 32). `effect_mode` (`any` or `all`, default `any`) combines them; `effect_not` excludes values.["school_damage"]
effect_modequerystring
one of any, all
How the values of `effect` combine.all
effect_notqueryarray of string | integerValues that `effect` must not have; same syntax as `effect`.["school_damage"]
auraqueryarray of string | integerSpell has an aura of this type. Values are keys or numbers of the enum `aura_type` (`/api/v1/enums/aura_type`); repeat the parameter or separate values with commas (at most 32). `aura_mode` (`any` or `all`, default `any`) combines them; `aura_not` excludes values.["periodic_damage"]
aura_modequerystring
one of any, all
How the values of `aura` combine.all
aura_notqueryarray of string | integerValues that `aura` must not have; same syntax as `aura`.["periodic_damage"]
effqueryarray of stringEffect clause `<effect_or_aura>[:misc=<v>][:value=<lo>..<hi>][:target=<t>]`; repeatable, clauses are ANDed, each binds to one effect. Repeatable, at most 8. The effect is a `spell_effect` or `aura_type` key (prefix `effect.` or `aura.` when a key is in both or for numbers); `misc` takes a number or a key decoded by the effect's misc role; `value` is a decimal range at level 60; `target` a `target` key.["mod_stat:misc=intellect"]
mechanicqueryarray of string | integerMechanic. Values are keys or numbers of the enum `mechanic` (`/api/v1/enums/mechanic`); repeat the parameter or separate values with commas (at most 32). `mechanic_mode` (`any` or `all`, default `any`) combines them; `mechanic_not` excludes values.["snare"]
mechanic_modequerystring
one of any, all
How the values of `mechanic` combine.all
mechanic_notqueryarray of string | integerValues that `mechanic` must not have; same syntax as `mechanic`.["snare"]
dispelqueryarray of string | integerDispel type. Values are keys or numbers of the enum `dispel` (`/api/v1/enums/dispel`); repeat the parameter or separate values with commas (at most 32). `dispel_mode` (`any` or `all`, default `any`) combines them; `dispel_not` excludes values.["magic"]
dispel_modequerystring
one of any, all
How the values of `dispel` combine.all
dispel_notqueryarray of string | integerValues that `dispel` must not have; same syntax as `dispel`.["magic"]
power_typequeryarray of string | integerPower type of the cost. Values are keys or numbers of the enum `power_type` (`/api/v1/enums/power_type`); repeat the parameter or separate values with commas (at most 32). `power_type_mode` (`any` or `all`, default `any`) combines them; `power_type_not` excludes values.["mana"]
power_type_modequerystring
one of any, all
How the values of `power_type` combine.all
power_type_notqueryarray of string | integerValues that `power_type` must not have; same syntax as `power_type`.["mana"]
familyqueryarray of string | integerSpell family (SpellClassSet). Values are keys or numbers of the enum `spell_family` (`/api/v1/enums/spell_family`); repeat the parameter or separate values with commas (at most 32). `family_mode` (`any` or `all`, default `any`) combines them; `family_not` excludes values.["mage"]
family_modequerystring
one of any, all
How the values of `family` combine.all
family_notqueryarray of string | integerValues that `family` must not have; same syntax as `family`.["mage"]
categoryqueryarray of integerShared cooldown category id. Values are ids; repeat the parameter or separate values with commas (at most 32). `category_mode` (`any` or `all`, default `any`) combines them; `category_not` excludes values.["11"]
category_modequerystring
one of any, all
How the values of `category` combine.all
category_notqueryarray of integerValues that `category` must not have; same syntax as `category`.["11"]
dmg_classqueryarray of string | integerDamage class. Values are keys or numbers of the enum `dmg_class` (`/api/v1/enums/dmg_class`); repeat the parameter or separate values with commas (at most 32). `dmg_class_mode` (`any` or `all`, default `any`) combines them; `dmg_class_not` excludes values.["magic"]
dmg_class_modequerystring
one of any, all
How the values of `dmg_class` combine.all
dmg_class_notqueryarray of string | integerValues that `dmg_class` must not have; same syntax as `dmg_class`.["magic"]
preventionqueryarray of string | integerPrevention type. Values are keys or numbers of the enum `prevention` (`/api/v1/enums/prevention`); repeat the parameter or separate values with commas (at most 32). `prevention_mode` (`any` or `all`, default `any`) combines them; `prevention_not` excludes values.["silence"]
prevention_modequerystring
one of any, all
How the values of `prevention` combine.all
prevention_notqueryarray of string | integerValues that `prevention` must not have; same syntax as `prevention`.["silence"]
kindqueryarray of string | integerAura classification of aura-bearing spells (`buff`, `debuff`, `passive`). Values are keys or numbers of the enum `aura_kind` (`/api/v1/enums/aura_kind`); repeat the parameter or separate values with commas (at most 32). `kind_mode` (`any` or `all`, default `any`) combines them; `kind_not` excludes values.["buff"]
kind_modequerystring
one of any, all
How the values of `kind` combine.all
kind_notqueryarray of string | integerValues that `kind` must not have; same syntax as `kind`.["buff"]
targetqueryarray of string | integerAn implicit target of any effect. Values are keys or numbers of the enum `target` (`/api/v1/enums/target`); repeat the parameter or separate values with commas (at most 32). `target_mode` (`any` or `all`, default `any`) combines them; `target_not` excludes values.["unit_target_enemy"]
target_modequerystring
one of any, all
How the values of `target` combine.all
target_notqueryarray of string | integerValues that `target` must not have; same syntax as `target`.["unit_target_enemy"]
formqueryarray of stringRequired shapeshift form. Values are keys or numbers of the enum `shapeshift_form` (`/api/v1/enums/shapeshift_form`); repeat the parameter or separate values with commas (at most 32). `form_mode` (`any` or `all`, default `any`) combines them; `form_not` excludes values.["bear_form"]
form_modequerystring
one of any, all
How the values of `form` combine.all
form_notqueryarray of stringValues that `form` must not have; same syntax as `form`.["bear_form"]
equipped_classqueryarray of string | integerRequired equipped item class. Values are keys or numbers of the enum `item_class` (`/api/v1/enums/item_class`); repeat the parameter or separate values with commas (at most 32). `equipped_class_mode` (`any` or `all`, default `any`) combines them; `equipped_class_not` excludes values.["weapon"]
equipped_class_modequerystring
one of any, all
How the values of `equipped_class` combine.all
equipped_class_notqueryarray of string | integerValues that `equipped_class` must not have; same syntax as `equipped_class`.["weapon"]
proc_flagsqueryarray of string | stringProc trigger flags (default mode `all`). Repeat the parameter or separate values with commas (at most 32); unnamed bits are `<word>:<bit>` (words 0 to 1); `proc_flags_mode` is `any` or `all` (default `all`).["proc_flags.deal_melee_swing"]
proc_flags_modequerystring
one of any, all
How the values of `proc_flags` combine.any
proc_flags_notqueryarray of string | stringValues that `proc_flags` must not have; same syntax as `proc_flags`.["proc_flags.deal_melee_swing"]
attrqueryarray of string | stringAttribute bits as `spell_attrN.key` or `N:bit` (default mode `all`); `attr_not` for must-be-clear. Repeat the parameter or separate values with commas (at most 32); unnamed bits are `<word>:<bit>` (words 0 to 16); `attr_mode` is `any` or `all` (default `all`).["spell_attr0.passive"]
attr_modequerystring
one of any, all
How the values of `attr` combine.any
attr_notqueryarray of string | stringValues that `attr` must not have; same syntax as `attr`.["spell_attr0.passive"]
has_auraqueryinteger
one of 0, 1
Spell applies an aura. `1` or `0`.1
passivequeryinteger
one of 0, 1
Spell is flagged passive (`spell_attr0` passive; any spell). `1` or `0`.1
hiddenqueryinteger
one of 0, 1
Aura has no icon. `1` or `0`.0
channeledqueryinteger
one of 0, 1
Channeled spell. `1` or `0`.1
instantqueryinteger
one of 0, 1
Instant cast. `1` or `0`.1
has_reagentsqueryinteger
one of 0, 1
Spell needs reagents. `1` or `0`.1
has_cooldownqueryinteger
one of 0, 1
Spell has a cooldown or category cooldown. `1` or `0`.1
has_iconqueryinteger
one of 0, 1
Spell has an icon. `1` or `0`.1
talentqueryinteger
one of 0, 1
Spell is a talent rank. `1` or `0`.1
procqueryinteger
one of 0, 1
Spell has proc settings. `1` or `0`.1
focusqueryinteger
one of 0, 1
Spell requires a spell focus. `1` or `0`.1
has_triggersqueryinteger
one of 0, 1
Spell triggers other spells. `1` or `0`.1
triggeredqueryinteger
one of 0, 1
Spell is triggered by other spells. `1` or `0`.1
taught_by_itemqueryinteger
one of 0, 1
Spell is taught by an item. `1` or `0`.1
used_by_itemqueryinteger
one of 0, 1
Spell is carried by an item. `1` or `0`.1
set_bonusqueryinteger
one of 0, 1
Spell is an item set bonus. `1` or `0`.1
enchantqueryinteger
one of 0, 1
Spell applies an enchantment. `1` or `0`.1
playerqueryinteger
one of 0, 1
A player can have the spell. `1` or `0`.1
unknown_tokensqueryinteger
one of 0, 1
A rendered text has unresolved tokens. `1` or `0`.1
infinitequeryinteger
one of 0, 1
Permanent duration. `1` or `0`.1
levelquerystringSpell level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.50..60
base_levelquerystringBase level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...20
max_levelquerystringMax level. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.60
cast_timequerystringCast time. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality...1.5s
durationquerystringDuration. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality.30m..
cooldownquerystringThe larger of cooldown and category cooldown. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality.1m..
category_cooldownquerystringCategory cooldown. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality.2m
gcdquerystringGlobal cooldown. Time range `lo..hi`, `lo..` or `..hi` with suffixes `ms`, `s`, `m`, `h` (combinable from largest, `1m30s`); a bare number means seconds; a single value means equality.1500ms
min_rangequerystringMinimum range in yards. Range in yards `lo..hi`, `lo..` or `..hi` (optional `yd` suffix); a single value means equality.5..
max_rangequerystringMaximum range in yards. Range in yards `lo..hi`, `lo..` or `..hi` (optional `yd` suffix); a single value means equality.30..40
power_costquerystringFlat power cost. Range `lo..hi`, `lo..` or `..hi`; a single value means equality...100
proc_chancequerystringProc chance in percent. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.10..
ppmquerystringProcs per minute. Decimal range `lo..hi`, `lo..` or `..hi`; a single value means equality.1..
max_stacksquerystringMaximum stacks. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.5..
max_targetsquerystringMaximum targets. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.3..
effect_countquerystringNumber of effects. Range `lo..hi`, `lo..` or `..hi`; a single value means equality.3
triggersqueryintegerSpell triggers this spell id.12654
reagentqueryintegerSpell uses this item as a reagent.2589
createsquerystringSpell creates this item, or `any` item.12784
ranksquerystring
one of all, highest, lowest
Which ranks of a rank group to list: `all` (API default), `highest` (HTML default), `lowest`.highest
statusquerystring
one of complete, partial, missing, all
Data completeness: `complete` (default), `partial`, `missing`, `all`.all
includequerystring
one of facets
`facets` adds facet counts (API only).facets
sortquerystring
one of relevance, name, -name, id, -id, level, -level, base_level, -base_level, max_level, -max_level, cast_time and 36 more
Sort key, `-` prefix for descending. Every sort ends with `id` as the tiebreaker.-level
pagequeryinteger1-based page.2
per_pagequeryintegerRows per page, 1 to 200 (default 50).100
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
Facet counts for the filters
DataResponse_Facets
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
curl -s 'https://forever.marni.ac/api/v1/spells/facets?school=fire'

GET /api/v1/spells/{id}

One spell (stubs included).

3 parameters
Parameters of /api/v1/spells/{id}
NameInTypeDescriptionExample
id requiredpathinteger (int32)Spell id
includequerystring`raw` adds the raw client rows (`raw: [RawRow]`).raw
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
The spell
ItemResponse_SpellDetail
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
404
No such spell
Problem
curl -s 'https://forever.marni.ac/api/v1/spells/133'
Example response (sample data)
{
  "data": {
    "api_url": "/api/v1/spells/133",
    "attributes": [
      {
        "bit": 16,
        "key": "bit_16",
        "label": "Bit 16",
        "word": 0
      }
    ],
    "aura": {
      "hidden": false,
      "kind": {
        "key": "debuff",
        "label": "Debuff",
        "value": 2
      },
      "reason": "enemy_target:unit_target_enemy"
    },
    "aura_description": [
      {
        "text": "2",
        "type": "value"
      },
      {
        "text": " Fire damage every 2 seconds.",
        "type": "text"
      }
    ],
    "aura_description_raw": "$s2 Fire damage every $t2 seconds.",
    "cast": {
      "channeled": false,
      "label": "1.5 sec cast",
      "ms": 1500,
      "next_melee": false
    },
    "class_mask": 128,
    "class_mask_raw": [
      1,
      0,
      0,
      0
    ],
    "classes": [
      {
        "class": {
          "api_url": "/api/v1/classes/mage",
          "color": "#3fc7eb",
          "icon": {
            "fdid": 626001,
            "name": "classicon_mage",
            "urls": {
              "36": "/icons/e51e286ba9a5d393.webp",
              "64": "/icons/e51e286ba9a5d3c1.webp"
            }
          },
          "id": 8,
          "key": "mage",
          "name": "Mage",
          "url": "/classes/mage"
        },
        "source": "skill_line_ability"
      }
    ],
    "cooldowns": {
      "gcd_ms": 1500,
      "start_recovery_category": 133
    },
    "costs": [
      {
        "amount": 30,
        "label": "30 Mana",
        "power_type": {
          "key": "mana",
          "label": "Mana",
          "value": 0
        }
      }
    ],
    "description": [
      {
        "text": "Hurls a fiery ball that causes ",
        "type": "text"
      },
      {
        "text": "14 to 22",
        "type": "value"
      },
      {
        "text": " Fire damage and an additional ",
        "type": "text"
      },
      {
        "text": "4",
        "type": "value"
      },
      {
        "text": " Fire damage over 4 sec.",
        "type": "text"
      }
    ],
    "description_raw": "Hurls a fiery ball that causes $s1 Fire damage and an additional $o2 Fire damage over $d.",
    "dispel": {
      "key": "magic",
      "label": "Magic",
      "value": 1
    },
    "dmg_class": {
      "key": "magic",
      "label": "Magic",
      "value": 1
    },
    "duration": {
      "infinite": false,
      "label": "4 sec",
      "max_ms": 4000,
      "ms": 4000
    },
    "effects": [
      {
        "amplitude": 1.0,
        "attributes": [],
        "chain_amplitude": 1.0,
        "chain_targets": 0,
        "class_mask": [
          0,
          0,
          0,
          0
        ],
        "effect": {
          "key": "school_damage",
          "label": "School Damage",
          "value": 2
        },
        "index": 0,
        "item_type_raw": 0,
        "misc": [
          0,
          0
        ],
        "misc_display": [],
        "radius_yd": [
          null,
          null
        ],
        "targets": [
          {
            "key": "unit_target_enemy",
            "label": "Target Enemy",
            "value": 6
          },
          null
        ],
        "value": {
          "ap_coefficient": 0.0,
          "at_level": 18.0,
          "base": 18.0,
          "level": 60,
          "max": 22.0,
          "min": 14.0,
          "per_level": 0.6,
          "per_resource": 0.0,
          "sp_coefficient": 0.0
        }
      },
      {
        "amplitude": 1.0,
        "attributes": [],
        "aura": {
          "key": "periodic_damage",
          "label": "Periodic Damage",
          "value": 3
        },
        "chain_amplitude": 1.0,
        "chain_targets": 0,
        "class_mask": [
          0,
          0,
          0,
          0
        ],
        "effect": {
          "key": "apply_aura",
          "label": "Apply Aura",
          "value": 6
        },
        "index": 1,
        "item_type_raw": 0,
        "misc": [
          0,
          0
        ],
        "misc_display": [],
        "period_ms": 2000,
        "radius_yd": [
          null,
          null
        ],
        "targets": [
          {
            "key": "unit_target_enemy",
            "label": "Target Enemy",
            "value": 6
          },
          null
        ],
        "value": {
          "ap_coefficient": 0.0,
          "at_level": 2.0,
          "base": 2.0,
          "level": 60,
          "max": 2.0,
          "min": 2.0,
          "per_level": 0.0,
          "per_resource": 0.0,
          "sp_coefficient": 0.0
        }
      }
    ],
    "family": {
      "key": "mage",
      "label": "Mage",
      "value": 3
    },
    "has_unknown_tokens": false,
    "icon": {
      "fdid": 135812,
      "name": "spell_fire_flamebolt",
      "urls": {
        "36": "/icons/6e9ccd2dd74b74e2.webp",
        "64": "/icons/6e9ccd2dd74b74b0.webp"
      }
    },
    "id": 133,
    "interrupts": {
      "aura": [],
      "channel": [],
      "flags": []
    },
    "is_passive": false,
    "is_player_spell": true,
    "is_talent": false,
    "labels": [
      17
    ],
    "levels": {
      "base": 1,
      "max": 6,
      "max_passive_aura": 0,
      "spell": 1
    },
    "name": "Fireball",
    "notes": [],
    "prevention": {
      "key": "silence",
      "label": "Silence",
      "value": 1
    },
    "race_mask": 0,
    "races": [],
    "range": {
      "label": "35 yd range",
      "max_yd": [
        35.0,
        35.0
      ],
      "min_yd": [
        0.0,
        0.0
      ],
      "name": "Long Range",
      "self_only": false
    },
    "rank": {
      "count": 12,
      "group": 133,
      "highest": false,
      "number": 1
    },
    "ranks": [
      {
        "cast": "1.5 sec cast",
        "cost": "30 Mana",
        "effect_values": [
          "14 to 22",
          "2"
        ],
        "level": 1,
        "rank": 1,
        "spell": {
          "api_url": "/api/v1/spells/133",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 133,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 1",
          "url": "/spells/133/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "45 Mana",
        "effect_values": [
          "28 to 44",
          "4"
        ],
        "level": 6,
        "rank": 2,
        "spell": {
          "api_url": "/api/v1/spells/143",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 143,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 2",
          "url": "/spells/143/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "65 Mana",
        "effect_values": [
          "50 to 78",
          "7"
        ],
        "level": 12,
        "rank": 3,
        "spell": {
          "api_url": "/api/v1/spells/145",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 145,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 3",
          "url": "/spells/145/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "95 Mana",
        "effect_values": [
          "84 to 132",
          "12"
        ],
        "level": 18,
        "rank": 4,
        "spell": {
          "api_url": "/api/v1/spells/3140",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 3140,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 4",
          "url": "/spells/3140/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "140 Mana",
        "effect_values": [
          "125 to 197",
          "18"
        ],
        "level": 24,
        "rank": 5,
        "spell": {
          "api_url": "/api/v1/spells/8400",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 8400,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 5",
          "url": "/spells/8400/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "185 Mana",
        "effect_values": [
          "170 to 268",
          "24"
        ],
        "level": 30,
        "rank": 6,
        "spell": {
          "api_url": "/api/v1/spells/8401",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 8401,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 6",
          "url": "/spells/8401/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "220 Mana",
        "effect_values": [
          "222 to 348",
          "32"
        ],
        "level": 36,
        "rank": 7,
        "spell": {
          "api_url": "/api/v1/spells/8402",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 8402,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 7",
          "url": "/spells/8402/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "260 Mana",
        "effect_values": [
          "286 to 450",
          "41"
        ],
        "level": 42,
        "rank": 8,
        "spell": {
          "api_url": "/api/v1/spells/10148",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 10148,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 8",
          "url": "/spells/10148/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "305 Mana",
        "effect_values": [
          "349 to 549",
          "50"
        ],
        "level": 48,
        "rank": 9,
        "spell": {
          "api_url": "/api/v1/spells/10149",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 10149,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 9",
          "url": "/spells/10149/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "350 Mana",
        "effect_values": [
          "427 to 671",
          "61"
        ],
        "level": 54,
        "rank": 10,
        "spell": {
          "api_url": "/api/v1/spells/10150",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 10150,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 10",
          "url": "/spells/10150/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "395 Mana",
        "effect_values": [
          "488 to 766",
          "70"
        ],
        "level": 60,
        "rank": 11,
        "spell": {
          "api_url": "/api/v1/spells/10151",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 10151,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 11",
          "url": "/spells/10151/fireball"
        }
      },
      {
        "cast": "1.5 sec cast",
        "cost": "410 Mana",
        "effect_values": [
          "506 to 794",
          "72"
        ],
        "level": 60,
        "rank": 12,
        "spell": {
          "api_url": "/api/v1/spells/25306",
          "icon": {
            "fdid": 135812,
            "name": "spell_fire_flamebolt",
            "urls": {
              "36": "/icons/6e9ccd2dd74b74e2.webp",
              "64": "/icons/6e9ccd2dd74b74b0.webp"
            }
          },
          "id": 25306,
          "name": "Fireball",
          "status": "complete",
          "subtext": "Rank 12",
          "url": "/spells/25306/fireball"
        }
      }
    ],
    "reagents": [],
    "referenced_by": [],
    "related": {
      "creates": [],
      "item_sets": [],
      "modified_by": [
        {
          "effect_index": 0,
          "spell": {
            "api_url": "/api/v1/spells/11069",
            "icon": {
              "fdid": 135812,
              "name": "spell_fire_flamebolt",
              "urls": {
                "36": "/icons/6e9ccd2dd74b74e2.webp",
                "64": "/icons/6e9ccd2dd74b74b0.webp"
              }
            },
            "id": 11069,
            "name": "Improved Fireball",
            "status": "complete",
            "subtext": "Rank 1",
            "url": "/spells/11069/improved-fireball"
          }
        }
      ],
      "modified_by_more": 0,
      "modifies": [],
      "modifies_more": 0,
      "superseded_by": {
        "api_url": "/api/v1/spells/143",
        "icon": {
          "fdid": 135812,
          "name": "spell_fire_flamebolt",
          "urls": {
            "36": "/icons/6e9ccd2dd74b74e2.webp",
            "64": "/icons/6e9ccd2dd74b74b0.webp"
          }
        },
        "id": 143,
        "name": "Fireball",
        "status": "complete",
        "subtext": "Rank 2",
        "url": "/spells/143/fireball"
      },
      "taught_by_items": [],
      "taught_by_spells": [],
      "teaches": [],
      "triggered_by": [],
      "triggers": [],
      "used_by_enchantments": [],
      "used_by_items": []
    },
    "requirements": {
      "caster_aura_types": [],
      "creature_types": [],
      "exclude_caster_aura_types": [],
      "exclude_target_aura_types": [],
      "excluded_forms": [],
      "forms": [],
      "target_aura_types": [],
      "target_flags": []
    },
    "school_mask": 4,
    "school_relevant": true,
    "schools": [
      {
        "key": "fire",
        "label": "Fire",
        "value": 4
      }
    ],
    "skill_lines": [
      {
        "acquire": {
          "key": "learned",
          "label": "Learned",
          "value": 0
        },
        "category": {
          "key": "class",
          "label": "Class",
          "value": 7
        },
        "class_mask": 128,
        "classes": [
          {
            "api_url": "/api/v1/classes/mage",
            "color": "#3fc7eb",
            "icon": {
              "fdid": 626001,
              "name": "classicon_mage",
              "urls": {
                "36": "/icons/e51e286ba9a5d393.webp",
                "64": "/icons/e51e286ba9a5d3c1.webp"
              }
            },
            "id": 8,
            "key": "mage",
            "name": "Mage",
            "url": "/classes/mage"
          }
        ],
        "min_rank": 1,
        "num_skill_ups": 1,
        "race_mask": 0,
        "races": [],
        "skill_line": {
          "api_url": "/api/v1/skill-lines/8",
          "icon": {
            "fdid": 135810,
            "name": "spell_fire_firebolt02",
            "urls": {
              "36": "/icons/322dd9bad8b67c9c.webp",
              "64": "/icons/322dd9bad8b67cce.webp"
            }
          },
          "id": 8,
          "name": "Fire",
          "url": "/skill-lines/8/fire"
        },
        "sla_id": 456,
        "trivial_high": 0,
        "trivial_low": 0
      }
    ],
    "slug": "fireball",
    "status": "complete",
    "subtext": "Rank 1",
    "tool_categories": [],
    "tools": [],
    "tooltip": {
      "lines": [
        {
          "left": [
            {
              "text": "Fireball",
              "type": "text"
            }
          ],
          "right": [
            {
              "text": "Rank 1",
              "type": "text"
            }
          ],
          "style": {
            "type": "title"
          }
        },
        {
          "left": [
            {
              "text": "30 Mana",
              "type": "text"
            }
          ],
          "right": [
            {
              "text": "35 yd range",
              "type": "text"
            }
          ],
          "style": {
            "type": "normal"
          }
        },
        {
          "left": [
            {
              "text": "1.5 sec cast",
              "type": "text"
            }
          ],
          "style": {
            "type": "normal"
          }
        },
        {
          "left": [
            {
              "text": "Hurls a fiery ball that causes ",
              "type": "text"
            },
            {
              "text": "14 to 22",
              "type": "value"
            },
            {
              "text": " Fire damage and an additional ",
              "type": "text"
            },
            {
              "text": "4",
              "type": "value"
            },
            {
              "text": " Fire damage over 4 sec.",
              "type": "text"
            }
          ],
          "style": {
            "type": "description"
          }
        },
        {
          "left": [
            {
              "text": "Values at level 60",
              "type": "text"
            }
          ],
          "style": {
            "type": "muted"
          }
        }
      ]
    },
    "url": "/spells/133/fireball",
    "value_level": 60
  }
}

GET /api/v1/tooltip/{kind}/{id}

The tooltip of a spell, item, item set or enchantment.

3 parameters
Parameters of /api/v1/tooltip/{kind}/{id}
NameInTypeDescriptionExample
kind requiredpathstring`spell`, `item`, `item_set` or `enchantment`
id requiredpathinteger (int32)Entity id
If-None-MatchheaderstringAn ETag from an earlier response; when it still matches, the answer is 304 without a body.
200
The tooltip
DataResponse_Tooltip
304
Not modified: the If-None-Match ETag still matches.
400
Invalid parameters
Problem
404
No such entity
Problem
curl -s 'https://forever.marni.ac/api/v1/tooltip/spell/133'
Example response (sample data)
{
  "data": {
    "lines": [
      {
        "left": [
          {
            "text": "Fireball",
            "type": "text"
          }
        ],
        "right": [
          {
            "text": "Rank 1",
            "type": "text"
          }
        ],
        "style": {
          "type": "title"
        }
      },
      {
        "left": [
          {
            "text": "30 Mana",
            "type": "text"
          }
        ],
        "right": [
          {
            "text": "35 yd range",
            "type": "text"
          }
        ],
        "style": {
          "type": "normal"
        }
      },
      {
        "left": [
          {
            "text": "1.5 sec cast",
            "type": "text"
          }
        ],
        "style": {
          "type": "normal"
        }
      },
      {
        "left": [
          {
            "text": "Hurls a fiery ball that causes ",
            "type": "text"
          },
          {
            "text": "14 to 22",
            "type": "value"
          },
          {
            "text": " Fire damage and an additional ",
            "type": "text"
          },
          {
            "text": "4",
            "type": "value"
          },
          {
            "text": " Fire damage over 4 sec.",
            "type": "text"
          }
        ],
        "style": {
          "type": "description"
        }
      },
      {
        "left": [
          {
            "text": "Values at level 60",
            "type": "text"
          }
        ],
        "style": {
          "type": "muted"
        }
      }
    ]
  }
}

Keyboard shortcuts

/ Ctrl K
Focus the search box
Esc
Close suggestions, tooltips and dialogs
j k
Move through result rows
Enter
Open the highlighted row
g s / b / i / e
Go to Spells, Buffs, Items, Enchantments
t
Cycle theme: System, Light, Dark
c
Copy the link to this page
?
Show this dialog