{"openapi":"3.0.3","info":{"title":"MALTA Exchange Demo API","version":"2.0.0","description":"Importes en céntimos de PEN. Sesión mediante cookie HttpOnly. Recargas de demostración de 5000 céntimos. Las rutas admin requieren rol admin."},"servers":[{"url":"/api"}],"paths":{"/health":{"get":{"summary":"GET /health","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}}},"/auth/register":{"post":{"summary":"POST /auth/register","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/auth/login":{"post":{"summary":"POST /auth/login","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/auth/logout":{"post":{"summary":"POST /auth/logout","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/me":{"get":{"summary":"GET /me","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}},"patch":{"summary":"PATCH /me","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/wallet":{"get":{"summary":"GET /wallet","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}}},"/wallet/topups":{"post":{"summary":"POST /wallet/topups","responses":{"200":{"description":"Operación correcta"},"201":{"description":"Creado; repetición de la misma clave devuelve 200"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":16,"maxLength":100}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/wallet/movements":{"get":{"summary":"GET /wallet/movements","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}}},"/orders":{"get":{"summary":"GET /orders","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}},"post":{"summary":"POST /orders","responses":{"200":{"description":"Operación correcta"},"201":{"description":"Creado; repetición de la misma clave devuelve 200"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":16,"maxLength":100}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/beers":{"get":{"summary":"GET /beers","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}},"post":{"summary":"POST /beers","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/beers/{id}":{"get":{"summary":"GET /beers/{id}","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}]},"patch":{"summary":"PATCH /beers/{id}","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}},"delete":{"summary":"DELETE /beers/{id}","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}]}},"/beers/{id}/history":{"get":{"summary":"GET /beers/{id}/history","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}]}},"/admin/summary":{"get":{"summary":"GET /admin/summary","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}}},"/admin/users":{"get":{"summary":"GET /admin/users","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}}},"/admin/movements":{"get":{"summary":"GET /admin/movements","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}}},"/admin/orders":{"get":{"summary":"GET /admin/orders","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}}},"/admin/orders/{id}/cancel":{"post":{"summary":"POST /admin/orders/{id}/cancel","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/admin/beers":{"get":{"summary":"GET /admin/beers","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}}}},"/admin/reprice":{"post":{"summary":"POST /admin/reprice","responses":{"200":{"description":"Operación correcta"},"401":{"description":"Sesión requerida"},"403":{"description":"Permiso denegado"},"409":{"description":"Conflicto de saldo, precio, stock o solicitud"},"422":{"description":"Datos inválidos"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}}}}