{
    "openapi": "3.1.0",
    "info": {
        "title": "zodly API",
        "version": "1.0.0",
        "description": "zodly API ištaiso lietuviškų tekstų rašybos, gramatikos ir skyrybos klaidas, perfrazuoja tekstą ir keičia jo toną. Atskiras adresas įvertina, ar tekstą sukūrė dirbtinis intelektas (DI). API gali naudoti „Max“ plano naudotojai.\n\n## Prieiga\n\nSukurkite API raktą paskyroje (https://zodly.lt/dashboard#api-raktai) ir siųskite jį kiekvienos užklausos antraštėje `Authorization: Bearer <API raktas>`. Šie adresai priima tik API raktus. Raktas galioja, kol jį atšauksite. Pakeitus slaptažodį ar ištrynus paskyrą, visi raktai atšaukiami.\n\n## Užklausos ir atsakymai\n\nUžklausos turinį siųskite JSON formatu su antrašte `Content-Type: application/json`. Atsakymas visada yra JSON, net jei antraštėje `Accept` nurodytas kitas formatas.\n\nTekstas apdorojamas toks, koks atsiųstas: tarpai ir eilučių lūžiai pradžioje ir pabaigoje išlieka. Ilgiai ir pozicijos skaičiuojami kodo taškais (angl. Unicode code points). Python `len()` ir PHP `mb_strlen()` skaičiuoja taip pat, o JavaScript `text.length` jaustuką gali laikyti dviem simboliais, todėl ten naudokite `Array.from(text)`.\n\n## Klaidos\n\nKiekviena klaida turi nekintamą kodą lauke `error` ir paaiškinimą lietuvių kalba lauke `message`. Programoje tikrinkite `error`, o `message` galite rodyti žmonėms. Bet kuriam adresui galimi ir šie atsakymai:\n\n- 404 `NOT_FOUND` – tokio adreso nėra;\n- 405 `METHOD_NOT_ALLOWED` – adresas šio metodo nepriima, antraštė `Allow` nurodo tinkamus.\n\n## Limitai\n\nTaisymui, perfrazavimui ir tono keitimui taikomas mėnesio simbolių limitas, bendras visiems naudotojo raktams ir MCP. DI analizėms taikomas dienos limitas, bendras su svetaine. Užklausų per minutę riba taikoma kiekvienam raktui ir visiems naudotojo raktams kartu. Limitų dydžiai nurodyti puslapyje https://zodly.lt/api. Likutį rodo `GET /usage` ir kiekvieno atsakymo laukas `usage`.\n\n## MCP\n\nTaisymą galima naudoti ir per MCP serverį `https://zodly.lt/mcp/check` (įrankis `fix-text`). Prie jo jungiamasi zodly paskyra (ChatGPT, Claude.ai ir kitos programos, palaikančios MCP prisijungimą) arba API raktu antraštėje `Authorization: Bearer <API raktas>`. Tekstas įskaičiuojamas į tą patį mėnesio simbolių limitą."
    },
    "servers": [
        {
            "url": "https://zodly.lt/api/v1"
        }
    ],
    "security": [
        {
            "apiKey": []
        }
    ],
    "tags": [
        {
            "name": "Tekstas",
            "description": "Taisymas, perfrazavimas ir tono keitimas. Kiekvienas atsakymas rodo mėnesio simbolių likutį."
        },
        {
            "name": "DI detektorius",
            "description": "Įvertina, ar tekstą sukūrė dirbtinis intelektas."
        },
        {
            "name": "Naudojimas",
            "description": "Mėnesio simbolių ir dienos DI analizių likutis."
        }
    ],
    "externalDocs": {
        "description": "Pradžia, pavyzdžiai ir limitai",
        "url": "https://zodly.lt/api"
    },
    "paths": {
        "/fix": {
            "post": {
                "tags": [
                    "Tekstas"
                ],
                "summary": "Ištaisyti tekstą",
                "description": "Ištaiso rašybos, gramatikos ir skyrybos klaidas. Grąžina visą ištaisytą tekstą ir pakeitimų sąrašą su pozicijomis siųstame tekste, kad klaidas galėtumėte parodyti savo programoje. Jei taisyti nėra ką, `changed` yra `false`, o `changes` – tuščias sąrašas.",
                "operationId": "fixText",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/FixRequest"
                            },
                            "examples": {
                                "klaida": {
                                    "summary": "Tekstas su klaida",
                                    "value": {
                                        "text": "Labas, siandien."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Ištaisytas tekstas ir pakeitimai.",
                        "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/FixResponse"
                                },
                                "examples": {
                                    "pataisyta": {
                                        "summary": "Rasta klaida",
                                        "value": {
                                            "corrected_text": "Labas, šiandien.",
                                            "changed": true,
                                            "changes": [
                                                {
                                                    "offset": 7,
                                                    "length": 9,
                                                    "original": "siandien.",
                                                    "suggestion": "šiandien."
                                                }
                                            ],
                                            "usage": {
                                                "chars_used": 16,
                                                "chars_limit": 1000000,
                                                "chars_left": 999984,
                                                "resets_at": "2026-12-01T00:00:00Z"
                                            }
                                        }
                                    },
                                    "be_klaidu": {
                                        "summary": "Klaidų nėra",
                                        "value": {
                                            "corrected_text": "Labas, šiandien.",
                                            "changed": false,
                                            "changes": [],
                                            "usage": {
                                                "chars_used": 32,
                                                "chars_limit": 1000000,
                                                "chars_left": 999968,
                                                "resets_at": "2026-12-01T00:00:00Z"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "413": {
                        "$ref": "#/components/responses/PayloadTooLarge"
                    },
                    "422": {
                        "$ref": "#/components/responses/TextValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/TextLimitReached"
                    },
                    "500": {
                        "$ref": "#/components/responses/ProcessingError"
                    },
                    "503": {
                        "$ref": "#/components/responses/ServiceUnavailable"
                    }
                }
            }
        },
        "/rephrase": {
            "post": {
                "tags": [
                    "Tekstas"
                ],
                "summary": "Perfrazuoti tekstą",
                "description": "Perrašo tekstą pasirinktu stiliumi ir grąžina naują tekstą.",
                "operationId": "rephraseText",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/RephraseRequest"
                            },
                            "examples": {
                                "formaliai": {
                                    "summary": "Formaliai",
                                    "value": {
                                        "text": "Nu, gal susitiksim rytoj",
                                        "style": "formal"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Perfrazuotas tekstas.",
                        "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/RewriteResponse"
                                },
                                "examples": {
                                    "formaliai": {
                                        "summary": "Formaliai",
                                        "value": {
                                            "text": "Galbūt susitiksime rytoj.",
                                            "usage": {
                                                "chars_used": 24,
                                                "chars_limit": 1000000,
                                                "chars_left": 999976,
                                                "resets_at": "2026-12-01T00:00:00Z"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "413": {
                        "$ref": "#/components/responses/PayloadTooLarge"
                    },
                    "422": {
                        "$ref": "#/components/responses/TextValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/TextLimitReached"
                    },
                    "500": {
                        "$ref": "#/components/responses/ProcessingError"
                    },
                    "503": {
                        "$ref": "#/components/responses/ServiceUnavailable"
                    }
                }
            }
        },
        "/tone": {
            "post": {
                "tags": [
                    "Tekstas"
                ],
                "summary": "Pakeisti teksto toną",
                "description": "Perrašo tekstą pasirinktu tonu ir grąžina naują tekstą.",
                "operationId": "changeTextTone",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ToneRequest"
                            },
                            "examples": {
                                "oficialus": {
                                    "summary": "Oficialus tonas",
                                    "value": {
                                        "text": "Nu, gal susitiksim rytoj",
                                        "tone": "formal"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Tekstas nauju tonu.",
                        "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/RewriteResponse"
                                },
                                "examples": {
                                    "oficialus": {
                                        "summary": "Oficialus tonas",
                                        "value": {
                                            "text": "Galbūt susitiksime rytoj.",
                                            "usage": {
                                                "chars_used": 24,
                                                "chars_limit": 1000000,
                                                "chars_left": 999976,
                                                "resets_at": "2026-12-01T00:00:00Z"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "413": {
                        "$ref": "#/components/responses/PayloadTooLarge"
                    },
                    "422": {
                        "$ref": "#/components/responses/TextValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/TextLimitReached"
                    },
                    "500": {
                        "$ref": "#/components/responses/ProcessingError"
                    },
                    "503": {
                        "$ref": "#/components/responses/ServiceUnavailable"
                    }
                }
            }
        },
        "/ai-detection": {
            "post": {
                "tags": [
                    "DI detektorius"
                ],
                "summary": "Įvertinti, ar tekstą sukūrė DI",
                "description": "Įvertina, ar tekstą parašė žmogus, ar sukūrė dirbtinis intelektas. Kiekviena analizė įskaičiuojama į dienos limitą, bendrą su svetaine. Vienu metu vykdoma viena naudotojo analizė.",
                "operationId": "detectAiText",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/AiDetectionRequest"
                            },
                            "examples": {
                                "tekstas": {
                                    "summary": "Tekstas analizei",
                                    "value": {
                                        "text": "Šiandien yra puiki diena mokytis lietuvių kalbos taisyklių ir rašybos. Kiekviena nauja taisyklė padeda rašyti aiškiau."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Analizės rezultatas.",
                        "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/AiDetectionResponse"
                                },
                                "examples": {
                                    "zmogaus": {
                                        "summary": "Žmogaus tekstas",
                                        "value": {
                                            "score": 9.5,
                                            "confidence": "high",
                                            "classification": "human",
                                            "probabilities": {
                                                "human": 0.88,
                                                "ai": 0.07,
                                                "mixed": 0.05
                                            },
                                            "summary": "Tekstas greičiausiai parašytas žmogaus. Nerasta ryškių AI požymių.",
                                            "warnings": [],
                                            "detected_language": "lt",
                                            "usage": {
                                                "detections_used_today": 1,
                                                "detections_limit_today": 20,
                                                "detections_left_today": 19
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "409": {
                        "$ref": "#/components/responses/AnalysisInProgress"
                    },
                    "413": {
                        "$ref": "#/components/responses/PayloadTooLarge"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationFailed"
                    },
                    "429": {
                        "$ref": "#/components/responses/DetectionLimitReached"
                    },
                    "500": {
                        "$ref": "#/components/responses/ProcessingError"
                    },
                    "503": {
                        "$ref": "#/components/responses/ServiceUnavailable"
                    }
                }
            }
        },
        "/usage": {
            "get": {
                "tags": [
                    "Naudojimas"
                ],
                "summary": "Naudojimas ir likutis",
                "description": "Rodo, kiek API simbolių sunaudota ir liko šį mėnesį ir kiek DI analizių liko šiandien. Ši užklausa į limitus neįskaičiuojama, bet jai taikoma užklausų per minutę riba.",
                "operationId": "getUsage",
                "responses": {
                    "200": {
                        "description": "Naudojimo suvestinė.",
                        "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/Usage"
                                },
                                "examples": {
                                    "naudojimas": {
                                        "summary": "Šio mėnesio naudojimas",
                                        "value": {
                                            "chars_used": 300,
                                            "chars_limit": 1000000,
                                            "chars_left": 999700,
                                            "resets_at": "2026-12-01T00:00:00Z",
                                            "detections_used_today": 2,
                                            "detections_limit_today": 20,
                                            "detections_left_today": 18
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthenticated"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "500": {
                        "$ref": "#/components/responses/ProcessingError"
                    },
                    "503": {
                        "$ref": "#/components/responses/ServiceUnavailable"
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "apiKey": {
                "type": "http",
                "scheme": "bearer",
                "description": "API raktas iš paskyros."
            }
        },
        "headers": {
            "X-RateLimit-Limit": {
                "description": "Leidžiamas užklausų skaičius per minutę.",
                "schema": {
                    "type": "integer"
                }
            },
            "X-RateLimit-Remaining": {
                "description": "Likęs šios minutės užklausų skaičius.",
                "schema": {
                    "type": "integer"
                }
            },
            "X-RateLimit-Reset": {
                "description": "Kada vėl bus galima siųsti užklausas: sekundės nuo 1970-01-01 00:00 UTC.",
                "schema": {
                    "type": "integer"
                }
            },
            "Retry-After": {
                "description": "Laukimo laikas sekundėmis iki kitos užklausos.",
                "required": true,
                "schema": {
                    "type": "integer"
                }
            },
            "Allow": {
                "description": "Metodai, kuriuos adresas priima.",
                "required": true,
                "schema": {
                    "type": "string"
                }
            }
        },
        "schemas": {
            "FixRequest": {
                "type": "object",
                "required": [
                    "text"
                ],
                "properties": {
                    "text": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 50000,
                        "description": "Tekstas, kurį reikia ištaisyti. Negali būti tuščias ar vien iš tarpų. Ilgis skaičiuojamas kodo taškais."
                    }
                }
            },
            "RephraseRequest": {
                "type": "object",
                "required": [
                    "text"
                ],
                "properties": {
                    "text": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 50000,
                        "description": "Tekstas, kurį reikia perfrazuoti. Negali būti tuščias ar vien iš tarpų. Ilgis skaičiuojamas kodo taškais."
                    },
                    "style": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "formal",
                            "informal",
                            "shorter",
                            "longer",
                            "simpler",
                            null
                        ],
                        "default": "formal",
                        "description": "Stilius: `formal` – formaliai, `informal` – neformaliai, `shorter` – trumpiau, `longer` – ilgiau, `simpler` – paprasčiau. Numatytasis – `formal`; jis taikomas ir tada, kai siunčiamas `null` arba tuščia eilutė."
                    }
                }
            },
            "ToneRequest": {
                "type": "object",
                "required": [
                    "text"
                ],
                "properties": {
                    "text": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 50000,
                        "description": "Tekstas, kurio toną reikia pakeisti. Negali būti tuščias ar vien iš tarpų. Ilgis skaičiuojamas kodo taškais."
                    },
                    "tone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "formal",
                            "informal",
                            "friendly",
                            "professional",
                            "neutral",
                            null
                        ],
                        "default": "formal",
                        "description": "Tonas: `formal` – oficialus, kreipiamasi „Jūs“; `informal` – laisvas, kreipiamasi „tu“; `friendly` – šiltas, draugiškas; `professional` – dalykiškas ir aiškus; `neutral` – neutralus, faktinis. Numatytasis – `formal`; jis taikomas ir tada, kai siunčiamas `null` arba tuščia eilutė."
                    }
                }
            },
            "AiDetectionRequest": {
                "type": "object",
                "required": [
                    "text"
                ],
                "properties": {
                    "text": {
                        "type": "string",
                        "minLength": 50,
                        "maxLength": 50000,
                        "description": "Tekstas, kurį reikia įvertinti. Kuo ilgesnis tekstas, tuo patikimesnis rezultatas. Ilgis skaičiuojamas kodo taškais."
                    }
                }
            },
            "FixResponse": {
                "type": "object",
                "required": [
                    "corrected_text",
                    "changed",
                    "changes",
                    "usage"
                ],
                "properties": {
                    "corrected_text": {
                        "type": "string",
                        "description": "Visas ištaisytas tekstas. Tarpai ir eilučių lūžiai pradžioje ir pabaigoje tokie patys kaip siųstame tekste."
                    },
                    "changed": {
                        "type": "boolean",
                        "description": "`true`, jei tekstas pakeistas."
                    },
                    "changes": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/TextChange"
                        },
                        "description": "Pakeitimai, surikiuoti pagal `offset`. Tuščias, kai `changed` yra `false`."
                    },
                    "usage": {
                        "$ref": "#/components/schemas/CharUsage"
                    }
                },
                "additionalProperties": false
            },
            "TextChange": {
                "type": "object",
                "description": "Vienas pakeitimas. `offset` ir `length` nurodo vietą siųstame tekste, ne ištaisytame. Pakeitimus taikykite nuo sąrašo galo, kad ankstesnių pakeitimų pozicijos nepasislinktų.",
                "required": [
                    "offset",
                    "length",
                    "original",
                    "suggestion"
                ],
                "properties": {
                    "offset": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Pakeisto fragmento pradžia siųstame tekste, kodo taškais nuo 0."
                    },
                    "length": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Pakeisto fragmento ilgis kodo taškais. 0 reiškia, kad tekstas įterpiamas."
                    },
                    "original": {
                        "type": "string",
                        "description": "Fragmentas iš siųsto teksto."
                    },
                    "suggestion": {
                        "type": "string",
                        "description": "Tekstas, kuriuo reikia pakeisti fragmentą. Tuščias, jei fragmentą reikia išbraukti."
                    }
                },
                "additionalProperties": false
            },
            "RewriteResponse": {
                "type": "object",
                "required": [
                    "text",
                    "usage"
                ],
                "properties": {
                    "text": {
                        "type": "string",
                        "description": "Naujas tekstas. Tarpai ir eilučių lūžiai pradžioje ir pabaigoje tokie patys kaip siųstame tekste."
                    },
                    "usage": {
                        "$ref": "#/components/schemas/CharUsage"
                    }
                },
                "additionalProperties": false
            },
            "CharUsage": {
                "type": "object",
                "description": "Mėnesio simbolių naudojimas po šios užklausos.",
                "required": [
                    "chars_used",
                    "chars_limit",
                    "chars_left",
                    "resets_at"
                ],
                "properties": {
                    "chars_used": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Šį mėnesį sunaudotų simbolių skaičius."
                    },
                    "chars_limit": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Mėnesio simbolių limitas."
                    },
                    "chars_left": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Šį mėnesį dar likusių simbolių skaičius."
                    },
                    "resets_at": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Limito atsinaujinimo laikas: kito mėnesio pirmoji diena, 00:00 UTC."
                    }
                },
                "additionalProperties": false
            },
            "AiDetectionResponse": {
                "type": "object",
                "required": [
                    "score",
                    "confidence",
                    "classification",
                    "probabilities",
                    "summary",
                    "warnings",
                    "detected_language",
                    "usage"
                ],
                "properties": {
                    "score": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 100,
                        "description": "DI požymių įvertis nuo 0 (parašė žmogus) iki 100 (sukūrė DI)."
                    },
                    "confidence": {
                        "type": "string",
                        "enum": [
                            "low",
                            "medium",
                            "high"
                        ],
                        "description": "Rezultato patikimumas."
                    },
                    "classification": {
                        "type": "string",
                        "enum": [
                            "human",
                            "ai",
                            "mixed",
                            "needs_review"
                        ],
                        "description": "Išvada: `human` – parašė žmogus, `ai` – sukūrė DI, `mixed` – mišrus tekstas, `needs_review` – patikimos išvados nėra."
                    },
                    "probabilities": {
                        "type": "object",
                        "description": "Tikimybės nuo 0 iki 1.",
                        "required": [
                            "human",
                            "ai",
                            "mixed"
                        ],
                        "properties": {
                            "human": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1,
                                "description": "Kad tekstą parašė žmogus."
                            },
                            "ai": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1,
                                "description": "Kad tekstą sukūrė DI."
                            },
                            "mixed": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1,
                                "description": "Kad tekstas mišrus."
                            }
                        },
                        "additionalProperties": false
                    },
                    "summary": {
                        "type": "string",
                        "description": "Išvada lietuvių kalba, skirta rodyti žmonėms."
                    },
                    "warnings": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "Įspėjimai lietuvių kalba, pvz., kad tekstas per trumpas patikimai analizei."
                    },
                    "detected_language": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Teksto kalba: `lt`, `en`, `mixed` (lietuvių ir anglų) arba `unknown`. `null`, kai tekstas per trumpas analizei; tada `classification` yra `needs_review`."
                    },
                    "usage": {
                        "$ref": "#/components/schemas/DetectionUsage"
                    }
                },
                "additionalProperties": false
            },
            "DetectionUsage": {
                "type": "object",
                "description": "Šios dienos DI analizės po šios užklausos.",
                "required": [
                    "detections_used_today",
                    "detections_limit_today",
                    "detections_left_today"
                ],
                "properties": {
                    "detections_used_today": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Šiandien atliktų DI analizių skaičius."
                    },
                    "detections_limit_today": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "DI analizių dienos limitas."
                    },
                    "detections_left_today": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Šiandien dar likusių DI analizių skaičius."
                    }
                },
                "additionalProperties": false
            },
            "Usage": {
                "type": "object",
                "required": [
                    "chars_used",
                    "chars_limit",
                    "chars_left",
                    "resets_at",
                    "detections_used_today",
                    "detections_limit_today",
                    "detections_left_today"
                ],
                "properties": {
                    "chars_used": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Šį mėnesį sunaudotų simbolių skaičius."
                    },
                    "chars_limit": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Mėnesio simbolių limitas."
                    },
                    "chars_left": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Šį mėnesį dar likusių simbolių skaičius."
                    },
                    "resets_at": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Simbolių limito atsinaujinimo laikas: kito mėnesio pirmoji diena, 00:00 UTC."
                    },
                    "detections_used_today": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Šiandien atliktų DI analizių skaičius."
                    },
                    "detections_limit_today": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "DI analizių dienos limitas."
                    },
                    "detections_left_today": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Šiandien dar likusių DI analizių skaičius."
                    }
                },
                "additionalProperties": false
            },
            "Error": {
                "type": "object",
                "description": "Klaida. Programoje tikrinkite `error`, o `message` galite rodyti žmonėms.",
                "required": [
                    "error",
                    "message"
                ],
                "properties": {
                    "error": {
                        "type": "string",
                        "enum": [
                            "BAD_REQUEST",
                            "UNAUTHENTICATED",
                            "API_KEY_REQUIRED",
                            "PLAN_REQUIRED",
                            "FORBIDDEN",
                            "NOT_FOUND",
                            "METHOD_NOT_ALLOWED",
                            "PAYLOAD_TOO_LARGE",
                            "ANALYSIS_IN_PROGRESS",
                            "TEXT_TOO_LONG",
                            "AI_DETECTION_LIMIT",
                            "PROCESSING_ERROR",
                            "SERVICE_UNAVAILABLE"
                        ],
                        "description": "Nekintamas klaidos kodas."
                    },
                    "message": {
                        "type": "string",
                        "description": "Paaiškinimas lietuvių kalba."
                    }
                },
                "additionalProperties": false
            },
            "ValidationError": {
                "type": "object",
                "required": [
                    "error",
                    "message",
                    "errors"
                ],
                "properties": {
                    "error": {
                        "type": "string",
                        "enum": [
                            "VALIDATION_FAILED"
                        ]
                    },
                    "message": {
                        "type": "string",
                        "description": "Pirmosios klaidos paaiškinimas lietuvių kalba."
                    },
                    "errors": {
                        "type": "object",
                        "description": "Klaidos pagal laukus: lauko pavadinimas ir jo klaidų sąrašas.",
                        "additionalProperties": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    }
                },
                "additionalProperties": false
            },
            "RateLimitError": {
                "type": "object",
                "required": [
                    "error",
                    "message",
                    "retry_after"
                ],
                "properties": {
                    "error": {
                        "type": "string",
                        "enum": [
                            "RATE_LIMITED"
                        ]
                    },
                    "message": {
                        "type": "string",
                        "description": "Paaiškinimas lietuvių kalba."
                    },
                    "retry_after": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Laukimo laikas sekundėmis, lygus antraštės `Retry-After` reikšmei."
                    }
                },
                "additionalProperties": false
            },
            "MonthlyLimitError": {
                "type": "object",
                "description": "Skaičius imkite iš `chars_left` ir `chars_limit`, ne iš `message`.",
                "required": [
                    "error",
                    "message",
                    "chars_left",
                    "chars_limit"
                ],
                "properties": {
                    "error": {
                        "type": "string",
                        "enum": [
                            "API_MONTHLY_LIMIT"
                        ]
                    },
                    "message": {
                        "type": "string",
                        "description": "Paaiškinimas lietuvių kalba."
                    },
                    "chars_left": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Šį mėnesį dar likusių simbolių skaičius. Jei jis didesnis nei 0, limitas neišnaudotas, bet tekstas į likutį netelpa."
                    },
                    "chars_limit": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Mėnesio simbolių limitas."
                    }
                },
                "additionalProperties": false
            }
        },
        "responses": {
            "BadRequest": {
                "description": "Netinkama užklausa.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "examples": {
                            "BAD_REQUEST": {
                                "summary": "Netinkama užklausa",
                                "value": {
                                    "error": "BAD_REQUEST",
                                    "message": "Netinkama užklausa."
                                }
                            }
                        }
                    }
                }
            },
            "Unauthenticated": {
                "description": "Trūksta API rakto, jis neteisingas arba atšauktas.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "examples": {
                            "UNAUTHENTICATED": {
                                "summary": "Nėra rakto",
                                "value": {
                                    "error": "UNAUTHENTICATED",
                                    "message": "Trūksta API rakto arba jis neteisingas."
                                }
                            }
                        }
                    }
                }
            },
            "Forbidden": {
                "description": "Prieiga neleidžiama. `API_KEY_REQUIRED` – siųstas ne API raktas, pvz., plėtinio ar programėlės prisijungimas. `PLAN_REQUIRED` – paskyra neturi galiojančio „Max“ plano; raktas vėl veiks, kai planas bus atnaujintas. `FORBIDDEN` – prieiga uždrausta dėl kitos priežasties.",
                "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/Error"
                        },
                        "examples": {
                            "API_KEY_REQUIRED": {
                                "summary": "Ne API raktas",
                                "value": {
                                    "error": "API_KEY_REQUIRED",
                                    "message": "Šiam adresui reikia API rakto, sukurto paskyroje."
                                }
                            },
                            "PLAN_REQUIRED": {
                                "summary": "Nėra „Max“ plano",
                                "value": {
                                    "error": "PLAN_REQUIRED",
                                    "message": "API galima naudoti tik su „Max“ planu."
                                }
                            },
                            "FORBIDDEN": {
                                "summary": "Prieiga uždrausta",
                                "value": {
                                    "error": "FORBIDDEN",
                                    "message": "Prieiga uždrausta."
                                }
                            }
                        }
                    }
                }
            },
            "NotFound": {
                "description": "Tokio adreso nėra.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "examples": {
                            "NOT_FOUND": {
                                "summary": "Nėra adreso",
                                "value": {
                                    "error": "NOT_FOUND",
                                    "message": "Adresas nerastas."
                                }
                            }
                        }
                    }
                }
            },
            "MethodNotAllowed": {
                "description": "Adresas šio metodo nepriima. Antraštė `Allow` nurodo tinkamus metodus.",
                "headers": {
                    "Allow": {
                        "$ref": "#/components/headers/Allow"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "examples": {
                            "METHOD_NOT_ALLOWED": {
                                "summary": "Netinkamas metodas",
                                "value": {
                                    "error": "METHOD_NOT_ALLOWED",
                                    "message": "Šiam adresui netinka užklausos metodas."
                                }
                            }
                        }
                    }
                }
            },
            "PayloadTooLarge": {
                "description": "Užklausa viršija serverio priimamą dydį.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "examples": {
                            "PAYLOAD_TOO_LARGE": {
                                "summary": "Per didelė užklausa",
                                "value": {
                                    "error": "PAYLOAD_TOO_LARGE",
                                    "message": "Užklausa per didelė."
                                }
                            }
                        }
                    }
                }
            },
            "TextValidationFailed": {
                "description": "`VALIDATION_FAILED` – laukas neužpildytas arba netinkamas, `errors` nurodo, kuris. Tokį patį atsakymą gaunate, kai JSON sugadintas arba trūksta antraštės `Content-Type: application/json`. `TEXT_TOO_LONG` – tekstas neviršija `maxLength`, bet dėl eilučių lūžių per ilgas apdoroti: sutrumpinkite jį arba siųskite dalimis.",
                "headers": {
                    "X-RateLimit-Limit": {
                        "$ref": "#/components/headers/X-RateLimit-Limit"
                    },
                    "X-RateLimit-Remaining": {
                        "$ref": "#/components/headers/X-RateLimit-Remaining"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "oneOf": [
                                {
                                    "$ref": "#/components/schemas/ValidationError"
                                },
                                {
                                    "$ref": "#/components/schemas/Error"
                                }
                            ]
                        },
                        "examples": {
                            "VALIDATION_FAILED": {
                                "summary": "Nėra teksto",
                                "value": {
                                    "error": "VALIDATION_FAILED",
                                    "message": "Laukas „Tekstas“ privalomas.",
                                    "errors": {
                                        "text": [
                                            "Laukas „Tekstas“ privalomas."
                                        ]
                                    }
                                }
                            },
                            "TEXT_TOO_LONG": {
                                "summary": "Per daug eilučių lūžių",
                                "value": {
                                    "error": "TEXT_TOO_LONG",
                                    "message": "Tekstas per ilgas: eilučių lūžiai užima vietos. Sutrumpinkite tekstą arba siųskite jį dalimis."
                                }
                            }
                        }
                    }
                }
            },
            "ValidationFailed": {
                "description": "Laukas neužpildytas arba netinkamas, pvz., tekstas per trumpas. `errors` nurodo, kuris. Tokį patį atsakymą gaunate, kai JSON sugadintas arba trūksta antraštės `Content-Type: application/json`.",
                "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/ValidationError"
                        },
                        "examples": {
                            "VALIDATION_FAILED": {
                                "summary": "Per trumpas tekstas",
                                "value": {
                                    "error": "VALIDATION_FAILED",
                                    "message": "Laukas „Tekstas“ turi būti bent 50 simbolių.",
                                    "errors": {
                                        "text": [
                                            "Laukas „Tekstas“ turi būti bent 50 simbolių."
                                        ]
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "AnalysisInProgress": {
                "description": "Ankstesnė šio naudotojo DI analizė dar vyksta. Kartokite, kai ji baigsis.",
                "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/Error"
                        },
                        "examples": {
                            "ANALYSIS_IN_PROGRESS": {
                                "summary": "Analizė vyksta",
                                "value": {
                                    "error": "ANALYSIS_IN_PROGRESS",
                                    "message": "Ankstesnė analizė dar vyksta. Palaukite, kol ji baigsis."
                                }
                            }
                        }
                    }
                }
            },
            "RateLimited": {
                "description": "Viršyta užklausų per minutę riba. Kartokite po `Retry-After` sekundžių.",
                "headers": {
                    "Retry-After": {
                        "$ref": "#/components/headers/Retry-After"
                    },
                    "X-RateLimit-Limit": {
                        "$ref": "#/components/headers/X-RateLimit-Limit"
                    },
                    "X-RateLimit-Remaining": {
                        "$ref": "#/components/headers/X-RateLimit-Remaining"
                    },
                    "X-RateLimit-Reset": {
                        "$ref": "#/components/headers/X-RateLimit-Reset"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/RateLimitError"
                        },
                        "examples": {
                            "RATE_LIMITED": {
                                "summary": "Per daug užklausų per minutę",
                                "value": {
                                    "error": "RATE_LIMITED",
                                    "message": "Per daug užklausų. Bandykite vėliau.",
                                    "retry_after": 60
                                }
                            }
                        }
                    }
                }
            },
            "TextLimitReached": {
                "description": "`RATE_LIMITED` – viršyta užklausų per minutę riba, kartokite po `Retry-After` sekundžių. `API_MONTHLY_LIMIT` – mėnesio simbolių limitas išnaudotas (`chars_left` lygus 0, `Retry-After` rodo, po kiek sekundžių limitas atsinaujins) arba tekstas netelpa į likutį (`chars_left` daugiau nei 0, antraštės `Retry-After` nėra): sutrumpinkite tekstą.",
                "headers": {
                    "Retry-After": {
                        "description": "Laukimo laikas sekundėmis iki kitos užklausos. Antraštės nėra, kai tekstas tik netelpa į likutį.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    "X-RateLimit-Limit": {
                        "$ref": "#/components/headers/X-RateLimit-Limit"
                    },
                    "X-RateLimit-Remaining": {
                        "$ref": "#/components/headers/X-RateLimit-Remaining"
                    },
                    "X-RateLimit-Reset": {
                        "$ref": "#/components/headers/X-RateLimit-Reset"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "oneOf": [
                                {
                                    "$ref": "#/components/schemas/RateLimitError"
                                },
                                {
                                    "$ref": "#/components/schemas/MonthlyLimitError"
                                }
                            ]
                        },
                        "examples": {
                            "RATE_LIMITED": {
                                "summary": "Per daug užklausų per minutę",
                                "value": {
                                    "error": "RATE_LIMITED",
                                    "message": "Per daug užklausų. Bandykite vėliau.",
                                    "retry_after": 60
                                }
                            },
                            "API_MONTHLY_LIMIT": {
                                "summary": "Mėnesio limitas išnaudotas",
                                "value": {
                                    "error": "API_MONTHLY_LIMIT",
                                    "message": "Šio mėnesio API simbolių limitas išnaudotas.",
                                    "chars_left": 0,
                                    "chars_limit": 1000000
                                }
                            },
                            "API_MONTHLY_LIMIT_TEXT_DOES_NOT_FIT": {
                                "summary": "Tekstas netelpa į likutį",
                                "value": {
                                    "error": "API_MONTHLY_LIMIT",
                                    "message": "Šiam tekstui neužtenka šio mėnesio API simbolių. Liko: 10.",
                                    "chars_left": 10,
                                    "chars_limit": 1000000
                                }
                            }
                        }
                    }
                }
            },
            "DetectionLimitReached": {
                "description": "`RATE_LIMITED` – viršyta užklausų per minutę riba, kartokite po `Retry-After` sekundžių. `AI_DETECTION_LIMIT` – šios dienos DI analizių limitas išnaudotas, `Retry-After` rodo, po kiek sekundžių jis atsinaujins.",
                "headers": {
                    "Retry-After": {
                        "$ref": "#/components/headers/Retry-After"
                    },
                    "X-RateLimit-Limit": {
                        "$ref": "#/components/headers/X-RateLimit-Limit"
                    },
                    "X-RateLimit-Remaining": {
                        "$ref": "#/components/headers/X-RateLimit-Remaining"
                    },
                    "X-RateLimit-Reset": {
                        "$ref": "#/components/headers/X-RateLimit-Reset"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "oneOf": [
                                {
                                    "$ref": "#/components/schemas/RateLimitError"
                                },
                                {
                                    "$ref": "#/components/schemas/Error"
                                }
                            ]
                        },
                        "examples": {
                            "RATE_LIMITED": {
                                "summary": "Per daug užklausų per minutę",
                                "value": {
                                    "error": "RATE_LIMITED",
                                    "message": "Per daug užklausų. Bandykite vėliau.",
                                    "retry_after": 60
                                }
                            },
                            "AI_DETECTION_LIMIT": {
                                "summary": "Dienos limitas išnaudotas",
                                "value": {
                                    "error": "AI_DETECTION_LIMIT",
                                    "message": "Šiandienos DI analizių limitas išnaudotas."
                                }
                            }
                        }
                    }
                }
            },
            "ProcessingError": {
                "description": "Nepavyko apdoroti užklausos. Ji į limitus neįskaičiuota, bandykite dar kartą.",
                "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/Error"
                        },
                        "examples": {
                            "PROCESSING_ERROR": {
                                "summary": "Apdorojimo klaida",
                                "value": {
                                    "error": "PROCESSING_ERROR",
                                    "message": "Klaida apdorojant tekstą. Bandykite dar kartą."
                                }
                            }
                        }
                    }
                }
            },
            "ServiceUnavailable": {
                "description": "Paslauga laikinai nepasiekiama, pvz., atnaujinimo metu. Bandykite po kelių minučių.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "examples": {
                            "SERVICE_UNAVAILABLE": {
                                "summary": "Paslauga nepasiekiama",
                                "value": {
                                    "error": "SERVICE_UNAVAILABLE",
                                    "message": "Paslauga laikinai nepasiekiama. Bandykite vėliau."
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}