{
    "openapi": "3.0.3",
    "info": {
        "title": "ResourceLite2 REST API",
        "version": "1.0.0",
        "description": "Catalog read/write on XenForo\u2019s native `/api/` layer, plus thread create with attachments. Send `XF-Api-Key` on every request. ForumApi-managed keys are RPM-limited (`X-RateLimit-*`, `Retry-After`). Super-user / ACP keys skip that limiter. Download links appear only when the key\u2019s user may view them. Staff-only actions (tag lock, review ban, claim reset) are not exposed. To attach files when creating a thread: POST `/attachments/new-key/` (`type=post`, `context[node_id]`), upload files, then POST `/threads/` with `attachment_key`. Requires `thread:write` and `attachment:write`."
    },
    "servers": [
        {
            "url": "https://dev.zonies.xyz/api",
            "description": "XenForo API"
        }
    ],
    "tags": [
        {
            "name": "Threads",
            "description": "XenForo native thread create (`thread:write`). Attach files with `attachment:write`."
        },
        {
            "name": "Attachments",
            "description": "Upload files, then pass the returned key as `attachment_key` when creating a thread."
        },
        {
            "name": "Items",
            "description": "Catalog browse and item detail (`rl2_item:read`)"
        },
        {
            "name": "Tags",
            "description": "Community tags (`rl2_tag:read` / `rl2_tag:write`)"
        },
        {
            "name": "Reviews",
            "description": "Reviews (`rl2_review:read` / `rl2_review:write`)"
        },
        {
            "name": "Meta",
            "description": "Profiles, nodes, sort, OS (`rl2_item:read`)"
        }
    ],
    "paths": {
        "/attachments/new-key/": {
            "post": {
                "tags": [
                    "Attachments"
                ],
                "summary": "Create an attachment key (and optional first file)",
                "operationId": "createAttachmentKey",
                "description": "For a new thread, use `type=post` and `context[node_id]` set to the destination forum ID. Requires `attachment:write`.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "type"
                                ],
                                "properties": {
                                    "type": {
                                        "type": "string",
                                        "example": "post"
                                    },
                                    "context[node_id]": {
                                        "type": "integer",
                                        "minimum": 1
                                    },
                                    "attachment": {
                                        "type": "string",
                                        "format": "binary"
                                    }
                                }
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "type"
                                ],
                                "properties": {
                                    "type": {
                                        "type": "string",
                                        "example": "post"
                                    },
                                    "context[node_id]": {
                                        "type": "integer",
                                        "minimum": 1
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Attachment key created.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "key"
                                    ],
                                    "properties": {
                                        "key": {
                                            "type": "string"
                                        },
                                        "attachment": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Unauthorized"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    }
                }
            }
        },
        "/attachments/": {
            "post": {
                "tags": [
                    "Attachments"
                ],
                "summary": "Upload a file onto an attachment key",
                "operationId": "uploadAttachment",
                "description": "Requires `attachment:write`. Repeat for each extra file, then pass the same key as `attachment_key` on `POST /threads/`.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "key",
                                    "attachment"
                                ],
                                "properties": {
                                    "key": {
                                        "type": "string"
                                    },
                                    "attachment": {
                                        "type": "string",
                                        "format": "binary"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "File attached to the key.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "attachment": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Unauthorized"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    }
                }
            }
        },
        "/threads/": {
            "post": {
                "tags": [
                    "Threads"
                ],
                "summary": "Create a thread (optional attachments)",
                "operationId": "createThread",
                "description": "Requires `thread:write`. To attach files, first `POST /attachments/new-key/` with `type=post` and `context[node_id]`, upload files, then send that key as `attachment_key`. The key user must be allowed to post in that forum.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "node_id",
                                    "title",
                                    "message"
                                ],
                                "properties": {
                                    "node_id": {
                                        "type": "integer",
                                        "minimum": 1
                                    },
                                    "title": {
                                        "type": "string"
                                    },
                                    "message": {
                                        "type": "string"
                                    },
                                    "attachment_key": {
                                        "type": "string",
                                        "description": "Key from POST /attachments/new-key/ (type=post, context[node_id] matching this node_id)."
                                    },
                                    "prefix_id": {
                                        "type": "integer"
                                    },
                                    "tags": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        },
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "node_id",
                                    "title",
                                    "message"
                                ],
                                "properties": {
                                    "node_id": {
                                        "type": "integer",
                                        "minimum": 1
                                    },
                                    "title": {
                                        "type": "string"
                                    },
                                    "message": {
                                        "type": "string"
                                    },
                                    "attachment_key": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Thread created.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "success": {
                                            "type": "boolean"
                                        },
                                        "thread": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Unauthorized"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    }
                }
            }
        },
        "/rl2/items/": {
            "get": {
                "tags": [
                    "Items"
                ],
                "summary": "List and search catalog items",
                "operationId": "listItems",
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 12,
                            "maximum": 48,
                            "default": 24
                        }
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Title or developer search"
                    },
                    {
                        "name": "category",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "from",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Unix timestamp lower bound"
                    },
                    {
                        "name": "to",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Unix timestamp upper bound"
                    },
                    {
                        "name": "tags",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Comma-separated tag slugs"
                    },
                    {
                        "name": "tags_mode",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "exclude",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "os",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Comma-separated OS keys"
                    },
                    {
                        "name": "sort",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "date",
                                "title",
                                "views",
                                "promoted"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "items",
                                        "pagination"
                                    ],
                                    "properties": {
                                        "items": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/ItemCard"
                                            }
                                        },
                                        "pagination": {
                                            "$ref": "#/components/schemas/Pagination"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    }
                }
            }
        },
        "/rl2/items/{item_id}/": {
            "get": {
                "tags": [
                    "Items"
                ],
                "summary": "Get one item",
                "operationId": "getItem",
                "parameters": [
                    {
                        "name": "item_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "item"
                                    ],
                                    "properties": {
                                        "item": {
                                            "$ref": "#/components/schemas/ItemDetail"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            }
        },
        "/rl2/items/{item_id}/tags/": {
            "get": {
                "tags": [
                    "Tags"
                ],
                "summary": "List community tags on an item",
                "operationId": "getItemTags",
                "parameters": [
                    {
                        "name": "item_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/TagHydrate"
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            },
            "post": {
                "tags": [
                    "Tags"
                ],
                "summary": "Suggest a community tag",
                "operationId": "suggestItemTag",
                "parameters": [
                    {
                        "name": "item_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tag_id": {
                                        "type": "integer"
                                    },
                                    "name": {
                                        "type": "string"
                                    },
                                    "category": {
                                        "type": "string"
                                    }
                                }
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tag_id": {
                                        "type": "integer"
                                    },
                                    "name": {
                                        "type": "string"
                                    },
                                    "category": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "tag": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            }
        },
        "/rl2/items/{item_id}/tags/{tag_id}/vote": {
            "post": {
                "tags": [
                    "Tags"
                ],
                "summary": "Vote on a community tag",
                "operationId": "voteItemTag",
                "parameters": [
                    {
                        "name": "item_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "tag_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "value"
                                ],
                                "properties": {
                                    "value": {
                                        "type": "integer",
                                        "description": "Vote value used by CommunityTag\\Vote"
                                    }
                                }
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "value"
                                ],
                                "properties": {
                                    "value": {
                                        "type": "integer",
                                        "description": "Vote value used by CommunityTag\\Vote"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "tag": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Tags"
                ],
                "summary": "Withdraw a tag vote",
                "operationId": "deleteItemTagVote",
                "parameters": [
                    {
                        "name": "item_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "tag_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            }
        },
        "/rl2/items/{item_id}/tags/{tag_id}/withdraw": {
            "post": {
                "tags": [
                    "Tags"
                ],
                "summary": "Withdraw a tag vote",
                "operationId": "withdrawItemTagVote",
                "parameters": [
                    {
                        "name": "item_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "tag_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            }
        },
        "/rl2/items/{item_id}/reviews/": {
            "get": {
                "tags": [
                    "Reviews"
                ],
                "summary": "List reviews for an item",
                "operationId": "listItemReviews",
                "parameters": [
                    {
                        "name": "item_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50,
                            "default": 20
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "reviews",
                                        "pagination"
                                    ],
                                    "properties": {
                                        "reviews": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Review"
                                            }
                                        },
                                        "pagination": {
                                            "$ref": "#/components/schemas/Pagination"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            },
            "post": {
                "tags": [
                    "Reviews"
                ],
                "summary": "Create a review",
                "operationId": "createItemReview",
                "parameters": [
                    {
                        "name": "item_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ReviewInput"
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "$ref": "#/components/schemas/ReviewInput"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "review": {
                                            "$ref": "#/components/schemas/Review"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            }
        },
        "/rl2/reviews/{review_id}/": {
            "patch": {
                "tags": [
                    "Reviews"
                ],
                "summary": "Edit own review",
                "operationId": "updateReview",
                "parameters": [
                    {
                        "name": "review_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ReviewInput"
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "$ref": "#/components/schemas/ReviewInput"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "review": {
                                            "$ref": "#/components/schemas/Review"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Reviews"
                ],
                "summary": "Soft-delete a review",
                "operationId": "deleteReview",
                "parameters": [
                    {
                        "name": "review_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "reason": {
                                        "type": "string"
                                    }
                                }
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "reason": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "success": {
                                            "type": "boolean"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            }
        },
        "/rl2/reviews/{review_id}/helpful": {
            "post": {
                "tags": [
                    "Reviews"
                ],
                "summary": "Mark a review helpful",
                "operationId": "markReviewHelpful",
                "parameters": [
                    {
                        "name": "review_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "success": {
                                            "type": "boolean"
                                        },
                                        "helpful_count": {
                                            "type": "integer"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            }
        },
        "/rl2/reviews/{review_id}/replies": {
            "post": {
                "tags": [
                    "Reviews"
                ],
                "summary": "Reply to a review (same permission as the public reply form)",
                "operationId": "replyToReview",
                "parameters": [
                    {
                        "name": "review_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "message"
                                ],
                                "properties": {
                                    "message": {
                                        "type": "string"
                                    }
                                }
                            }
                        },
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "message"
                                ],
                                "properties": {
                                    "message": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "reply": {
                                            "$ref": "#/components/schemas/ReviewReply"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFound"
                    }
                }
            }
        },
        "/rl2/meta/": {
            "get": {
                "tags": [
                    "Meta"
                ],
                "summary": "Catalog metadata",
                "operationId": "getMeta",
                "responses": {
                    "200": {
                        "description": "OK",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/X-RateLimit-Limit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/X-RateLimit-Remaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Meta"
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "ApiKey": {
                "type": "apiKey",
                "in": "header",
                "name": "XF-Api-Key",
                "description": "User-bound XenForo API key (ForumApi Account keys or ACP keys)."
            }
        },
        "headers": {
            "X-RateLimit-Limit": {
                "schema": {
                    "type": "integer"
                },
                "description": "Requests allowed in the current minute (ForumApi keys only)."
            },
            "X-RateLimit-Remaining": {
                "schema": {
                    "type": "integer"
                },
                "description": "Requests remaining in the current minute (ForumApi keys only)."
            },
            "Retry-After": {
                "schema": {
                    "type": "integer"
                },
                "description": "Seconds until the next window when HTTP 429 is returned."
            }
        },
        "schemas": {
            "Error": {
                "type": "object",
                "properties": {
                    "errors": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "code": {
                                    "type": "string"
                                },
                                "message": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            },
            "Pagination": {
                "type": "object",
                "properties": {
                    "current_page": {
                        "type": "integer"
                    },
                    "last_page": {
                        "type": "integer"
                    },
                    "per_page": {
                        "type": "integer"
                    },
                    "shown": {
                        "type": "integer"
                    },
                    "total": {
                        "type": "integer"
                    }
                }
            },
            "ItemCard": {
                "type": "object",
                "properties": {
                    "item_id": {
                        "type": "integer"
                    },
                    "thread_id": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    },
                    "creator": {
                        "type": "string"
                    },
                    "version": {
                        "type": "string"
                    },
                    "category": {
                        "type": "string"
                    },
                    "cover_url": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    },
                    "os": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "tags": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "community_tags": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "last_updated_at": {
                        "type": "integer"
                    },
                    "views": {
                        "type": "integer"
                    }
                }
            },
            "ItemDetail": {
                "type": "object",
                "properties": {
                    "item_id": {
                        "type": "integer"
                    },
                    "thread_id": {
                        "type": "integer"
                    },
                    "node_id": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    },
                    "overview": {
                        "nullable": true
                    },
                    "item_type": {
                        "type": "string"
                    },
                    "developer_name": {
                        "nullable": true
                    },
                    "artist_name": {
                        "nullable": true
                    },
                    "publisher_name": {
                        "nullable": true
                    },
                    "original_title": {
                        "nullable": true
                    },
                    "aliases": {
                        "nullable": true
                    },
                    "version_string": {
                        "nullable": true
                    },
                    "language": {
                        "nullable": true
                    },
                    "release_date": {
                        "type": "integer",
                        "nullable": true
                    },
                    "thread_updated_date": {
                        "type": "integer",
                        "nullable": true
                    },
                    "url": {
                        "type": "string"
                    },
                    "fields": {
                        "type": "object",
                        "additionalProperties": true
                    },
                    "downloads": {
                        "type": "array",
                        "description": "Omitted when the key\u2019s user cannot view downloads.",
                        "items": {
                            "$ref": "#/components/schemas/DownloadLink"
                        }
                    }
                }
            },
            "DownloadLink": {
                "type": "object",
                "properties": {
                    "link_id": {
                        "type": "integer"
                    },
                    "label": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    },
                    "host": {
                        "type": "string"
                    },
                    "platform": {
                        "nullable": true
                    },
                    "link_type": {
                        "type": "string"
                    }
                }
            },
            "Review": {
                "type": "object",
                "properties": {
                    "review_id": {
                        "type": "integer"
                    },
                    "item_id": {
                        "type": "integer"
                    },
                    "user_id": {
                        "type": "integer"
                    },
                    "username": {
                        "type": "string"
                    },
                    "title": {
                        "nullable": true
                    },
                    "body": {
                        "type": "string"
                    },
                    "pros": {
                        "nullable": true
                    },
                    "cons": {
                        "nullable": true
                    },
                    "score": {
                        "type": "number"
                    },
                    "helpful_count": {
                        "type": "integer"
                    },
                    "created_at": {
                        "type": "integer"
                    },
                    "updated_at": {
                        "type": "integer"
                    }
                }
            },
            "ReviewInput": {
                "type": "object",
                "properties": {
                    "review_title": {
                        "type": "string"
                    },
                    "review_body": {
                        "type": "string"
                    },
                    "pros_text": {
                        "type": "string"
                    },
                    "cons_text": {
                        "type": "string"
                    },
                    "metric_scores": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "number"
                        }
                    }
                }
            },
            "ReviewReply": {
                "type": "object",
                "properties": {
                    "reply_id": {
                        "type": "integer"
                    },
                    "review_id": {
                        "type": "integer"
                    },
                    "user_id": {
                        "type": "integer"
                    },
                    "message": {
                        "type": "string"
                    },
                    "created_at": {
                        "type": "integer"
                    }
                }
            },
            "TagHydrate": {
                "type": "object",
                "properties": {
                    "thread_id": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    },
                    "tags": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "tagging_allowed": {
                        "type": "boolean"
                    },
                    "can_vote": {
                        "type": "boolean"
                    },
                    "can_suggest": {
                        "type": "boolean"
                    }
                }
            },
            "Meta": {
                "type": "object",
                "properties": {
                    "profiles": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "profile_id": {
                                    "type": "integer"
                                },
                                "profile_key": {
                                    "type": "string"
                                },
                                "title": {
                                    "type": "string"
                                },
                                "item_type": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "enabled_node_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    },
                    "sort": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "os": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            }
        },
        "responses": {
            "Unauthorized": {
                "description": "Missing or invalid API key.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "Forbidden": {
                "description": "Missing scope or no permission.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "NotFound": {
                "description": "Resource not found.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "RateLimited": {
                "description": "ForumApi RPM exceeded.",
                "headers": {
                    "X-RateLimit-Limit": {
                        "$ref": "#/components/headers/X-RateLimit-Limit"
                    },
                    "X-RateLimit-Remaining": {
                        "$ref": "#/components/headers/X-RateLimit-Remaining"
                    },
                    "Retry-After": {
                        "$ref": "#/components/headers/Retry-After"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            }
        }
    },
    "security": [
        {
            "ApiKey": []
        }
    ]
}