{"openapi":"3.1.0","info":{"title":"ARCA Auth Service","description":"Microservicio para la autenticación con ARCA y gestión de configuraciones.","version":"0.2.0"},"paths":{"/metrics":{"get":{"summary":"Metrics","description":"Endpoint that serves Prometheus metrics.","operationId":"metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/health":{"get":{"summary":"Health Check","description":"Endpoint de verificación de estado.","operationId":"health_check_auth_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/token/{service_id}":{"get":{"summary":"Get Access Token","description":"Obtiene un Ticket de Acceso (TA) de ARCA para un servicio específico.\nBusca las credenciales (certificado y clave privada) en la base de datos.","operationId":"get_access_token_api_v1_auth_token__service_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}},{"name":"cuit","in":"query","required":true,"schema":{"type":"string","minLength":11,"maxLength":11,"description":"CUIT del contribuyente para el cual se solicita el token.","title":"Cuit"},"description":"CUIT del contribuyente para el cual se solicita el token."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/clients":{"post":{"summary":"Create Api Client Endpoint","description":"Crea un nuevo cliente API.\nRequiere rol ADMIN.","operationId":"create_api_client_endpoint_api_v1_auth_clients_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIClientCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIClientResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Read Api Clients","description":"Lista todos los clientes API.\nRequiere rol ADMIN.","operationId":"read_api_clients_api_v1_auth_clients_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APIClientResponse"},"title":"Response Read Api Clients Api V1 Auth Clients Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/clients/{client_id}/rotate-key":{"post":{"summary":"Rotate Client Key","description":"Genera una nueva API Key para un cliente existente.\nRequiere rol ADMIN.","operationId":"rotate_client_key_api_v1_auth_clients__client_id__rotate_key_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIClientResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/validate-api-key":{"post":{"summary":"Validate Api Key","description":"Valida una API Key y devuelve la información del cliente.\nSe usa internamente por otros microservicios (WSFE, WSPadron).","operationId":"validate_api_key_api_v1_auth_validate_api_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyValidationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/check-key/{api_key}":{"get":{"summary":"Check Api Key Endpoint","description":"Endpoint ligero para validar API Key desde Nginx (auth_request).\nRetorna 200 OK si es válida, 401 Unauthorized si no.","operationId":"check_api_key_endpoint_api_v1_auth_check_key__api_key__get","parameters":[{"name":"api_key","in":"path","required":true,"schema":{"type":"string","title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/invoice-settings":{"post":{"summary":"Create Invoice Settings Endpoint","description":"Registra la configuración de facturación y certificados para un CUIT.\nExtrae la fecha de vencimiento (`valido_hasta`) del `.pem` y valida\nque el certificado pertenezca al CUIT indicado.","operationId":"create_invoice_settings_endpoint_api_v1_auth_invoice_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/invoice-settings/{cuit}/generate-csr":{"post":{"summary":"Generate Csr Endpoint","description":"Genera la clave privada + CSR para el CUIT y guarda la key (estado pendiente).\n\nDevuelve el CSR para subir a AFIP; el .crt resultante se carga luego vía PUT.","operationId":"generate_csr_endpoint_api_v1_auth_invoice_settings__cuit__generate_csr_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cuit","in":"path","required":true,"schema":{"type":"string","title":"Cuit"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCsrRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsrResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/invoice-settings/{cuit}/status":{"get":{"summary":"Invoice Status Endpoint","description":"Estado del onboarding fiscal del CUIT: none / pending (CSR sin cert) / active.","operationId":"invoice_status_endpoint_api_v1_auth_invoice_settings__cuit__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cuit","in":"path","required":true,"schema":{"type":"string","title":"Cuit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/invoice-settings/{cuit}":{"get":{"summary":"Get Invoice Settings Endpoint","description":"Obtiene la configuración de facturación, excluyendo claves privadas.","operationId":"get_invoice_settings_endpoint_api_v1_auth_invoice_settings__cuit__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cuit","in":"path","required":true,"schema":{"type":"string","title":"Cuit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Invoice Settings Endpoint","description":"Actualiza la configuración de facturación.\nSi se envía un nuevo certificado `.pem`, valida y regenera `valido_hasta`.","operationId":"update_invoice_settings_endpoint_api_v1_auth_invoice_settings__cuit__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cuit","in":"path","required":true,"schema":{"type":"string","title":"Cuit"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Invoice Settings Endpoint","description":"Hace un borrado lógico (desactiva) la configuración de facturación.","operationId":"delete_invoice_settings_endpoint_api_v1_auth_invoice_settings__cuit__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cuit","in":"path","required":true,"schema":{"type":"string","title":"Cuit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"APIClientCreate":{"properties":{"client_name":{"type":"string","title":"Client Name"},"allowed_cuits":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cuits"},"role":{"anyOf":[{"$ref":"#/components/schemas/UserRole"},{"type":"null"}],"default":"USER"}},"type":"object","required":["client_name"],"title":"APIClientCreate"},"APIClientResponse":{"properties":{"id":{"type":"integer","title":"Id"},"client_name":{"type":"string","title":"Client Name"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"role":{"$ref":"#/components/schemas/UserRole"},"allowed_cuits":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cuits"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","client_name","role","is_active","created_at"],"title":"APIClientResponse"},"APIKeyValidationRequest":{"properties":{"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["api_key"],"title":"APIKeyValidationRequest"},"APIKeyValidationResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"allowed_cuits":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cuits"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","required":["valid"],"title":"APIKeyValidationResponse"},"CsrResponse":{"properties":{"cuit":{"type":"string","title":"Cuit"},"csr":{"type":"string","title":"Csr"}},"type":"object","required":["cuit","csr"],"title":"CsrResponse"},"GenerateCsrRequest":{"properties":{"razon_social":{"type":"string","title":"Razon Social"},"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias","default":"facturacion"}},"type":"object","required":["razon_social"],"title":"GenerateCsrRequest","description":"Datos mínimos para generar la clave + CSR (el resto lo completa AFIP)."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InvoiceSettingsCreate":{"properties":{"cuit":{"type":"string","title":"Cuit"},"certificate_crt":{"type":"string","title":"Certificate Crt"},"certificate_pem":{"type":"string","title":"Certificate Pem"},"private_key":{"type":"string","title":"Private Key"},"settings":{"$ref":"#/components/schemas/InvoiceSettingsData"}},"type":"object","required":["cuit","certificate_crt","certificate_pem","private_key","settings"],"title":"InvoiceSettingsCreate"},"InvoiceSettingsData":{"properties":{"punto_de_venta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Punto De Venta"},"iibb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Iibb"},"nombre_legal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nombre Legal"},"nombre_fantasia":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nombre Fantasia"},"direccion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direccion"},"inicio_actividades":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inicio Actividades"},"categoria_iva":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Categoria Iva"},"concepto":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Concepto"},"valido_hasta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valido Hasta"},"iva":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Iva"}},"additionalProperties":true,"type":"object","title":"InvoiceSettingsData","description":"Datos de configuración base para el CUIT. Todos opcionales: el blob de settings\npuede venir con distinta forma (ej. punto_venta vs punto_de_venta) y no debe\nromper la serialización de la respuesta."},"InvoiceSettingsResponse":{"properties":{"cuit":{"type":"string","title":"Cuit"},"certificate_pem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Certificate Pem"},"settings":{"anyOf":[{"$ref":"#/components/schemas/InvoiceSettingsData"},{"type":"null"}]},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["cuit","is_active"],"title":"InvoiceSettingsResponse"},"InvoiceSettingsUpdate":{"properties":{"certificate_crt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Certificate Crt"},"certificate_pem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Certificate Pem"},"private_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Private Key"},"settings":{"anyOf":[{"$ref":"#/components/schemas/InvoiceSettingsData"},{"type":"null"}]}},"type":"object","title":"InvoiceSettingsUpdate"},"InvoiceStatusResponse":{"properties":{"cuit":{"type":"string","title":"Cuit"},"status":{"type":"string","title":"Status"},"has_certificate":{"type":"boolean","title":"Has Certificate"},"is_active":{"type":"boolean","title":"Is Active"},"valido_hasta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valido Hasta"}},"type":"object","required":["cuit","status","has_certificate","is_active"],"title":"InvoiceStatusResponse"},"TokenResponse":{"properties":{"token":{"type":"string","title":"Token"},"sign":{"type":"string","title":"Sign"},"expiration_time":{"type":"string","format":"date-time","title":"Expiration Time"},"service":{"type":"string","title":"Service"},"cuit":{"type":"integer","title":"Cuit"}},"type":"object","required":["token","sign","expiration_time","service","cuit"],"title":"TokenResponse","description":"Modelo de respuesta para el Ticket de Acceso (TA)"},"UserRole":{"type":"string","enum":["ADMIN","USER"],"title":"UserRole"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}