{
  "openapi": "3.0.3",
  "info": {
    "title": "SpoolOS by Printhia API",
    "version": "1.2.0",
    "description": "REST API pre sklad 3D tlače. API kľúče vyžadujú Pro alebo Business. OAuth je dostupný výhradne na MCP endpoint /mcp v pláne Business. Pri zápise si vyžiadajte súhlas používateľa; koncepty dokladov sa schvaľujú v aplikácii.",
    "contact": {"name":"SpoolOS by Printhia","url":"https://sklad.printhia.sk/contact","email":"obchod@printhia.sk"}
  },
  "servers": [{"url":"https://sklad.printhia.sk"}],
  "x-api-lifecycle": {"status":"active","minimumDeprecationNoticeDays":90,"policy":"https://sklad.printhia.sk/developers#verziovanie"},
  "components": {
    "headers": {
      "RateLimitPolicy": {"description":"Enforced quotas as IETF draft structured fields: policy name, q quota, w window in seconds. source-ip applies before auth, api-key and organization after auth.","schema":{"type":"string","example":"\"api-key\";q=120;w=60"}},
      "RateLimit": {"description":"Actual counter state: r remaining requests and t reset in seconds. Omitted when the counter is unavailable. Retry-After takes precedence on HTTP 429.","schema":{"type":"string","example":"\"api-key\";r=43;t=27"}},
      "DeprecationPolicy": {"description":"RFC 9745 deprecation policy link. Active v1 sends no Deprecation or Sunset date; removal requires at least 90 days notice.","schema":{"type":"string","example":"<https://sklad.printhia.sk/developers#verziovanie>; rel=\"deprecation\"; type=\"text/html\""}}
    },
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "API kľúč v hlavičke Authorization: Bearer. scopes=null povoľuje čítanie, prázdny zoznam nepovoľuje prístup k zdrojom; zápis vyžaduje výslovne pridelený scope. x-required-api-key-scopes na operácii uvádza oprávnenie pre obmedzený kľúč.",
        "x-api-key-scopes": {
          "filaments": "Čítanie filamentov a skladových stavov.",
          "filaments:write": "Vytvorenie a úprava katalógových filamentov.",
          "prijemky:read": "Príjemky a dodávatelia, iba čítanie.",
          "prijemky:write": "Príjemky a dodávatelia, zápis a spätne kompatibilné čítanie.",
          "vydajky:read": "Výdajky, iba čítanie.",
          "vydajky:write": "Výdajky, zápis a spätne kompatibilné čítanie.",
          "uhrady:read": "Úhrady, iba čítanie.",
          "uhrady:write": "Úhrady, zápis a spätne kompatibilné čítanie.",
          "drafts:read": "Koncepty, iba čítanie.",
          "drafts:write": "Koncepty, zápis a spätne kompatibilné čítanie.",
          "printers": "Čítanie tlačiarní cez MCP.",
          "operacie:write": "Fronta tlače a zákazky cez MCP."
        }
      },
      "mcpOAuth": {
        "type": "oauth2",
        "description": "Iba MCP /mcp, nie REST /api/v1. Authorization Code s PKCE S256. Identity scopes nemenia skladové oprávnenia, ktoré určuje rola používateľa. Issuer: https://vlbmbzerxqidalnrheps.supabase.co/auth/v1.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://vlbmbzerxqidalnrheps.supabase.co/auth/v1/oauth/authorize",
            "tokenUrl": "https://vlbmbzerxqidalnrheps.supabase.co/auth/v1/oauth/token",
            "scopes": {
              "openid": "Identita používateľa.",
              "profile": "Profil používateľa.",
              "email": "E-mail používateľa.",
              "offline_access": "Obnova prístupu pomocou refresh tokenu."
            }
          }
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {"type":"string","description":"Popis chyby v slovenčine."},
          "code": {"type":"string","description":"Stabilný strojový kód chyby."},
          "message": {"type":"string","description":"Správa pre volajúceho."},
          "resolution": {"type":"string","description":"Postup nápravy alebo odkaz na dokumentáciu."}
        },
        "required": ["error","code","message","resolution"],
        "example": {
          "error": "Požadovaný API endpoint neexistuje.",
          "code": "not_found",
          "message": "Požadovaný API endpoint neexistuje.",
          "resolution": "Skontrolujte cestu v /openapi.json a identifikátor zdroja vo svojej organizácii."
        }
      },
      "Filament": {
        "type": "object",
        "properties": {
          "id": {"type":"string","format":"uuid"},
          "code": {"type":"string","description":"Skladový kód (SKU)."},
          "brand": {"type":"string","nullable":true},
          "material": {"type":"string"},
          "color_name": {"type":"string"},
          "color_hex": {"type":"string"},
          "ean": {"type":"string","nullable":true},
          "current_weight_g": {
            "type": "number",
            "description": "Zobrazovací údaj katalógu, aktualizovaný aj z AMS. Nepoužívajte na účtovné ocenenie ani namiesto skladových vrstiev FIFO."
          },
          "spool_weight_g": {"type":"number","description":"Menovitá návažka kotúča (plná kapacita) v gramoch."},
          "status": {"type":"string"},
          "unit_price_bez_dph": {"type":"number","description":"EUR za celý kotúč."},
          "product_url": {"type":"string","nullable":true}
        }
      },
      "FilamentCreate": {
        "type": "object",
        "required": ["code","material","color_name"],
        "properties": {
          "code": {"type":"string","maxLength":60,"description":"Skladový kód (SKU), jedinečný v rámci organizácie."},
          "material": {"type":"string","maxLength":80},
          "color_name": {"type":"string","maxLength":80},
          "brand": {"type":"string","maxLength":80,"description":"Predvolene \"Neznáma značka\", ak chýba."},
          "color_hex": {"type":"string","description":"napr. #000000. Pri neplatnom formáte sa uloží #888888."},
          "spool_weight_g": {"type":"number","description":"Predvolene 1000."},
          "unit_price_bez_dph": {"type":"number","description":"Cena bez DPH za jeden kotúč, v EUR. Predvolene 0."},
          "ean": {"type":"string","description":"8 až 14 číslic. Pri neplatnom formáte sa neuloží (null)."},
          "product_url": {"type":"string","description":"Musí začínať http(s)://."},
          "diameter_mm": {"type":"number","description":"Predvolene 1.75."}
        }
      },
      "FilamentPatch": {
        "type": "object",
        "description": "Všetky polia voliteľné - posiela sa iba to, čo sa má zmeniť.",
        "properties": {
          "brand": {"type":"string","maxLength":80},
          "material": {"type":"string","maxLength":80},
          "color_name": {"type":"string","maxLength":80},
          "color_hex": {"type":"string"},
          "ean": {"type":"string"},
          "product_url": {"type":"string"},
          "unit_price_bez_dph": {"type":"number"},
          "spool_weight_g": {"type":"number"},
          "diameter_mm": {"type":"number"}
        }
      },
      "VydajkaItem": {
        "type": "object",
        "required": ["filament_id","qty_g"],
        "properties": {
          "filament_id": {"type":"string","format":"uuid","description":"Musí patriť tvojej organizácii."},
          "qty_g": {"type":"number","description":"Množstvo v gramoch, v rozsahu (0, 1000000]."},
          "price_per_kg": {"type":"number","description":"Použije sa len pri valuation_method=avg. Pri fifo sa dopočíta zo skladových vrstiev."}
        }
      },
      "VydajkaCreate": {
        "type": "object",
        "required": ["purpose","recipient","items"],
        "properties": {
          "purpose": {"type":"string","enum":["vyroba","vzorka","zmluva","odpis","presun"],"description":"Účel výdaja."},
          "writeoff_reason": {"type":"string","enum":["likvidacia","manko","skoda"],"nullable":true,"description":"Povinné keď purpose=odpis, inak ignorované/null."},
          "recipient": {"type":"string","maxLength":200},
          "items": {"type":"array","minItems":1,"maxItems":200,"items":{"$ref":"#/components/schemas/VydajkaItem"}},
          "doc_date": {"type":"string","format":"date","description":"Predvolene dnešný dátum."},
          "delivery_date": {"type":"string","format":"date"},
          "order_ref": {"type":"string","maxLength":100},
          "notes": {"type":"string","maxLength":1000},
          "recipient_ico": {"type":"string","maxLength":20},
          "recipient_dic": {"type":"string","maxLength":20},
          "recipient_vat_id": {"type":"string","maxLength":20},
          "valuation_method": {"type":"string","enum":["fifo","avg"],"description":"Predvolene fifo."},
          "warehouse_id": {"type":"string","format":"uuid","description":"Predvolene organizácii priradený Materiálny sklad."}
        }
      },
      "VydajkaCreated": {
        "type": "object",
        "properties": {
          "ok": {"type":"boolean"},
          "doc_number": {"type":"string","example":"VD-2026-001"},
          "doc_id": {"type":"string","format":"uuid"},
          "subtotal_bez_dph": {"type":"number"},
          "warehouse_id": {"type":"string","format":"uuid"},
          "idempotent": {"type":"boolean","description":"Prítomné a true len pri opakovanom volaní s rovnakým Idempotency-Key."}
        }
      },
      "PrijemkaItem": {
        "type": "object",
        "required": ["filament_id","qty","weight_g"],
        "properties": {
          "filament_id": {
            "type": "string",
            "format": "uuid",
            "description": "Existujúci filament tvojej organizácie. Voľný text sa odmietne - filament najprv vytvor cez POST /v1/filaments."
          },
          "qty": {"type":"integer","description":"Počet kotúčov (celé číslo > 0)."},
          "weight_g": {"type":"integer","description":"Návažka na kotúč v gramoch, v rozsahu [0, 10000]."},
          "price_bez_dph": {"type":"number","description":"Cena bez DPH za kotúč, v EUR. Voliteľné, predvolene 0. Rozsah [0, 100000]."}
        }
      },
      "PrijemkaCreate": {
        "type": "object",
        "required": ["supplier_name","items"],
        "properties": {
          "supplier_name": {"type":"string","maxLength":200},
          "items": {"type":"array","minItems":1,"maxItems":200,"items":{"$ref":"#/components/schemas/PrijemkaItem"}},
          "invoice_number": {"type":"string","maxLength":200},
          "notes": {"type":"string","maxLength":2000},
          "supplier_id": {"type":"string","format":"uuid","description":"Existujúci dodávateľ (z GET /v1/suppliers). Musí patriť tvojej organizácii."},
          "supplier_ico": {"type":"string","maxLength":20},
          "supplier_dic": {"type":"string","maxLength":20},
          "supplier_vat_id": {"type":"string","maxLength":20},
          "supplier_address": {"type":"string","maxLength":200},
          "doc_date": {"type":"string","format":"date","description":"Predvolene dnešný dátum."},
          "delivery_date": {"type":"string","format":"date"},
          "warehouse_id": {"type":"string","format":"uuid","description":"Predvolene organizácii priradený Materiálny sklad."},
          "force": {"type":"boolean","description":"true obíde 409 duplicitnej faktúry a uloží doklad aj tak."}
        }
      },
      "PrijemkaCreated": {
        "type": "object",
        "properties": {
          "ok": {"type":"boolean"},
          "doc_number": {"type":"string","example":"PR-2026-001"},
          "doc_id": {"type":"string","format":"uuid"},
          "subtotal_bez_dph": {"type":"number"},
          "warehouse_id": {"type":"string","format":"uuid"},
          "idempotent": {"type":"boolean","description":"Prítomné a true len pri opakovanom volaní s rovnakým Idempotency-Key."}
        }
      },
      "PrijemkaListItem": {
        "type": "object",
        "properties": {
          "id": {"type":"string","format":"uuid"},
          "doc_number": {"type":"string"},
          "doc_date": {"type":"string","format":"date"},
          "supplier_name": {"type":"string"},
          "invoice_number": {"type":"string","nullable":true},
          "subtotal_bez_dph": {"type":"number"},
          "voided_at": {"type":"string","format":"date-time","nullable":true},
          "created_at": {"type":"string","format":"date-time"}
        }
      },
      "VydajkaListItem": {
        "type": "object",
        "properties": {
          "id": {"type":"string","format":"uuid"},
          "doc_number": {"type":"string"},
          "doc_date": {"type":"string","format":"date"},
          "purpose": {"type":"string"},
          "writeoff_reason": {"type":"string","nullable":true},
          "recipient": {"type":"string"},
          "order_ref": {"type":"string","nullable":true},
          "subtotal_bez_dph": {"type":"number"},
          "voided_at": {"type":"string","format":"date-time","nullable":true},
          "created_at": {"type":"string","format":"date-time"}
        }
      },
      "StockRow": {
        "type": "object",
        "properties": {
          "filament_id": {"type":"string","format":"uuid","nullable":true},
          "code": {"type":"string","nullable":true},
          "brand": {"type":"string","nullable":true},
          "material": {"type":"string","nullable":true},
          "color_name": {"type":"string","nullable":true},
          "color_hex": {"type":"string","nullable":true},
          "status": {"type":"string","description":"active / low / empty / archived.","nullable":true},
          "spool_weight_g": {"type":"number","nullable":true},
          "warehouse_id": {"type":"string","format":"uuid"},
          "current_weight_g": {"type":"number","description":"Aktuálny zostatok v tomto sklade (g)."},
          "received_total_g": {"type":"number"},
          "last_movement_at": {"type":"string","format":"date-time","nullable":true}
        }
      },
      "Supplier": {
        "type": "object",
        "properties": {
          "id": {"type":"string","format":"uuid"},
          "name": {"type":"string"},
          "ico": {"type":"string","nullable":true},
          "dic": {"type":"string","nullable":true},
          "ic_dph": {"type":"string","nullable":true},
          "address": {"type":"string","nullable":true},
          "contact_person": {"type":"string","nullable":true},
          "phone": {"type":"string","nullable":true},
          "email": {"type":"string","nullable":true},
          "shop_url": {"type":"string","nullable":true},
          "lead_time_days": {"type":"integer","nullable":true}
        }
      },
      "UhradaCreate": {
        "type": "object",
        "required": ["amount"],
        "properties": {
          "amount": {"type":"number","description":"Suma úhrady v EUR, v rozsahu (0, 1000000]."},
          "doc_number": {"type":"string","description":"Výdajka, ku ktorej sa úhrada viaže (napr. VD-2026-042). Nekombinuj s order_ref."},
          "order_ref": {"type":"string","maxLength":100,"description":"Referencia objednávky. Nekombinuj s doc_number."},
          "paid_at": {"type":"string","format":"date","description":"Dátum úhrady. Predvolene dnešný."},
          "currency": {"type":"string","description":"3-písmenový kód, predvolene EUR."},
          "vs": {"type":"string","maxLength":30,"description":"Variabilný symbol."},
          "note": {"type":"string","maxLength":500}
        }
      },
      "Uhrada": {
        "type": "object",
        "properties": {
          "id": {"type":"string","format":"uuid"},
          "doc_type": {"type":"string","enum":["vydajka","order"],"nullable":true},
          "doc_id": {"type":"string","format":"uuid","nullable":true},
          "order_ref": {"type":"string","nullable":true},
          "amount": {"type":"number"},
          "currency": {"type":"string"},
          "paid_at": {"type":"string","format":"date"},
          "source": {"type":"string"},
          "vs": {"type":"string","nullable":true},
          "note": {"type":"string","nullable":true},
          "created_at": {"type":"string","format":"date-time"}
        }
      },
      "UnpaidVydajka": {
        "type": "object",
        "properties": {
          "doc_number": {"type":"string"},
          "doc_date": {"type":"string","format":"date","nullable":true},
          "recipient": {"type":"string","nullable":true},
          "subtotal_bez_dph": {"type":"number"},
          "paid": {"type":"number"},
          "outstanding": {"type":"number"}
        }
      },
      "DraftCreate": {
        "description": "Koncept príjemky alebo výdajky. Doklad vznikne až po schválení v aplikácii.",
        "oneOf": [
          {
            "type": "object",
            "required": ["doc_type","supplier_name","items"],
            "properties": {
              "doc_type": {"type":"string","enum":["prijemka"]},
              "supplier_name": {"type":"string","maxLength":200},
              "items": {"type":"array","minItems":1,"maxItems":200,"items":{"$ref":"#/components/schemas/PrijemkaItem"}},
              "invoice_number": {"type":"string","maxLength":200},
              "notes": {"type":"string","maxLength":2000},
              "supplier_id": {"type":"string","format":"uuid","description":"Existujúci dodávateľ (z GET /v1/suppliers). Musí patriť tvojej organizácii."},
              "supplier_ico": {"type":"string","maxLength":20},
              "supplier_dic": {"type":"string","maxLength":20},
              "supplier_vat_id": {"type":"string","maxLength":20},
              "supplier_address": {"type":"string","maxLength":200},
              "doc_date": {"type":"string","format":"date","description":"Predvolene dnešný dátum."},
              "delivery_date": {"type":"string","format":"date"},
              "warehouse_id": {"type":"string","format":"uuid","description":"Predvolene organizácii priradený Materiálny sklad."},
              "force": {"type":"boolean","description":"true obíde 409 duplicitnej faktúry a uloží doklad aj tak."}
            }
          },
          {
            "type": "object",
            "required": ["doc_type","purpose","recipient","items"],
            "properties": {
              "doc_type": {"type":"string","enum":["vydajka"]},
              "purpose": {"type":"string","enum":["vyroba","vzorka","zmluva","odpis","presun"],"description":"Účel výdaja."},
              "writeoff_reason": {"type":"string","enum":["likvidacia","manko","skoda"],"nullable":true,"description":"Povinné keď purpose=odpis, inak ignorované/null."},
              "recipient": {"type":"string","maxLength":200},
              "items": {"type":"array","minItems":1,"maxItems":200,"items":{"$ref":"#/components/schemas/VydajkaItem"}},
              "doc_date": {"type":"string","format":"date","description":"Predvolene dnešný dátum."},
              "delivery_date": {"type":"string","format":"date"},
              "order_ref": {"type":"string","maxLength":100},
              "notes": {"type":"string","maxLength":1000},
              "recipient_ico": {"type":"string","maxLength":20},
              "recipient_dic": {"type":"string","maxLength":20},
              "recipient_vat_id": {"type":"string","maxLength":20},
              "valuation_method": {"type":"string","enum":["fifo","avg"],"description":"Predvolene fifo."},
              "warehouse_id": {"type":"string","format":"uuid","description":"Predvolene organizácii priradený Materiálny sklad."}
            }
          }
        ],
        "discriminator": {"propertyName":"doc_type"}
      },
      "Draft": {
        "type": "object",
        "properties": {
          "id": {"type":"string","format":"uuid"},
          "doc_type": {"type":"string","enum":["prijemka","vydajka"]},
          "source": {"type":"string","enum":["mcp","api","ai","manual"]},
          "status": {"type":"string","enum":["pending","approved","rejected"]},
          "error": {"type":"string","nullable":true},
          "result_doc_id": {"type":"string","format":"uuid","nullable":true},
          "result_doc_number": {"type":"string","nullable":true},
          "payload": {"oneOf":[{"$ref":"#/components/schemas/PrijemkaCreate"},{"$ref":"#/components/schemas/VydajkaCreate"}]},
          "decided_at": {"type":"string","format":"date-time","nullable":true},
          "created_at": {"type":"string","format":"date-time"}
        }
      },
      "ApiIndex": {
        "type": "object",
        "required": ["name","version","documentation","openapi","rest","mcp","authentication","sandbox","cli"],
        "properties": {
          "name": {"type":"string"},
          "version": {"type":"string"},
          "documentation": {"type":"string","format":"uri"},
          "openapi": {"type":"string","format":"uri"},
          "rest": {"type":"string","format":"uri"},
          "mcp": {
            "type": "object",
            "properties": {"url":{"type":"string"},"transport":{"type":"string"},"authentication":{"type":"array","items":{"type":"string"}}}
          },
          "authentication": {"type":"object","additionalProperties":{"type":"string"}},
          "sandbox": {
            "type": "object",
            "properties": {"url":{"type":"string"},"authentication":{"type":"string"},"read_only":{"type":"boolean"},"data":{"type":"string"}}
          },
          "cli": {"type":"string","format":"uri"}
        }
      },
      "SandboxStock": {
        "type": "object",
        "required": ["sandbox","read_only","data_source","count","stock"],
        "properties": {
          "sandbox": {"type":"boolean","enum":[true]},
          "read_only": {"type":"boolean","enum":[true]},
          "data_source": {"type":"string","enum":["fictional"]},
          "count": {"type":"integer","minimum":0},
          "stock": {"type":"array","items":{"$ref":"#/components/schemas/StockRow"}}
        }
      }
    }
  },
  "security": [{"bearerAuth":[]}],
  "paths": {
    "/api/v1/filaments": {
      "get": {
        "summary": "Zoznam filamentov organizácie",
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "organization_id": {"type":"string","format":"uuid"},
                    "count": {"type":"integer"},
                    "filaments": {"type":"array","items":{"$ref":"#/components/schemas/Filament"}}
                  }
                }
              }
            }
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Nedostatočné oprávnenie alebo nepodporovaný režim organizácie.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "listFilaments",
        "description": "Zoznam filamentov organizácie. Pracuje iba s organizáciou API kľúča. Čítanie bez zmeny údajov. Kľúč so scopes=null má prístup na čítanie. Pre obmedzený kľúč je potrebné oprávnenie filaments.",
        "x-required-api-key-scopes": ["filaments"]
      },
      "post": {
        "summary": "Vytvorenie katalógového filamentu (scope filaments:write)",
        "requestBody": {"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilamentCreate"}}}},
        "responses": {
          "201": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Vytvorené",
            "content": {"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"filament":{"$ref":"#/components/schemas/Filament"}}}}}
          },
          "400": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatné telo","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný kľúč","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Chýba scope filaments:write alebo limit plánu","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "409": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"SKU už existuje","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "createFilament",
        "description": "Vytvorenie katalógového filamentu (scope filaments:write). Pracuje iba s organizáciou API kľúča. Zápis vyžaduje explicitné oprávnenie kľúča a potvrdený zámer používateľa. Pre obmedzený kľúč je potrebné oprávnenie filaments:write.",
        "x-required-api-key-scopes": ["filaments:write"]
      }
    },
    "/api/v1/filaments/{id}": {
      "patch": {
        "summary": "Úprava katalógových polí filamentu (scope filaments:write)",
        "parameters": [{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Parameter id."}],
        "requestBody": {"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilamentPatch"}}}},
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "OK",
            "content": {"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"filament":{"$ref":"#/components/schemas/Filament"}}}}}
          },
          "400": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatné telo alebo žiadne povolené pole","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Nedostatočné oprávnenie alebo nepodporovaný režim organizácie.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "404": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Filament neexistuje alebo nepatrí organizácii","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "updateFilament",
        "description": "Úprava katalógových polí filamentu (scope filaments:write). Pracuje iba s organizáciou API kľúča. Zápis vyžaduje explicitné oprávnenie kľúča a potvrdený zámer používateľa. Pre obmedzený kľúč je potrebné oprávnenie filaments:write.",
        "x-required-api-key-scopes": ["filaments:write"]
      }
    },
    "/api/v1/vydajky": {
      "get": {
        "summary": "Zoznam výdajok organizácie",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {"type":"integer","default":50,"maximum":200,"minimum":1},
            "description": "Počet záznamov, maximálne 200."
          },
          {"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Doklady od tohto dátumu (doc_date)."},
          {"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Doklady do tohto dátumu (doc_date)."},
          {"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Hľadanie v recipient / doc_number / order_ref."}
        ],
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "organization_id": {"type":"string","format":"uuid"},
                    "count": {"type":"integer"},
                    "vydajky": {"type":"array","items":{"$ref":"#/components/schemas/VydajkaListItem"}}
                  }
                }
              }
            }
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Kľúč nemá oprávnenie na výdajky","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "listIssues",
        "description": "Zoznam výdajok organizácie. Pracuje iba s organizáciou API kľúča. Čítanie bez zmeny údajov. Kľúč so scopes=null má prístup na čítanie. Pre obmedzený kľúč je potrebné oprávnenie vydajky:read.",
        "x-required-api-key-scopes": ["vydajky:read"]
      },
      "post": {
        "summary": "Vytvorenie výdajky - vystavený, nemenný účtovný doklad (zákon 431/2002), odpisuje materiál zo skladu (scope vydajky:write)",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "schema": {"type":"string","format":"uuid"},
            "description": "UUID v4 vygenerované raz na obchodnú operáciu a znovu použité pri opakovaní (retry). Opakované volanie vráti pôvodný doc_number s idempotent=true a nevytvorí druhý doklad."
          }
        ],
        "requestBody": {"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VydajkaCreate"}}}},
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Idempotentné opakovanie - vráti pôvodný doklad (idempotent=true)",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/VydajkaCreated"}}}
          },
          "201": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vytvorené","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VydajkaCreated"}}}},
          "400": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Neplatné telo, neplatný purpose/writeoff_reason alebo cudzí/neexistujúci filament_id",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný kľúč","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Chýba scope vydajky:write alebo organizácia beží v režime Hobby",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "404": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "warehouse_id neexistuje alebo nepatrí organizácii",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "409": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Doklad s daným Idempotency-Key sa práve spracúva",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "422": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Biznis validácia (napr. nedostatočný zostatok na sklade)",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "429": {
            "description": "Prekročený limit požiadaviek",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "createIssue",
        "description": "Vytvorenie výdajky - vystavený, nemenný účtovný doklad (zákon 431/2002), odpisuje materiál zo skladu (scope vydajky:write). Pracuje iba s organizáciou API kľúča. Zápis vyžaduje explicitné oprávnenie kľúča a potvrdený zámer používateľa. Pre obmedzený kľúč je potrebné oprávnenie vydajky:write.",
        "x-required-api-key-scopes": ["vydajky:write"]
      }
    },
    "/api/v1/prijemky": {
      "get": {
        "summary": "Zoznam príjemok organizácie",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {"type":"integer","default":50,"maximum":200,"minimum":1},
            "description": "Počet záznamov, maximálne 200."
          },
          {"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Doklady od tohto dátumu (doc_date)."},
          {"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Doklady do tohto dátumu (doc_date)."},
          {"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Hľadanie v supplier_name / invoice_number / doc_number."}
        ],
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "organization_id": {"type":"string","format":"uuid"},
                    "count": {"type":"integer"},
                    "prijemky": {"type":"array","items":{"$ref":"#/components/schemas/PrijemkaListItem"}}
                  }
                }
              }
            }
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Kľúč nemá oprávnenie na príjemky","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "listReceipts",
        "description": "Zoznam príjemok organizácie. Pracuje iba s organizáciou API kľúča. Čítanie bez zmeny údajov. Kľúč so scopes=null má prístup na čítanie. Pre obmedzený kľúč je potrebné oprávnenie prijemky:read.",
        "x-required-api-key-scopes": ["prijemky:read"]
      },
      "post": {
        "summary": "Vytvorenie príjemky - vystavený, nemenný účtovný doklad (zákon 431/2002), naskladní materiál (scope prijemky:write)",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "schema": {"type":"string","format":"uuid"},
            "description": "UUID v4 vygenerované raz na operáciu a znovu použité pri opakovaní. Opakované volanie vráti pôvodný doc_number s idempotent=true."
          }
        ],
        "requestBody": {"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrijemkaCreate"}}}},
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Idempotentné opakovanie - vráti pôvodný doklad (idempotent=true)",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/PrijemkaCreated"}}}
          },
          "201": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vytvorené","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrijemkaCreated"}}}},
          "400": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Neplatné telo alebo cudzí/neexistujúci filament_id",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný kľúč","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Chýba scope prijemky:write alebo organizácia beží v režime Hobby",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "404": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "warehouse_id neexistuje alebo nepatrí organizácii",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "409": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Duplicitná faktúra (rovnaké invoice_number a dodávateľ) alebo prebiehajúce spracovanie Idempotency-Key",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "422": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Biznis validácia (napr. limit skladu)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "createReceipt",
        "description": "Vytvorenie príjemky - vystavený, nemenný účtovný doklad (zákon 431/2002), naskladní materiál (scope prijemky:write). Pracuje iba s organizáciou API kľúča. Zápis vyžaduje explicitné oprávnenie kľúča a potvrdený zámer používateľa. Pre obmedzený kľúč je potrebné oprávnenie prijemky:write.",
        "x-required-api-key-scopes": ["prijemky:write"]
      }
    },
    "/api/v1/stock": {
      "get": {
        "summary": "Skladové stavy po skladoch (warehouse_stocks x filamenty)",
        "parameters": [
          {"name":"warehouse","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"description":"Filtruj na jeden sklad."},
          {"name":"material","in":"query","required":false,"schema":{"type":"string"},"description":"Presný materiál (bez ohľadu na veľkosť písmen)."},
          {"name":"below_threshold","in":"query","required":false,"schema":{"type":"boolean"},"description":"true = len filamenty so stavom low/empty."},
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {"type":"integer","default":50,"maximum":200,"minimum":1},
            "description": "Počet záznamov, maximálne 200."
          }
        ],
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "organization_id": {"type":"string","format":"uuid"},
                    "count": {"type":"integer"},
                    "stock": {"type":"array","items":{"$ref":"#/components/schemas/StockRow"}}
                  }
                }
              }
            }
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Kľúč nemá oprávnenie na sklad","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "listStock",
        "description": "Skladové stavy po skladoch (warehouse_stocks x filamenty). Pracuje iba s organizáciou API kľúča. Čítanie bez zmeny údajov. Kľúč so scopes=null má prístup na čítanie. Pre obmedzený kľúč je potrebné oprávnenie filaments.",
        "x-required-api-key-scopes": ["filaments"]
      }
    },
    "/api/v1/suppliers": {
      "get": {
        "summary": "Zoznam dodávateľov organizácie",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {"type":"integer","default":50,"maximum":200,"minimum":1},
            "description": "Počet záznamov, maximálne 200."
          },
          {"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Hľadanie v name / ico / ic_dph."}
        ],
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "organization_id": {"type":"string","format":"uuid"},
                    "count": {"type":"integer"},
                    "suppliers": {"type":"array","items":{"$ref":"#/components/schemas/Supplier"}}
                  }
                }
              }
            }
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Kľúč nemá oprávnenie na dodávateľov","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "listSuppliers",
        "description": "Zoznam dodávateľov organizácie. Pracuje iba s organizáciou API kľúča. Čítanie bez zmeny údajov. Kľúč so scopes=null má prístup na čítanie. Pre obmedzený kľúč je potrebné oprávnenie prijemky:read.",
        "x-required-api-key-scopes": ["prijemky:read"]
      }
    },
    "/api/v1/uhrady": {
      "get": {
        "summary": "Zoznam úhrad, alebo neuhradené výdajky cez ?unpaid=true",
        "parameters": [
          {
            "name": "unpaid",
            "in": "query",
            "required": false,
            "schema": {"type":"boolean"},
            "description": "true = vráti neuhradené výdajky (subtotal mínus zaevidované úhrady)."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {"type":"integer","default":50,"maximum":200,"minimum":1},
            "description": "Počet záznamov, maximálne 200."
          }
        ],
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "organization_id": {"type":"string","format":"uuid"},
                        "count": {"type":"integer"},
                        "uhrady": {"type":"array","items":{"$ref":"#/components/schemas/Uhrada"}}
                      }
                    },
                    {
                      "type": "object",
                      "properties": {
                        "organization_id": {"type":"string","format":"uuid"},
                        "count": {"type":"integer"},
                        "total_outstanding": {"type":"number"},
                        "unpaid": {"type":"array","items":{"$ref":"#/components/schemas/UnpaidVydajka"}}
                      }
                    }
                  ]
                }
              }
            }
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Kľúč nemá oprávnenie na úhrady","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "listPayments",
        "description": "Zoznam úhrad, alebo neuhradené výdajky cez ?unpaid=true. Pracuje iba s organizáciou API kľúča. Čítanie bez zmeny údajov. Kľúč so scopes=null má prístup na čítanie. Pre obmedzený kľúč je potrebné oprávnenie uhrady:read.",
        "x-required-api-key-scopes": ["uhrady:read"]
      },
      "post": {
        "summary": "Zaevidovanie úhrady k výdajke alebo objednávke (scope uhrady:write)",
        "requestBody": {"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UhradaCreate"}}}},
        "responses": {
          "201": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Zaevidované",
            "content": {"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"uhrada":{"$ref":"#/components/schemas/Uhrada"}}}}}
          },
          "400": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Neplatné telo (napr. doc_number aj order_ref súčasne)",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Chýba scope uhrady:write alebo režim Hobby","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "404": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Výdajka (doc_number) neexistuje alebo nepatrí organizácii",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}
          },
          "422": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Výdajka je stornovaná","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "createPayment",
        "description": "Zaevidovanie úhrady k výdajke alebo objednávke (scope uhrady:write). Pracuje iba s organizáciou API kľúča. Zápis vyžaduje explicitné oprávnenie kľúča a potvrdený zámer používateľa. Pre obmedzený kľúč je potrebné oprávnenie uhrady:write.",
        "x-required-api-key-scopes": ["uhrady:write"]
      }
    },
    "/api/v1/drafts": {
      "get": {
        "summary": "Zoznam konceptov (Koncepty)",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {"type":"integer","default":50,"maximum":200,"minimum":1},
            "description": "Počet záznamov, maximálne 200."
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {"type":"string","enum":["pending","approved","rejected"]},
            "description": "Parameter status."
          }
        ],
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "organization_id": {"type":"string","format":"uuid"},
                    "count": {"type":"integer"},
                    "drafts": {"type":"array","items":{"$ref":"#/components/schemas/Draft"}}
                  }
                }
              }
            }
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Kľúč nemá oprávnenie na koncepty","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "listDrafts",
        "description": "Zoznam konceptov (Koncepty). Pracuje iba s organizáciou API kľúča. Čítanie bez zmeny údajov. Kľúč so scopes=null má prístup na čítanie. Pre obmedzený kľúč je potrebné oprávnenie drafts:read.",
        "x-required-api-key-scopes": ["drafts:read"]
      },
      "post": {
        "summary": "Vytvorenie konceptu dokladu na schválenie namiesto priameho zaúčtovania (scope drafts:write)",
        "requestBody": {"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftCreate"}}}},
        "responses": {
          "201": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Vytvorený koncept",
            "content": {"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"draft":{"$ref":"#/components/schemas/Draft"}}}}}
          },
          "400": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný doc_type alebo telo dokladu","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný alebo chýbajúci API kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"REST API vyžaduje plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "403": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Chýba scope drafts:write alebo režim Hobby","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {
            "description": "Prekročený limit požiadaviek.",
            "content": {"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},
            "headers": {"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"description":"Počet sekúnd do ďalšieho pokusu.","schema":{"type":"integer","minimum":1}}}
          },
          "500": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Vnútorná chyba servera.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        },
        "operationId": "createDraft",
        "description": "Vytvorenie konceptu dokladu na schválenie namiesto priameho zaúčtovania (scope drafts:write). Pracuje iba s organizáciou API kľúča. Zápis vyžaduje explicitné oprávnenie kľúča a potvrdený zámer používateľa. Pre obmedzený kľúč je potrebné oprávnenie drafts:write.",
        "x-required-api-key-scopes": ["drafts:write"]
      }
    },
    "/api": {
      "get": {
        "operationId": "discoverApi",
        "summary": "Verejný prehľad API.",
        "description": "Objaví dokumentáciu, REST, MCP, autentifikáciu, CLI a sandbox bez prihlásenia. Neobsahuje údaje organizácie.",
        "security": [],
        "responses": {"200":{"description":"Prehľad API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}}}
      }
    },
    "/api/v1": {
      "get": {
        "operationId": "verifyApiKey",
        "summary": "Overenie API kľúča a prehľad endpointov.",
        "description": "Overí API kľúč a vráti jeho organization_id a dostupné cesty. Podlieha limitom požiadaviek.",
        "responses": {
          "200": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},
            "description": "Kľúč platí.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {"type":"boolean"},
                    "organization_id": {"type":"string","format":"uuid"},
                    "version": {"type":"string"},
                    "endpoints": {"type":"object","additionalProperties":{"type":"string"}}
                  }
                }
              }
            }
          },
          "401": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Neplatný kľúč.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "402": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"}},"description":"Potrebný plán Pro alebo Business.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "429": {"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/DeprecationPolicy"},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"Seconds before retrying."}},"description":"Prekročený limit požiadaviek.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        }
      }
    },
    "/api/sandbox/v1/stock": {
      "get": {
        "operationId": "readSandboxStock",
        "summary": "Vzorové skladové dáta bez účtu.",
        "description": "Verejný sandbox len na čítanie. Vracia vymyslené záznamy bez prístupu k databáze. Filtre nemenia žiadny sklad.",
        "security": [],
        "parameters": [
          {"name":"warehouse","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"description":"Filtruj na jeden sklad."},
          {"name":"material","in":"query","required":false,"schema":{"type":"string"},"description":"Presný materiál (bez ohľadu na veľkosť písmen)."},
          {"name":"below_threshold","in":"query","required":false,"schema":{"type":"boolean"},"description":"true = len filamenty so stavom low/empty."},
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {"type":"integer","default":50,"maximum":200,"minimum":1},
            "description": "Počet záznamov, maximálne 200."
          }
        ],
        "responses": {
          "200": {"description":"Vzorové dáta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxStock"}}}},
          "400": {"description":"Neplatný parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},
          "405": {"description":"Sandbox nepovoľuje zápis.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}
        }
      }
    },
    "/mcp": {
      "post": {
        "operationId": "sendMcpMessage",
        "summary": "MCP Streamable HTTP request.",
        "description": "Autentifikovaný MCP transport pre Business. Klient odošle initialize, potom tools/list alebo tools/call. Posiela Accept: application/json, text/event-stream. OAuth scopes určujú identitu, skladové oprávnenia určuje rola. Parametre nástroja vychádzajú z inputSchema v tools/list.",
        "security": [{"bearerAuth":[]},{"mcpOAuth":["openid"]}],
        "parameters": [
          {
            "name": "MCP-Protocol-Version",
            "in": "header",
            "required": false,
            "description": "Verzia dohodnutá počas initialize.",
            "schema": {"type":"string","example":"2025-11-25"}
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["jsonrpc","method"],
                "properties": {
                  "jsonrpc": {"type":"string","enum":["2.0"]},
                  "id": {"oneOf":[{"type":"string"},{"type":"integer"}]},
                  "method": {"type":"string","description":"MCP metóda, napr. initialize, tools/list alebo tools/call."},
                  "params": {"type":"object","additionalProperties":true,"description":"Parametre MCP metódy podľa protokolu alebo inputSchema nástroja."}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC odpoveď alebo SSE stream podľa MCP protokolu.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "jsonrpc": {"type":"string","enum":["2.0"]},
                    "id": {"oneOf":[{"type":"string"},{"type":"integer"}]},
                    "result": {"type":"object","additionalProperties":true},
                    "error": {
                      "type": "object",
                      "properties": {"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"object","additionalProperties":true}}
                    }
                  }
                }
              },
              "text/event-stream": {"schema":{"type":"string"}}
            }
          },
          "202": {"description":"MCP notifikácia prijatá, bez tela odpovede."},
          "401": {
            "description": "Token chýba alebo neplatí. WWW-Authenticate odkazuje na resource metadata.",
            "headers": {"WWW-Authenticate":{"schema":{"type":"string"},"description":"Bearer challenge s resource_metadata URL."}},
            "content": {
              "application/json": {"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"error_description":{"type":"string"}}}}
            }
          }
        }
      }
    }
  },
  "externalDocs": {"description":"Návody, autentifikácia, CLI a sandbox","url":"https://sklad.printhia.sk/developers"},
  "x-mcp": {
    "url": "https://sklad.printhia.sk/mcp",
    "transport": "streamable-http",
    "security": [{"bearerAuth":[]},{"mcpOAuth":["openid"]}],
    "manifest": "https://sklad.printhia.sk/server.json"
  }
}
