{"openapi":"3.1.0","info":{"title":"API de Datrus","version":"2026-09-13","description":"La API pública de Datrus, la plataforma de cumplimiento de la Ley 21.719. Autentícate con `Authorization: Bearer <llave de API>`. Los errores siguen el RFC 9457 (`application/problem+json`) y traen un `requestId`. Manda un `Idempotency-Key` en cada POST que cree algo. Las listas se paginan con `limit` y un `cursor` opaco. Las rutas, los campos y los códigos de error están en inglés a propósito: son el contrato que escribes en tu código."},"servers":[{"url":"https://api.sandbox.datrus.cl","description":"Sandbox (llaves de prueba)"}],"security":[{"apiKey":[]}],"tags":[{"name":"Cuenta","description":"Empieza por `GET /me`: te dice qué empresa eres, qué permisos tiene tu llave y qué módulos están encendidos. Una llave `dtr_test_` lee todo y sólo escribe donde hay modo prueba."},{"name":"Consentimiento","description":"**Registro directo**: `POST /consents` con el `form` público, el identificador de la persona (viaja en el cuerpo, se hashea y se descarta) y los `scopes`. La respuesta trae el `agreement` y su evidencia sellada. **Pedir una decisión**: `POST /consent-requests` con la plantilla, el canal y el nivel; el enlace lo abre la persona. Corregir acota lo otorgado; retirarlo todo es una revocación."},{"name":"Derechos","description":"**Alta de una solicitud que llegó por otro canal**: `POST /data-subject-requests` con la fecha de recepción real; el plazo legal de 30 días corridos se calcula desde ahí, no desde hoy. Después `acknowledge`, `assign`, resolver derecho por derecho en `/processes/{id}/resolve` y, si hace falta, una única prórroga en `/extend`. Una denegación va fundada."},{"name":"Inventario y RAT","description":"**RAT por API**: crea tratamientos con las claves de tus catálogos (`/catalogs/*`), revisa `/processing-activities/{id}/findings`, y sella un corte con `POST /register/snapshots` cuando el inventario esté completo. Un corte sellado es evidencia: no se borra ni se reescribe."},{"name":"Documentos","description":"Crea la política con `POST /documents`, edita (cada edición sella una versión), aprueba la versión y publícala con las letras del art. 14 ter que cubre. `effective-at` contesta qué versión regía en una fecha."},{"name":"Proveedores","description":"Da de alta al encargado, vincúlalo a los tratamientos que toca (`/processing-activities`), y escribe el contrato del art. 15 bis en `/agreement`: tres cláusulas las escribes tú y tres salen del RAT. Sin tratamientos vinculados no se puede firmar."},{"name":"Incidentes","description":"Fija el objetivo interno de reporte una vez (`PUT /incidents/reporting-objective`). Abre el expediente con la fecha de detección, vincula el alcance, llena el registro del inc. 2, mira `/assessment`, decide en `/decisions` y deja constancia de la comunicación en `/notifications`. La API no envía nada a la Agencia."},{"name":"EIPD","description":"Apila una plantilla, abre la evaluación sobre tratamientos del RAT (el disparador del inc. 2 se congela), completa las cinco piezas, registra riesgos, decide sobre consultar a la Agencia y aprueba, que sella. Y la evaluación de riesgo por tratamiento: la matriz de la organización, el mapa, cada evaluación con sus factores y su sello, y la exportación para el modelo de prevención."},{"name":"Capacitación","description":"Carga el padrón, sella el contenido, crea la difusión y ábrela: el conjunto convocado se congela ahí. Registra acuses propios o de un tercero con autor, y lee la cobertura."},{"name":"Reportes","description":"Previsualiza con `GET /reports/preview`, emite con `POST /reports` (lee todos los módulos y sella), y anula con reemplazo si hubo que rehacerlo. Es un conteo, nunca un puntaje."},{"name":"Conectores","description":"El camino sin credencial: exporta el catálogo de tu base con el script de sólo lectura, súbelo en `config.schema` de un conector `esquema_subido`, corre el descubrimiento y acepta las propuestas con una finalidad declarada."},{"name":"Integrables","description":"El catálogo de piezas para tu sitio y el fragmento de una línea, idéntico al de la consola."},{"name":"Tareas","description":"El plan de trabajo en seis fases. Plazos de gestión, no legales: el reloj legal vive en Derechos."},{"name":"Bitácora","description":"La bitácora encadenada es también el flujo de eventos de todos los módulos. `verify` recomputa la cadena."},{"name":"Webhooks","description":"Los seis eventos de consentimiento y los seis de derechos (solicitud recibida, acusada, prorrogada, bloqueo ordenado, por vencer y resuelta), firmados en `X-Datrus-Firma` (HMAC del secreto sobre la marca de tiempo y el cuerpo) y con reintentos. El secreto se entrega una sola vez."},{"name":"Exportaciones","description":"Los mismos archivos que produce la consola, confrontados contra su sello antes de entregarse."},{"name":"Panel","description":"El avance por área con la misma fuente que la consola."},{"name":"Plan","description":"Los cupos del plan y el consumo del mes."},{"name":"Verificación","description":"Público, sin llave: recomputa el sello de un archivo con las reglas publicadas. Evidencia que sólo Datrus puede verificar no es evidencia."},{"name":"Llaves de API","description":"Crear, rotar y revocar llaves con permisos por recurso. La llave completa sólo se ve al crearla."},{"name":"Usuarios","description":"Las personas con acceso a la consola."},{"name":"Empresa","description":"La identidad legal del responsable."},{"name":"Ajustes","description":"Los ajustes de cada módulo."},{"name":"Catálogos","description":"Las claves que usan los tratamientos: finalidades, categorías de datos, titulares y sistemas."},{"name":"Titulares","description":"Consulta por identificador: qué autorizó una persona."},{"name":"Centro de privacidad","description":"Las sesiones al centro de privacidad de una persona conocida."}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Una llave de API de tu empresa (`dtr_live_…` o `dtr_test_…`), creada en la consola, en Integraciones › API."}},"schemas":{"SealVerdict":{"type":"object","properties":{"verdict":{"type":"string","enum":["ok","no_match","no_verdict"]},"form":{"type":["string","null"],"enum":["consent_evidence","as_is","without_version","register_snapshot","rights_file","processor_file","dpia_file","document_file","incident_file","risk_assessment","risk_matrix",null],"description":"Qué clase de archivo sellado se reconoció."},"hash":{"type":["string","null"]},"reason":{"type":["string","null"],"enum":["no_match","malformed_hash","no_content","malformed_json","content_too_large","number_not_verifiable","text_not_verifiable",null]},"rules":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"text":{"type":"string"}},"required":["title","text"]},"description":"Las reglas de la canonicalización, para recomputar sin nosotros."}},"required":["verdict","form","hash","reason","rules"]},"VerifySeal":{"type":"object","properties":{"hash":{"type":"string","minLength":8,"maxLength":128,"example":"b9fce21182dce122…"},"content":{"type":"string","minLength":1,"maxLength":512001,"description":"El JSON del archivo sellado, tal cual se descargó."}},"required":["hash","content"]},"RightsRequestTracking":{"type":"object","properties":{"code":{"type":"string","example":"DR-K7M2Q4"},"state":{"type":"string","enum":["awaiting_verification","validating","in_progress","resolved","identity_not_matched","expired"]},"stateName":{"type":"string","description":"El nombre del estado en castellano, para mostrarlo tal cual."},"rights":{"type":"array","items":{"type":"string","enum":["access","rectification","erasure","objection","automated_decision","blocking","portability"]}},"rightsNames":{"type":"array","items":{"type":"string"}},"receivedOn":{"type":"string","example":"2026-09-01","description":"Sólo la fecha."},"dueOn":{"type":["string","null"],"description":"El plazo vigente: la prórroga si la hubo, o el vencimiento original."},"identifierHint":{"type":"string","example":"a***a@datrus.cl","description":"ENMASCARADA. Nunca la dirección completa."},"acknowledged":{"type":"boolean"},"outcome":{"type":["string","null"],"enum":["granted","partially_granted","refused",null]}},"required":["code","state","stateName","rights","rightsNames","receivedOn","dueOn","identifierHint","acknowledged","outcome"]},"Problem":{"type":"object","properties":{"type":{"type":"string","example":"validation_error"},"title":{"type":"string","example":"Validation error"},"status":{"type":"integer","example":400},"detail":{"type":"string","example":"The request body has 1 invalid field."},"instance":{"type":"string"},"requestId":{"type":"string","example":"req_01J9X0Y3A2B4C6D8E0F1G2H3"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["field","message"]},"example":[{"field":"identifier.value","message":"Required"}]}},"required":["type","title","status","requestId"]},"Me":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":"string","example":"cmp_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un company, siempre con el prefijo `cmp_`."},"slug":{"type":"string","example":"acme"},"legalName":{"type":"string","example":"Acme SpA"},"demoMode":{"type":"boolean"}},"required":["id","slug","legalName","demoMode"]},"key":{"type":"object","properties":{"id":{"type":"string","example":"key_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un API key, siempre con el prefijo `key_`."},"name":{"type":["string","null"],"example":"Integración con el CRM"},"environment":{"type":"string","enum":["live","test"]},"permissions":{"type":"array","items":{"type":"string"},"example":["consent:write","rights:read"]},"expiresAt":{"type":["string","null"],"example":"2026-12-12T00:00:00.000Z"}},"required":["id","name","environment","permissions","expiresAt"]},"products":{"type":"object","properties":{"compliance":{"type":"boolean"},"aiSecure":{"type":"boolean"}},"required":["compliance","aiSecure"]},"modules":{"type":"array","items":{"$ref":"#/components/schemas/Module"}},"apiVersion":{"type":"string","example":"2026-09-13"}},"required":["company","key","products","modules","apiVersion"]},"Module":{"type":"object","properties":{"slug":{"type":"string","example":"consent"},"name":{"type":"string","example":"Consentimiento"},"state":{"type":"string","enum":["demo","beta","operational","off"],"example":"operational"}},"required":["slug","name","state"]},"Permission":{"type":"object","properties":{"permission":{"type":"string","example":"consent:write"},"resource":{"type":"string","example":"consent"},"action":{"type":"string","enum":["read","write","admin"]},"description":{"type":"string"}},"required":["permission","resource","action","description"]},"ApiKey":{"type":"object","properties":{"id":{"type":"string","example":"key_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un API key, siempre con el prefijo `key_`."},"name":{"type":["string","null"],"example":"Integración con el CRM"},"prefix":{"type":"string","example":"dtr_live_3kJ9x2Qp","description":"Lo único de la llave que se guarda en claro: sirve para reconocerla en la lista."},"environment":{"type":"string","enum":["live","test"]},"permissions":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string"},"expiresAt":{"type":["string","null"]},"lastUsedAt":{"type":["string","null"]},"revokedAt":{"type":["string","null"]}},"required":["id","name","prefix","environment","permissions","createdAt","expiresAt","lastUsedAt","revokedAt"]},"ApiKeyWithSecret":{"allOf":[{"$ref":"#/components/schemas/ApiKey"},{"type":"object","properties":{"secret":{"type":"string","example":"dtr_live_3kJ9x2QpMv7…","description":"Se muestra una sola vez. Guárdalo ahora: después sólo queda su prefijo."}},"required":["secret"]}]},"CreateApiKey":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120,"default":null,"example":"Integración con el CRM","description":"Cómo vas a reconocer esta llave después."},"environment":{"type":"string","enum":["live","test"],"default":"live","description":"Una llave `test` sólo lee, salvo donde exista modo prueba."},"access":{"type":"string","enum":["full","read_only"],"example":"read_only","description":"Los dos tipos de llave: `full` escribe y administra todo; `read_only` lee todo y no escribe nada. Alternativa a `permissions`."},"permissions":{"type":"array","items":{"type":"string"},"minItems":1,"example":["consent:write","rights:read"],"description":"La lista fina `recurso:acción`, si prefieres armarla tú. Si mandas `access`, se ignora."},"expiresInDays":{"type":["integer","null"],"minimum":1,"maximum":365,"example":90,"description":"Por defecto: 90 días para las llaves de producción y nunca para las de prueba. `null` = no vence."}}},"UpdateApiKey":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120},"access":{"type":"string","enum":["full","read_only"],"example":"read_only","description":"Los dos tipos de llave: `full` escribe y administra todo; `read_only` lee todo y no escribe nada. Alternativa a `permissions`."},"permissions":{"type":"array","items":{"type":"string"},"minItems":1,"example":["consent:write","rights:read"],"description":"Los permisos de la llave, `recurso:acción`. Consulta el catálogo en `GET /permissions`."},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"Role":{"type":"object","properties":{"role":{"type":"string","enum":["admin","delegado","responsable","miembro"],"example":"delegado"},"name":{"type":"string","example":"Delegado de protección de datos"},"description":{"type":"string"},"modules":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","example":"consent"},"actions":{"type":"array","items":{"type":"string"},"example":["read","create","update"]}},"required":["slug","actions"]},"description":"Sólo los módulos en los que el rol puede hacer algo."}},"required":["role","name","description","modules"]},"UserPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/User"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"User":{"type":"object","properties":{"id":{"type":"string","example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"email":{"type":"string","example":"ana@empresa.cl"},"role":{"type":"string","enum":["admin","delegado","responsable","miembro"]},"active":{"type":"boolean","description":"Una persona suspendida conserva su historial, pero no entra."},"hasPassword":{"type":"boolean","description":"`false` mientras no haya terminado de activar su cuenta."},"createdAt":{"type":"string"}},"required":["id","email","role","active","hasPassword","createdAt"]},"CreateUser":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","example":"ana@empresa.cl","description":"El correo con el que entrará. Único en todo Datrus."},"role":{"type":"string","enum":["admin","delegado","responsable","miembro"],"default":"miembro"}},"required":["email"]},"UpdateUser":{"type":"object","properties":{"role":{"type":"string","enum":["admin","delegado","responsable","miembro"]},"active":{"type":"boolean","description":"`false` suspende el acceso sin borrar nada."}}},"Company":{"type":"object","properties":{"id":{"type":"string","example":"cmp_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un company, siempre con el prefijo `cmp_`."},"slug":{"type":"string","example":"acme","description":"Sólo lectura: identifica a tu empresa en Datrus."},"legalName":{"type":"string","example":"Acme SpA"},"taxId":{"type":"string","example":"76.123.456-7","description":"El RUT. No se valida el dígito verificador: un responsable puede ser extranjero o una sucursal."},"businessActivity":{"type":"string","example":"Servicios informáticos","description":"El giro."},"address":{"type":"object","properties":{"street":{"type":"string","example":"Av. Apoquindo 4501, oficina 1203"},"commune":{"type":"string","example":"Las Condes"},"city":{"type":"string","example":"Santiago"},"region":{"type":"string","example":"Metropolitana"}},"required":["street","commune","city","region"]},"legalRepresentative":{"type":"object","properties":{"name":{"type":"string","example":"María Soto Lagos"},"contact":{"type":"string","example":"msoto@acme.cl","description":"Correo o teléfono; lo elige la empresa."}},"required":["name","contact"]},"dataProtectionOfficer":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"required":["name","email"],"description":"El Delegado. Vacío es un estado lícito: el art. 49 lo pide dentro del modelo de prevención, que es voluntario."}},"required":["id","slug","legalName","taxId","businessActivity","address","legalRepresentative","dataProtectionOfficer"]},"UpdateCompany":{"type":"object","properties":{"legalName":{"type":"string","minLength":1,"maxLength":200},"taxId":{"type":"string","maxLength":20},"businessActivity":{"type":"string","maxLength":200},"address":{"type":"object","properties":{"street":{"type":"string","maxLength":200},"commune":{"type":"string","maxLength":120},"city":{"type":"string","maxLength":120},"region":{"type":"string","maxLength":120}}},"legalRepresentative":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"contact":{"type":"string","maxLength":160}}},"dataProtectionOfficer":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"email":{"type":"string","maxLength":160}}}}},"ConsentSettings":{"type":"object","properties":{"allowedDomains":{"type":"array","items":{"type":"string"},"example":["app.acme.cl","*.acme.cl"],"description":"Dónde se puede embeber la captura. Lista vacía = sin restringir."},"contactEmail":{"type":"string","example":"datos@acme.cl","description":"El buzón del responsable que ve el titular para ejercer sus derechos."},"mandatoryTexts":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","example":"derecho_a_retirarse"},"text":{"type":"string"}},"required":["key","text"]},"description":"Los párrafos que toda plantilla muestra sí o sí."},"allowWithdrawingMandatoryScopes":{"type":"boolean","description":"Si un alcance obligatorio se puede soltar por separado. Retirarse entero siempre se puede, pase lo que pase acá."},"evidenceRetentionMonths":{"type":"integer","description":"0 = indefinida."}},"required":["allowedDomains","contactEmail","mandatoryTexts","allowWithdrawingMandatoryScopes","evidenceRetentionMonths"]},"RightsSettings":{"type":"object","properties":{"enabledRights":{"type":"array","items":{"type":"string"},"example":["access","rectification"],"description":"Los derechos que tu empresa recibe. Al menos uno."},"verificationLevels":{"type":"object","additionalProperties":{"type":"string"},"example":{"erasure":"document"},"description":"Qué nivel de verificación exiges por derecho; lo que no esté acá usa el piso legal."},"formTitle":{"type":"string"},"formText":{"type":"string"},"rightDescriptions":{"type":"object","additionalProperties":{"type":"string"},"description":"El texto propio de tu empresa bajo cada derecho, en la página pública."},"contactRetentionMonths":{"type":"integer","description":"Cuánto se guarda el correo del titular tras cerrar la solicitud."},"intakeEmail":{"type":"string","description":"El buzón al que avisamos cuando entra una solicitud."},"publicFormToken":{"type":"string","description":"El token del enlace público. Vacío = todavía no lo has emitido."}},"required":["enabledRights","verificationLevels","formTitle","formText","rightDescriptions","contactRetentionMonths","intakeEmail","publicFormToken"]},"PrivacyCenterSettings":{"type":"object","properties":{"enabled":{"type":"boolean","description":"El botón «Mis autorizaciones» que la empresa pone en su sitio."},"token":{"type":"string","description":"Vacío cuando está apagado."},"url":{"type":["string","null"],"example":"https://www.datrus.cl/c/5eyx6jehtwd7j0r4er6g41"}},"required":["enabled","token","url"]},"BrandSettings":{"type":"object","properties":{"logoUrl":{"type":["string","null"],"description":"Sólo lectura: el logo se sube desde la consola."},"logoAlt":{"type":"string"},"logoHeight":{"type":"integer","example":32,"description":"Entre 20 y 48 píxeles."},"primaryColor":{"type":"string","example":"#202123"},"backgroundColor":{"type":"string"},"surfaceColor":{"type":"string"},"textColor":{"type":"string"},"font":{"type":"string","enum":["datrus","sistema","serif","humanista"]},"corners":{"type":"string","enum":["rectas","suaves","redondas"]},"showDatrusMark":{"type":"boolean"},"footerText":{"type":"string"},"privacyPolicyUrl":{"type":"string"}},"required":["logoUrl","logoAlt","logoHeight","primaryColor","backgroundColor","surfaceColor","textColor","font","corners","showDatrusMark","footerText","privacyPolicyUrl"]},"UpdateConsentSettings":{"type":"object","properties":{"allowedDomains":{"type":"array","items":{"type":"string"},"example":["app.acme.cl","*.acme.cl"],"description":"Dónde se puede embeber la captura. Lista vacía = sin restringir."},"contactEmail":{"type":"string","example":"datos@acme.cl","description":"El buzón del responsable que ve el titular para ejercer sus derechos."},"mandatoryTexts":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","example":"derecho_a_retirarse"},"text":{"type":"string"}},"required":["key","text"]},"description":"Los párrafos que toda plantilla muestra sí o sí."},"allowWithdrawingMandatoryScopes":{"type":"boolean","description":"Si un alcance obligatorio se puede soltar por separado. Retirarse entero siempre se puede, pase lo que pase acá."},"evidenceRetentionMonths":{"type":"integer","description":"0 = indefinida."}}},"UpdateRightsSettings":{"type":"object","properties":{"enabledRights":{"type":"array","items":{"type":"string"}},"verificationLevels":{"type":"object","additionalProperties":{"type":"string"}},"formTitle":{"type":"string","maxLength":200},"formText":{"type":"string","maxLength":4000},"rightDescriptions":{"type":"object","additionalProperties":{"type":"string"}},"contactRetentionMonths":{"type":"integer"},"intakeEmail":{"type":"string","maxLength":320}}},"UpdatePrivacyCenterSettings":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"UpdateBrandSettings":{"type":"object","properties":{"logoAlt":{"type":"string"},"logoHeight":{"type":"integer","example":32,"description":"Entre 20 y 48 píxeles."},"primaryColor":{"type":"string","example":"#202123"},"backgroundColor":{"type":"string"},"surfaceColor":{"type":"string"},"textColor":{"type":"string"},"font":{"type":"string","enum":["datrus","sistema","serif","humanista"]},"corners":{"type":"string","enum":["rectas","suaves","redondas"]},"showDatrusMark":{"type":"boolean"},"footerText":{"type":"string"},"privacyPolicyUrl":{"type":"string"}}},"RightsNotificationSettings":{"type":"object","properties":{"opened":{"$ref":"#/components/schemas/RightsNotificationRecipients"},"assigned":{"$ref":"#/components/schemas/RightsNotificationRecipients"},"no_response_10d":{"$ref":"#/components/schemas/RightsNotificationRecipients"},"due_in_5d":{"$ref":"#/components/schemas/RightsNotificationRecipients"},"due_in_1d":{"$ref":"#/components/schemas/RightsNotificationRecipients"},"overdue":{"$ref":"#/components/schemas/RightsNotificationRecipients"},"closed":{"$ref":"#/components/schemas/RightsNotificationRecipients"}},"required":["opened","assigned","no_response_10d","due_in_5d","due_in_1d","overdue","closed"],"description":"A quién se le avisa en cada evento de una solicitud de derechos. `opened`, `assigned` y `closed` salen con el acto; `no_response_10d`, `due_in_5d`, `due_in_1d` y `overdue` los dispara el calendario, una vez por hecho. El cuerpo lleva el código y la identificación enmascarada del titular, nunca su correo."},"RightsNotificationRecipients":{"type":"object","properties":{"intakeMailbox":{"type":"boolean","description":"El buzón de admisión de los ajustes de Derechos (`intakeEmail`)."},"assignee":{"type":"boolean","description":"La persona asignada a la solicitud, si la hay y sigue activa."},"emails":{"type":"array","items":{"type":"string"},"maxItems":10,"example":["dpo@acme.cl"],"description":"Otros correos de tu empresa. Hasta 10. Nunca el del titular."}},"required":["intakeMailbox","assignee","emails"]},"UpdateRightsNotificationSettings":{"type":"object","properties":{"opened":{"type":"object","properties":{"intakeMailbox":{"type":"boolean","description":"El buzón de admisión de los ajustes de Derechos (`intakeEmail`)."},"assignee":{"type":"boolean","description":"La persona asignada a la solicitud, si la hay y sigue activa."},"emails":{"type":"array","items":{"type":"string"},"maxItems":10,"example":["dpo@acme.cl"],"description":"Otros correos de tu empresa. Hasta 10. Nunca el del titular."}}},"assigned":{"type":"object","properties":{"intakeMailbox":{"type":"boolean","description":"El buzón de admisión de los ajustes de Derechos (`intakeEmail`)."},"assignee":{"type":"boolean","description":"La persona asignada a la solicitud, si la hay y sigue activa."},"emails":{"type":"array","items":{"type":"string"},"maxItems":10,"example":["dpo@acme.cl"],"description":"Otros correos de tu empresa. Hasta 10. Nunca el del titular."}}},"no_response_10d":{"type":"object","properties":{"intakeMailbox":{"type":"boolean","description":"El buzón de admisión de los ajustes de Derechos (`intakeEmail`)."},"assignee":{"type":"boolean","description":"La persona asignada a la solicitud, si la hay y sigue activa."},"emails":{"type":"array","items":{"type":"string"},"maxItems":10,"example":["dpo@acme.cl"],"description":"Otros correos de tu empresa. Hasta 10. Nunca el del titular."}}},"due_in_5d":{"type":"object","properties":{"intakeMailbox":{"type":"boolean","description":"El buzón de admisión de los ajustes de Derechos (`intakeEmail`)."},"assignee":{"type":"boolean","description":"La persona asignada a la solicitud, si la hay y sigue activa."},"emails":{"type":"array","items":{"type":"string"},"maxItems":10,"example":["dpo@acme.cl"],"description":"Otros correos de tu empresa. Hasta 10. Nunca el del titular."}}},"due_in_1d":{"type":"object","properties":{"intakeMailbox":{"type":"boolean","description":"El buzón de admisión de los ajustes de Derechos (`intakeEmail`)."},"assignee":{"type":"boolean","description":"La persona asignada a la solicitud, si la hay y sigue activa."},"emails":{"type":"array","items":{"type":"string"},"maxItems":10,"example":["dpo@acme.cl"],"description":"Otros correos de tu empresa. Hasta 10. Nunca el del titular."}}},"overdue":{"type":"object","properties":{"intakeMailbox":{"type":"boolean","description":"El buzón de admisión de los ajustes de Derechos (`intakeEmail`)."},"assignee":{"type":"boolean","description":"La persona asignada a la solicitud, si la hay y sigue activa."},"emails":{"type":"array","items":{"type":"string"},"maxItems":10,"example":["dpo@acme.cl"],"description":"Otros correos de tu empresa. Hasta 10. Nunca el del titular."}}},"closed":{"type":"object","properties":{"intakeMailbox":{"type":"boolean","description":"El buzón de admisión de los ajustes de Derechos (`intakeEmail`)."},"assignee":{"type":"boolean","description":"La persona asignada a la solicitud, si la hay y sigue activa."},"emails":{"type":"array","items":{"type":"string"},"maxItems":10,"example":["dpo@acme.cl"],"description":"Otros correos de tu empresa. Hasta 10. Nunca el del titular."}}}},"description":"Parcial: sólo los eventos que mandas se reemplazan; los demás quedan como estaban."},"RightsAssignmentRules":{"type":"object","properties":{"rules":{"type":"array","items":{"$ref":"#/components/schemas/RightsAssignmentRule"}}},"required":["rules"]},"RightsAssignmentRule":{"type":"object","properties":{"position":{"type":"integer","example":1,"description":"El orden de evaluación. Gana la primera regla activa que calza."},"name":{"type":"string","example":"Erasure requests to Patricio"},"active":{"type":"boolean"},"rights":{"type":"array","items":{"type":"string"},"example":["erasure"],"description":"Calza si la solicitud pide AL MENOS UNO. Vacío = cualquiera."},"channels":{"type":"array","items":{"type":"string"},"example":["privacy_center","hosted_page"],"description":"Vacío = cualquiera."},"scopes":{"type":"array","items":{"type":"string","enum":["identifier","person"]},"description":"Vacío = cualquiera."},"areas":{"type":"array","items":{"type":"string"},"example":["Marketing"],"description":"Se comparan sin mayúsculas ni tildes. Vacío = cualquiera."},"userId":{"type":"string","example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"La persona de tu empresa que atiende. Tiene que estar activa."}},"required":["position","name","active","rights","channels","scopes","areas","userId"]},"UpdateRightsAssignmentRules":{"type":"object","properties":{"rules":{"type":"array","items":{"$ref":"#/components/schemas/RightsAssignmentRuleInput"},"maxItems":50}},"required":["rules"],"description":"La lista COMPLETA, en el orden en que se evalúa: reemplaza a la anterior. Una lista vacía deja a la empresa sin reglas."},"RightsAssignmentRuleInput":{"type":"object","properties":{"name":{"type":"string","example":"Erasure requests to Patricio"},"active":{"type":"boolean"},"rights":{"type":"array","items":{"type":"string"},"example":["erasure"],"description":"Calza si la solicitud pide AL MENOS UNO. Vacío = cualquiera."},"channels":{"type":"array","items":{"type":"string"},"example":["privacy_center","hosted_page"],"description":"Vacío = cualquiera."},"scopes":{"type":"array","items":{"type":"string","enum":["identifier","person"]},"description":"Vacío = cualquiera."},"areas":{"type":"array","items":{"type":"string"},"example":["Marketing"],"description":"Se comparan sin mayúsculas ni tildes. Vacío = cualquiera."},"userId":{"type":"string","example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5"}},"required":["name","userId"]},"DataProtectionCenterSettings":{"type":"object","properties":{"enabled":{"type":"boolean","description":"La página pública `/centro/<token>` con la marca de la empresa (artículo 35 del reglamento interno del CPLT, referencia)."},"url":{"type":["string","null"]},"inquiriesEnabled":{"type":"boolean","description":"El canal de consultas al delegado (artículo 92). Además exige un correo de contacto declarado."}},"required":["enabled","url","inquiriesEnabled"]},"UpdateDataProtectionCenterSettings":{"type":"object","properties":{"enabled":{"type":"boolean","description":"La página pública `/centro/<token>` con la marca de la empresa (artículo 35 del reglamento interno del CPLT, referencia)."},"inquiriesEnabled":{"type":"boolean","description":"El canal de consultas al delegado (artículo 92). Además exige un correo de contacto declarado."}}},"CatalogEntry":{"type":"object","properties":{"id":{"type":"string","example":"cat_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un catalogue entry, siempre con el prefijo `cat_`."},"key":{"type":"string","example":"crm_ventas","description":"La clave estable con la que los tratamientos citan esta entrada. No cambia aunque renombres."},"name":{"type":"string","example":"CRM de ventas"},"description":{"type":"string"},"sensitive":{"type":"boolean","description":"Sólo en las categorías de dato: si es dato sensible del art. 2 letra g."},"suggestedLegalBase":{"type":["string","null"],"description":"Sólo en las finalidades: la base de licitud que suele corresponder."},"own":{"type":"boolean","description":"`true` si la agregó tu empresa; las del catálogo de Datrus no se pueden desactivar."}},"required":["id","key","name","description","sensitive","suggestedLegalBase","own"]},"CreateCatalogEntry":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"example":"CRM de ventas"},"description":{"type":"string","maxLength":500},"sensitive":{"type":"boolean","description":"Sólo se guarda en `data-categories`."},"suggestedLegalBase":{"type":["string","null"],"maxLength":60,"description":"Sólo se guarda en `purposes`."}},"required":["name"]},"ProcessingActivityPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProcessingActivity"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"ProcessingActivity":{"type":"object","properties":{"id":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"code":{"type":"string","example":"TR-002","description":"El correlativo con el que se cita el tratamiento."},"name":{"type":"string","example":"Postulaciones de trabajo"},"area":{"type":"string","example":"Personas"},"owner":{"type":"object","properties":{"id":{"type":["string","null"]},"email":{"type":["string","null"]}},"required":["id","email"],"description":"Quién responde por este tratamiento dentro de la empresa."},"purpose":{"type":"string","example":"reclutamiento","description":"Clave del catálogo de finalidades."},"purposeDetail":{"type":"string"},"legalBasis":{"type":["string","null"],"enum":["consent","financial_obligations","contract","legal_obligation","legitimate_interest","legal_claims","vital_interests","public_task",null],"example":"consent","description":"`null` mientras no se declara; un tratamiento vigente no puede quedarse así."},"legalBasisReason":{"type":"string"},"dataCategories":{"type":"array","items":{"type":"string"},"example":["contacto","academico"]},"subjectKinds":{"type":"array","items":{"type":"string"},"example":["postulantes"]},"systems":{"type":"array","items":{"type":"string"},"example":["crm"]},"sensitive":{"type":"boolean","description":"Derivado: lo decide el catálogo de datos, no se declara a mano."},"minors":{"type":"boolean"},"minorsAgeRange":{"type":["string","null"],"enum":["under_14","from_14_to_15","from_16_to_17","unknown",null]},"securityMeasures":{"type":"string","description":"Las medidas del art. 14 quinquies para ESTE tratamiento."},"recipients":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"example":"Transbank S.A."},"role":{"type":"string","enum":["processor","assignee","legal_recipient"],"example":"processor","description":"La ley les da consecuencias distintas: `processor` trata por cuenta tuya y lleva contrato de encargo; `assignee` pasa a ser responsable por su cuenta; `legal_recipient` recibe porque una norma lo manda."}},"required":["name","role"]}},"nextReviewAt":{"type":["string","null"],"description":"Cuándo toca revisarlo. No es un plazo legal."},"automatedDecisions":{"type":"object","properties":{"enabled":{"type":"boolean"},"logic":{"type":"string","description":"Art. 5 f): la lógica, en términos comprensibles."},"effects":{"type":"string","description":"Art. 8 bis: qué efectos produce sobre el titular."},"humanReview":{"type":"boolean"},"reviewer":{"type":"object","properties":{"id":{"type":["string","null"]},"email":{"type":["string","null"]}},"required":["id","email"]}},"required":["enabled","logic","effects","humanReview","reviewer"]},"internationalTransfer":{"type":"object","properties":{"enabled":{"type":"boolean"},"countries":{"type":"array","items":{"type":"string"},"example":["US"]},"safeguard":{"type":["string","null"],"enum":["adequacy_decision","standard_clauses","binding_corporate_rules","certified_model","subject_consent","legal_exception",null],"description":"Con qué título del Título VII sale el dato de Chile."},"safeguardDetail":{"type":"string"}},"required":["enabled","countries","safeguard","safeguardDetail"]},"processors":{"type":"array","items":{"type":"string"},"description":"Encargados declarados como texto (histórico)."},"linkedProcessors":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"description":"Encargados registrados en el módulo de Proveedores."},"retention":{"type":"object","properties":{"rule":{"type":["string","null"],"enum":["while_relationship","legal_period","fixed_term","until_withdrawal",null]},"detail":{"type":"string"}},"required":["rule","detail"]},"risk":{"type":"string","enum":["low","medium","high","not_assessed"]},"dpiaRequired":{"type":"boolean"},"volume":{"type":["string","null"],"enum":["up_to_100","up_to_1000","up_to_10000","up_to_100000","over_100000",null],"example":"up_to_10000","description":"Rango, no número: la ley no define «gran escala» y un número exacto se desactualiza sellado."},"largeScale":{"type":["string","null"],"enum":["yes","no",null]},"publicAreaMonitoring":{"type":["string","null"],"enum":["yes","no",null]},"monitoringDetail":{"type":"string"},"state":{"type":"string","enum":["draft","current","archived"]},"version":{"type":"integer","description":"La última versión sellada. 0 = todavía ninguna."},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","name","area","owner","purpose","purposeDetail","legalBasis","legalBasisReason","dataCategories","subjectKinds","systems","sensitive","minors","minorsAgeRange","securityMeasures","recipients","nextReviewAt","automatedDecisions","internationalTransfer","processors","linkedProcessors","retention","risk","dpiaRequired","volume","largeScale","publicAreaMonitoring","monitoringDetail","state","version","createdBy","createdAt","updatedAt"]},"WriteProcessingActivity":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"area":{"type":"string","maxLength":120},"ownerId":{"type":["string","null"]},"purpose":{"type":"string","maxLength":120},"purposeDetail":{"type":"string","maxLength":2000},"legalBasis":{"type":["string","null"],"enum":["consent","financial_obligations","contract","legal_obligation","legitimate_interest","legal_claims","vital_interests","public_task",null]},"legalBasisReason":{"type":"string","maxLength":2000},"dataCategories":{"type":"array","items":{"type":"string"},"default":[]},"subjectKinds":{"type":"array","items":{"type":"string"},"default":[]},"systems":{"type":"array","items":{"type":"string"},"default":[]},"minors":{"type":"boolean"},"minorsAgeRange":{"type":["string","null"],"enum":["under_14","from_14_to_15","from_16_to_17","unknown",null]},"securityMeasures":{"type":"string","maxLength":4000},"recipients":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"example":"Transbank S.A."},"role":{"type":"string","enum":["processor","assignee","legal_recipient"],"example":"processor","description":"La ley les da consecuencias distintas: `processor` trata por cuenta tuya y lleva contrato de encargo; `assignee` pasa a ser responsable por su cuenta; `legal_recipient` recibe porque una norma lo manda."}},"required":["name","role"]}},"nextReviewAt":{"type":["string","null"]},"automatedDecisions":{"type":"object","properties":{"enabled":{"type":"boolean"},"logic":{"type":"string","maxLength":4000},"effects":{"type":"string","maxLength":4000},"humanReview":{"type":"boolean"},"reviewerId":{"type":["string","null"]}}},"internationalTransfer":{"type":"object","properties":{"enabled":{"type":"boolean"},"countries":{"type":"array","items":{"type":"string"}},"safeguard":{"type":["string","null"],"enum":["adequacy_decision","standard_clauses","binding_corporate_rules","certified_model","subject_consent","legal_exception",null]},"safeguardDetail":{"type":"string","maxLength":2000}}},"processors":{"type":"array","items":{"type":"string"}},"retention":{"type":"object","properties":{"rule":{"type":["string","null"],"enum":["while_relationship","legal_period","fixed_term","until_withdrawal",null]},"detail":{"type":"string","maxLength":2000}}},"volume":{"type":["string","null"],"enum":["up_to_100","up_to_1000","up_to_10000","up_to_100000","over_100000",null]},"largeScale":{"type":["string","null"],"enum":["yes","no",null]},"publicAreaMonitoring":{"type":["string","null"],"enum":["yes","no",null]},"monitoringDetail":{"type":"string","maxLength":2000}},"required":["name","purpose"]},"ActivityVersion":{"type":"object","properties":{"version":{"type":"integer"},"hash":{"type":"string","description":"sha256 del contenido canonicalizado. Recomputable por un tercero."},"sealedBy":{"type":"string"},"sealedAt":{"type":"string"},"content":{"type":"object","additionalProperties":{},"description":"La foto congelada, tal como se selló."}},"required":["version","hash","sealedBy","sealedAt","content"]},"ActivityFinding":{"type":"object","properties":{"key":{"type":"string","example":"sin_base"},"name":{"type":"string"}},"required":["key","name"]},"ImportProcessingActivities":{"type":"object","properties":{"csv":{"type":"string","minLength":1,"description":"El contenido de la planilla, separada por punto y coma o por coma. Hasta 300 filas."},"mapping":{"type":"object","additionalProperties":{"type":"integer"},"description":"Qué columna corresponde a cada campo, cuando los encabezados no bastan."},"dryRun":{"type":"boolean","default":false,"description":"`true` analiza y no escribe: es la previsualización de la consola."}},"required":["csv"]},"RegisterSnapshot":{"type":"object","properties":{"number":{"type":"integer","example":3,"description":"Correlativo por empresa. Es como se cita un corte."},"activities":{"type":"integer","description":"Cuántos tratamientos vigentes entraron en la foto."},"rootHash":{"type":"string","example":"a3f1…","description":"sha256 de los hashes de versión, ordenados por código. Un tercero lo recomputa sin nosotros."},"exportable":{"type":"boolean","description":"`false` si la foto está incompleta: se puede citar, pero no descargar reproduciendo su hash."},"createdBy":{"type":"string"},"createdAt":{"type":"string"}},"required":["number","activities","rootHash","exportable","createdBy","createdAt"]},"RegisterDiff":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"},"added":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}},"required":["code","name"]},"description":"Tratamientos que entraron entre un corte y el otro."},"removed":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}},"required":["code","name"]}},"changed":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}}},"required":["code","name","fields"]},"description":"Los que cambiaron, con el nombre de cada campo que cambió."},"unchanged":{"type":"integer"}},"required":["from","to","added","removed","changed","unchanged"]},"DataMap":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"sensitive":{"type":"boolean"}},"required":["key","name","sensitive"]}},"systems":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"activities":{"type":"integer"},"sensitiveCategories":{"type":"integer"},"categories":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"sensitive":{"type":"boolean"},"activities":{"type":"integer"}},"required":["key","name","sensitive","activities"]}}},"required":["key","name","activities","sensitiveCategories","categories"]}},"sensitiveInUse":{"type":"integer"}},"required":["categories","systems","sensitiveInUse"]},"RequiredModule":{"type":"object","properties":{"module":{"type":"string","example":"consent"},"name":{"type":"string","example":"Consentimiento"},"reason":{"type":"string"},"activities":{"type":"integer","description":"Cuántos tratamientos lo exigen."}},"required":["module","name","reason","activities"]},"ConsentTemplatePage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentTemplate"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"ConsentTemplate":{"type":"object","properties":{"id":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent template, siempre con el prefijo `tpl_`."},"code":{"type":"string","example":"PL-003"},"name":{"type":"string","example":"Newsletter y ofertas"},"kind":{"type":"string","enum":["consent","cookies","third_parties","contract","other"]},"primaryUse":{"type":"string","description":"La finalidad principal; la hereda del tratamiento cuando está enlazada."},"secondaryUses":{"type":"array","items":{"type":"string"}},"legalBasis":{"type":["string","null"],"enum":["consent","financial_obligations","contract","legal_obligation","legitimate_interest","legal_claims","vital_interests","public_task",null]},"processingActivityId":{"type":["string","null"],"example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El tratamiento del RAT que sostiene esta plantilla."},"mandatory":{"type":"boolean"},"state":{"type":"string","enum":["draft","active","paused","archived"]},"verification":{"type":"object","properties":{"required":{"type":"integer","example":1,"description":"Nivel exigido: 0 posesión del enlace, 1 código de un solo uso, 2 conocimiento, 3 passkey."},"suggested":{"type":"integer","description":"El que sugiere el tratamiento del inventario."},"reason":{"type":"string","description":"Por qué se bajó del sugerido, si se bajó."}},"required":["required","suggested","reason"]},"outdatedAt":{"type":["string","null"],"description":"Cuándo el inventario marcó que el tratamiento cambió: los titulares quedan pendientes de reconsentir."},"outdatedReason":{"type":"string"},"version":{"type":"integer","description":"La última versión publicada. 0 = todavía ninguna."},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","name","kind","primaryUse","secondaryUses","legalBasis","processingActivityId","mandatory","state","verification","outdatedAt","outdatedReason","version","createdBy","createdAt","updatedAt"]},"ConsentTemplateVersion":{"type":"object","properties":{"version":{"type":"integer"},"legalBasis":{"type":["string","null"],"enum":["consent","financial_obligations","contract","legal_obligation","legitimate_interest","legal_claims","vital_interests","public_task",null]},"text":{"type":"string","description":"El texto tal como se escribió, con sus marcadores."},"resolvedText":{"type":"string","description":"El texto que leyó la persona, con los marcadores ya resueltos."},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/ConsentScope"}},"documents":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"documentId":{"type":"string"},"version":{"type":"integer"},"hash":{"type":"string"}},"required":["key","documentId","version","hash"]},"description":"Qué versión de qué documento de privacidad resolvió cada marcador al publicar."},"hash":{"type":"string"},"publishedBy":{"type":"string"},"publishedAt":{"type":"string"}},"required":["version","legalBasis","text","resolvedText","scopes","documents","hash","publishedBy","publishedAt"]},"ConsentScope":{"type":"object","properties":{"key":{"type":"string","example":"newsletter","description":"La clave con la que se cita este alcance al registrar."},"use":{"type":"string","description":"Para qué se usa, en las palabras de la empresa."},"label":{"type":["string","null"],"description":"Cómo se le nombra a la persona, cuando la clave no basta."},"dataCategories":{"type":"array","items":{"type":"string"},"example":["contacto"]},"subjectKinds":{"type":"array","items":{"type":"string"},"example":["clientes"]},"validForDays":{"type":["integer","null"]},"mandatory":{"type":"boolean","description":"Un alcance obligatorio decide si el titular cumple o no cumple."}},"required":["key","dataCategories","subjectKinds"]},"CreateConsentTemplate":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":40,"example":"PL-003","description":"Único en tu empresa."},"name":{"type":"string","minLength":1,"maxLength":200},"kind":{"type":"string","enum":["consent","cookies","third_parties","contract","other"]},"primaryUse":{"type":"string","maxLength":200},"secondaryUses":{"type":"array","items":{"type":"string"}},"legalBasis":{"type":"string","enum":["consent","financial_obligations","contract","legal_obligation","legitimate_interest","legal_claims","vital_interests","public_task"]},"mandatory":{"type":"boolean"},"text":{"type":"string","minLength":1,"description":"Puede citar documentos con marcadores; al publicar se resuelven y se sellan."},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/ConsentScope"},"minItems":1,"description":"Uno por cada cosa que se autoriza por separado."}},"required":["code","name","primaryUse","legalBasis","text","scopes"]},"ConsentTemplateStats":{"type":"object","properties":{"templateId":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent template, siempre con el prefijo `tpl_`."},"grants":{"type":"integer","description":"Actos de otorgar en la ventana."},"revocations":{"type":"integer","description":"Actos de revocar en la ventana."},"subjectsGranted":{"type":"integer","description":"Personas distintas que otorgaron."},"subjectsRevoked":{"type":"integer","description":"Personas distintas que retiraron."},"uniqueSubjects":{"type":"integer","description":"Personas distintas que tocaron la plantilla, otorgando o retirando."},"entriesStarted":{"type":"integer","description":"Entradas iniciadas en los formularios alojados de esta plantilla."},"entriesCompleted":{"type":"integer"},"conversionRate":{"type":["number","null"],"example":0.62,"description":"Completadas / iniciadas, entre 0 y 1. `null` si nadie abrió el formulario: no es 0."},"withdrawalRate":{"type":["number","null"],"example":0.05,"description":"Personas que retiraron / personas que otorgaron. `null` si nadie otorgó."}},"required":["templateId","grants","revocations","subjectsGranted","subjectsRevoked","uniqueSubjects","entriesStarted","entriesCompleted","conversionRate","withdrawalRate"]},"EditConsentTemplate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"kind":{"type":"string","enum":["consent","cookies","third_parties","contract","other"]},"primaryUse":{"type":"string","maxLength":200},"secondaryUses":{"type":"array","items":{"type":"string"}},"legalBasis":{"type":"string","enum":["consent","financial_obligations","contract","legal_obligation","legitimate_interest","legal_claims","vital_interests","public_task"]},"mandatory":{"type":"boolean"},"text":{"type":"string","minLength":1},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/ConsentScope"},"minItems":1}},"required":["text","scopes"]},"ChangeTemplateState":{"type":"object","properties":{"state":{"type":"string","enum":["draft","active","paused","archived"]}},"required":["state"]},"LinkTemplate":{"type":"object","properties":{"processingActivityId":{"type":["string","null"]}},"required":["processingActivityId"]},"ConsentRequestPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentRequest"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"ConsentRequest":{"type":"object","properties":{"id":{"type":"string","example":"csr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent request, siempre con el prefijo `csr_`."},"code":{"type":"string","example":"SO-0042"},"agreementId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El acuerdo de esa persona con tu empresa; es estable en el tiempo."},"state":{"type":"string","enum":["issued","sent","opened","verified","decided","expired","disputed","cancelled"]},"carrier":{"type":"string","enum":["email","sms","whatsapp","qr","kiosk","operator","spreadsheet","api","web"],"description":"Por dónde salió el enlace."},"destinationHint":{"type":"string","example":"a***@empresa.cl","description":"Lo justo para reconocerla. El destino completo no se guarda en claro."},"verification":{"type":"object","properties":{"required":{"type":"integer","example":1},"reached":{"type":["integer","null"],"description":"`null` mientras la persona no ha llegado a verificarse."}},"required":["required","reached"]},"sender":{"type":"string","enum":["operator","spreadsheet","qr","kiosk","api"]},"expiresAt":{"type":"string"},"createdAt":{"type":"string"},"sentAt":{"type":["string","null"]},"openedAt":{"type":["string","null"]},"decidedAt":{"type":["string","null"]},"disputedReason":{"type":"string"}},"required":["id","code","agreementId","state","carrier","destinationHint","verification","sender","expiresAt","createdAt","sentAt","openedAt","decidedAt","disputedReason"]},"ConsentRequestStats":{"type":"object","additionalProperties":{"type":"integer"},"example":{"issued":3,"sent":12,"decided":40}},"CreateConsentRequest":{"type":"object","properties":{"templateId":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"subject":{"$ref":"#/components/schemas/SubjectIdentifier"},"carrier":{"type":"string","enum":["email","sms","whatsapp","qr","kiosk","operator","spreadsheet","api","web"],"example":"email","description":"Por dónde va el enlace. `email`, `sms` y `whatsapp` mandan un mensaje; los demás lo entregan en persona o lo muestran."},"destination":{"type":"string","maxLength":320,"description":"El correo o el teléfono al que va el enlace. Obligatorio con `email`, `sms` y `whatsapp`."},"requiredVerification":{"type":"integer","minimum":0,"maximum":3,"description":"Por defecto, el nivel que exige la plantilla."},"validForDays":{"type":"integer","minimum":1,"maximum":365}},"required":["templateId","subject","carrier"]},"SubjectIdentifier":{"type":"object","properties":{"type":{"type":"string","enum":["email","rut","phone","external"],"example":"email"},"value":{"type":"string","minLength":1,"maxLength":200,"example":"ana@empresa.cl"}},"required":["type","value"],"description":"A quién se le pide. Se normaliza, se convierte en huella y se descarta."},"ConsentRequestDelivery":{"type":"object","properties":{"carrier":{"type":"string"},"purpose":{"type":"string"},"provider":{"type":"string"},"destinationHint":{"type":"string"},"state":{"type":"string","enum":["queued","sent","delivered","failed","bounced"]},"errorCode":{"type":"string"},"costClp":{"type":"integer"},"createdAt":{"type":"string"}},"required":["carrier","purpose","provider","destinationHint","state","errorCode","costClp","createdAt"]},"ConsentRequestVerification":{"type":"object","properties":{"level":{"type":"integer"},"method":{"type":"string","example":"email_code"},"result":{"type":"string","enum":["pending","ok","failed","expired"]},"attempts":{"type":"integer"},"issuedAt":{"type":"string"},"resolvedAt":{"type":["string","null"]}},"required":["level","method","result","attempts","issuedAt","resolvedAt"]},"Agreement":{"type":"object","properties":{"id":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."},"identifierType":{"type":"string","example":"email"},"identifierHint":{"type":"string","example":"j***@e***.cl","description":"Lo único legible. El identificador en claro no se guarda jamás."},"state":{"type":"string","enum":["active","merged"]},"mergedIntoId":{"type":["string","null"],"example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."},"version":{"type":"integer","description":"La última versión cerrada del acuerdo. 0 = ninguna."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","identifierType","identifierHint","state","mergedIntoId","version","createdAt","updatedAt"]},"SealedConsentEvidence":{"type":"object","properties":{"formato":{"type":"string"},"hash":{"type":"string"},"verificarEn":{"type":"string"},"sello":{"type":"object","properties":{"documento":{},"diff":{}}}},"required":["formato","hash","verificarEn","sello"]},"AgreementPermissions":{"type":"object","properties":{"agreementId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."},"redirectedFrom":{"type":"array","items":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."},"description":"Los acuerdos que se fusionaron en éste. Un id viejo sigue resolviendo."},"current":{"type":"array","items":{"$ref":"#/components/schemas/CurrentPermission"}},"withdrawn":{"type":"array","items":{"$ref":"#/components/schemas/AgreementPermission"},"description":"Otorgado alguna vez y hoy sin ninguna plantilla que lo sostenga."},"heldDespiteRevocation":{"type":"array","items":{"$ref":"#/components/schemas/CurrentPermission"},"description":"Sobrevivieron a una revocación porque otra plantilla los sigue requiriendo."}},"required":["agreementId","redirectedFrom","current","withdrawn","heldDespiteRevocation"]},"CurrentPermission":{"allOf":[{"$ref":"#/components/schemas/AgreementPermission"},{"type":"object","properties":{"sources":{"type":"array","items":{"$ref":"#/components/schemas/PermissionSource"},"description":"Las plantillas que hoy sostienen este permiso, con su base de licitud."},"onlyArchivedSources":{"type":"boolean","description":"El permiso está vivo —archivar no revoca—, pero ya no se podría volver a pedir con el texto que lo originó."}},"required":["sources","onlyArchivedSources"]}]},"PermissionSource":{"type":"object","properties":{"templateId":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent template, siempre con el prefijo `tpl_`."},"version":{"type":"integer"},"legalBasis":{"type":["string","null"],"enum":["consent","contract","legal_obligation","legitimate_interest","vital_interests","public_task",null]},"templateState":{"type":"string","enum":["active","archived"]}},"required":["templateId","version","legalBasis","templateState"]},"AgreementPermission":{"type":"object","properties":{"dataCategory":{"type":"string","example":"contacto"},"use":{"type":"string","example":"marketing"},"subjectKind":{"type":"string","example":"clientes"},"scope":{"type":"string","example":"newsletter"},"expiresAt":{"type":["string","null"],"description":"`null` = sin vencimiento declarado."}},"required":["dataCategory","use","subjectKind","scope","expiresAt"]},"AgreementDossier":{"type":"object","properties":{"agreementId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."},"identifierType":{"type":"string"},"identifierHint":{"type":"string"},"registeredSince":{"type":"string"},"currentVersion":{"type":"integer"},"redirectedFrom":{"type":"array","items":{"type":"string"}},"complete":{"type":"boolean","description":"`false` cuando el acuerdo absorbió más registros de los que se leen. Se dice, no se disimula."},"whatWeStore":{"type":"object","properties":{"type":{"type":"string"},"hash":{"type":"string"},"hint":{"type":"string"},"fingerprintKey":{"type":"integer"},"since":{"type":"string"}},"required":["type","hash","hint","fingerprintKey","since"],"description":"Exactamente lo que Datrus guarda de esta persona: una huella, nunca el identificador."},"authorisations":{"type":"array","items":{"type":"object","properties":{"templateId":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent template, siempre con el prefijo `tpl_`."},"templateName":{"type":"string"},"templateCode":{"type":"string"},"current":{"type":"boolean"},"acceptedVersion":{"type":["integer","null"]},"currentVersion":{"type":["integer","null"]},"lastGrant":{"$ref":"#/components/schemas/AgreementAct"},"lastWithdrawal":{"$ref":"#/components/schemas/AgreementAct"}},"required":["templateId","templateName","templateCode","current","acceptedVersion","currentVersion","lastGrant","lastWithdrawal"]}},"acts":{"type":"array","items":{"$ref":"#/components/schemas/AgreementAct"},"description":"Del más nuevo al más viejo."}},"required":["agreementId","identifierType","identifierHint","registeredSince","currentVersion","redirectedFrom","complete","whatWeStore","authorisations","acts"]},"AgreementAct":{"type":["object","null"],"properties":{"kind":{"type":"string","enum":["grant","revoke"]},"at":{"type":"string","description":"Cuándo ocurrió PARA LA PERSONA."},"templateId":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent template, siempre con el prefijo `tpl_`."},"templateName":{"type":"string"},"templateCode":{"type":"string"},"templateVersion":{"type":"integer"},"scopes":{"type":"array","items":{"type":"string"},"description":"En las palabras que la persona leyó. Vacío en un retiro total."},"through":{"type":"string","example":"digital","description":"Por dónde entró el acto."},"verification":{"type":"string","description":"Qué se probó sobre quién decidía."},"agreementVersion":{"type":["integer","null"]},"hash":{"type":"string","description":"El sello del acto. Recomputable por un tercero."},"requestCode":{"type":"string"}},"required":["kind","at","templateId","templateName","templateCode","templateVersion","scopes","through","verification","agreementVersion","hash","requestCode"]},"RevocationPreview":{"type":"object","properties":{"agreementId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."},"changes":{"type":"boolean","description":"`true` si hay algo que sellar: cambió el diff o se retiró alguna fuente."},"before":{"type":"object","properties":{"current":{"type":"array","items":{"$ref":"#/components/schemas/CurrentPermission"}},"withdrawn":{"type":"array","items":{"$ref":"#/components/schemas/AgreementPermission"},"description":"Otorgado alguna vez y hoy sin ninguna plantilla que lo sostenga."},"heldDespiteRevocation":{"type":"array","items":{"$ref":"#/components/schemas/CurrentPermission"},"description":"Sobrevivieron a una revocación porque otra plantilla los sigue requiriendo."}},"required":["current","withdrawn","heldDespiteRevocation"]},"after":{"type":"object","properties":{"current":{"type":"array","items":{"$ref":"#/components/schemas/CurrentPermission"}},"withdrawn":{"type":"array","items":{"$ref":"#/components/schemas/AgreementPermission"},"description":"Otorgado alguna vez y hoy sin ninguna plantilla que lo sostenga."},"heldDespiteRevocation":{"type":"array","items":{"$ref":"#/components/schemas/CurrentPermission"},"description":"Sobrevivieron a una revocación porque otra plantilla los sigue requiriendo."}},"required":["current","withdrawn","heldDespiteRevocation"]},"diff":{"type":"object","properties":{"created":{"type":"array","items":{"$ref":"#/components/schemas/AgreementPermission"}},"removed":{"type":"array","items":{"$ref":"#/components/schemas/AgreementPermission"}},"extended":{"type":"array","items":{"$ref":"#/components/schemas/AgreementPermission"},"description":"El mismo permiso con una vigencia mayor. No es uno nuevo."},"shortened":{"type":"array","items":{"$ref":"#/components/schemas/AgreementPermission"},"description":"El mismo permiso con una vigencia menor: un cambio que el titular tiene derecho a ver."}},"required":["created","removed","extended","shortened"]},"survive":{"type":"array","items":{"$ref":"#/components/schemas/CurrentPermission"},"description":"Permisos de la plantilla revocada que siguen vivos porque otra los sostiene."}},"required":["agreementId","changes","before","after","diff","survive"]},"RevocationPreviewRequest":{"type":"object","properties":{"templateId":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}}},"required":["templateId"]},"ConsentStats":{"type":"object","properties":{"dataSubjects":{"type":"integer"},"withCurrentAuthorisation":{"type":"integer"},"withoutAuthorisation":{"type":"integer"},"pendingReconsent":{"type":"integer","description":"Pares (persona, plantilla) sostenidos con una versión anterior a la vigente."},"pendingRequests":{"type":"integer"},"decidedLast30Days":{"type":"integer"},"disputed":{"type":"integer"}},"required":["dataSubjects","withCurrentAuthorisation","withoutAuthorisation","pendingReconsent","pendingRequests","decidedLast30Days","disputed"]},"ConsentActivity":{"type":"object","properties":{"type":{"type":"string"},"entity":{"type":"string"},"entityId":{"type":["string","null"]},"summary":{"type":"string"},"actor":{"type":"string"},"at":{"type":"string"}},"required":["type","entity","entityId","summary","actor","at"]},"ThirdPartyRole":{"type":"object","properties":{"role":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}},"required":["role","name","description"]},"ThirdParty":{"type":"object","properties":{"id":{"type":"string","example":"trd_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un third party, siempre con el prefijo `trd_`."},"code":{"type":"string","example":"retail_austral","description":"Identificador estable en minúsculas. No es el nombre: el nombre se puede cambiar sin romper lo sellado."},"name":{"type":"string","example":"Retail Austral SpA","description":"La razón social. Nunca el dato de una persona: un tercero es una empresa."},"role":{"type":"string","enum":["processor","assignee","collector","recipient"]},"country":{"type":"string","example":"CL","description":"Código de dos letras, no el nombre del país."},"state":{"type":"string","enum":["active","archived"]},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","name","role","country","state","createdBy","createdAt","updatedAt"]},"WriteThirdParty":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":60,"example":"retail_austral"},"name":{"type":"string","minLength":1,"maxLength":200},"role":{"type":"string","enum":["processor","assignee","collector","recipient"]},"country":{"type":"string","minLength":2,"maxLength":2,"example":"CL"}},"required":["code","name","role","country"]},"ChangeThirdPartyState":{"type":"object","properties":{"state":{"type":"string","enum":["active","archived"]}},"required":["state"]},"LinkedThirdParty":{"type":"object","properties":{"thirdPartyId":{"type":"string","example":"trd_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un third party, siempre con el prefijo `trd_`."},"code":{"type":"string"},"role":{"type":"string","enum":["processor","assignee","collector","recipient"]},"country":{"type":"string"}},"required":["thirdPartyId","code","role","country"]},"SetTemplateThirdParties":{"type":"object","properties":{"thirdPartyIds":{"type":"array","items":{"type":"string"}}},"required":["thirdPartyIds"]},"ManagementResult":{"type":"object","properties":{"id":{"type":"string","description":"La fila de gestión. Vacía si no hizo falta escribirla."},"agreementId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."},"repeated":{"type":"boolean","description":"`true` si ese `sourceEvent` ya se había aplicado: no se selló nada nuevo."},"noChanges":{"type":"boolean","description":"`true` si el acto no cambiaba nada: se registra el intento, no una versión."},"version":{"type":["integer","null"]},"diff":{"$ref":"#/components/schemas/PermissionDiff"},"withdrawnSources":{"type":"integer","description":"Cuántas fuentes dejaron de sostener un permiso, sobreviva o no el permiso."}},"required":["id","agreementId","repeated","noChanges","version","diff","withdrawnSources"]},"PermissionDiff":{"type":["object","null"],"properties":{"created":{"type":"array","items":{"$ref":"#/components/schemas/ManagedPermission"}},"removed":{"type":"array","items":{"$ref":"#/components/schemas/ManagedPermission"}},"extended":{"type":"array","items":{"$ref":"#/components/schemas/ManagedPermission"}},"shortened":{"type":"array","items":{"$ref":"#/components/schemas/ManagedPermission"}}},"required":["created","removed","extended","shortened"]},"ManagedPermission":{"type":"object","properties":{"dataCategory":{"type":"string"},"use":{"type":"string"},"subjectKind":{"type":"string"},"scope":{"type":"string"},"expiresAt":{"type":["string","null"]}},"required":["dataCategory","use","subjectKind","scope","expiresAt"]},"CreateConsentRevocation":{"type":"object","properties":{"agreementId":{"type":"string"},"templateId":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"},"description":"Vacío u omitido: la plantilla entera."},"reasonCode":{"type":"string","maxLength":60,"example":"solicitud_del_titular","description":"Un código del catálogo, nunca una frase."},"reasonText":{"type":"string","maxLength":500,"description":"La explicación, en tus palabras. No puede traer el dato de una persona."},"sourceEvent":{"type":"string","maxLength":120,"description":"El identificador del hecho que originó esto. La idempotencia cuelga de acá: repetirlo no sella dos veces."}},"required":["agreementId","templateId"]},"ConsentCorrectionPreview":{"type":"object","properties":{"narrowsOnly":{"type":"boolean","description":"`false` si ampliaría: entonces no se puede aplicar como corrección."},"grantedBefore":{"type":"array","items":{"type":"string"},"description":"Lo que esa plantilla sostenía antes. Es lo que una reversión restauraría."},"withdrawnScopes":{"type":"array","items":{"type":"string"}},"widenedScopes":{"type":"array","items":{"type":"string"}},"changes":{"type":"boolean"},"diff":{"$ref":"#/components/schemas/PermissionDiff"}},"required":["narrowsOnly","grantedBefore","withdrawnScopes","widenedScopes","changes","diff"]},"PreviewConsentCorrection":{"type":"object","properties":{"agreementId":{"type":"string"},"templateId":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"},"description":"El conjunto que DEBIÓ quedar otorgado."}},"required":["agreementId","templateId","scopes"]},"CreateConsentCorrection":{"type":"object","properties":{"agreementId":{"type":"string"},"templateId":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"reasonCode":{"type":"string","maxLength":60,"example":"solicitud_del_titular","description":"Un código del catálogo, nunca una frase."},"reasonText":{"type":"string","maxLength":500,"description":"La explicación, en tus palabras. No puede traer el dato de una persona."},"sourceEvent":{"type":"string","maxLength":120,"description":"El identificador del hecho que originó esto. La idempotencia cuelga de acá: repetirlo no sella dos veces."}},"required":["agreementId","templateId","scopes"]},"RollbackConsentCorrection":{"type":"object","properties":{"reasonCode":{"type":"string","maxLength":60,"example":"solicitud_del_titular","description":"Un código del catálogo, nunca una frase."},"reasonText":{"type":"string","maxLength":500,"description":"La explicación, en tus palabras. No puede traer el dato de una persona."},"sourceEvent":{"type":"string","maxLength":120,"description":"El identificador del hecho que originó esto. La idempotencia cuelga de acá: repetirlo no sella dos veces."}}},"SubjectMerge":{"type":"object","properties":{"id":{"type":"string"},"agreementId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El registro que quedó vigente."},"absorbedId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."},"repeated":{"type":"boolean"},"version":{"type":["integer","null"]}},"required":["id","agreementId","absorbedId","repeated","version"]},"CreateSubjectMerge":{"type":"object","properties":{"survivingAgreementId":{"type":"string","description":"El registro que QUEDA. Tiene que estar vigente."},"absorbedAgreementId":{"type":"string"},"reasonCode":{"type":"string","example":"mismo_titular_verificado","description":"Uno de: mismo_titular_verificado, duplicado_por_canal, solicitud_del_titular, correccion_de_registro, otro."},"reasonText":{"type":"string","maxLength":500}},"required":["survivingAgreementId","absorbedAgreementId","reasonCode"]},"ImportableTemplate":{"type":"object","properties":{"templateId":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent template, siempre con el prefijo `tpl_`."},"code":{"type":"string"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}}},"required":["templateId","code","name","scopes"]},"ConsentImportResult":{"type":"object","properties":{"total":{"type":"integer","description":"Registros que tiene el archivo completo."},"from":{"type":"integer"},"processed":{"type":"integer","description":"Los que esta tanda alcanzó a mirar."},"done":{"type":"boolean","description":"`false` si quedan registros: vuelve a llamar con `from` = `from + processed`."},"records":{"type":"array","items":{"type":"object","properties":{"row":{"type":"integer","description":"El número de fila DEL ARCHIVO: lo único con lo que vuelves a él."},"subjectHint":{"type":"string"},"state":{"type":"string","enum":["created","repeated","unchanged","rejected"]},"reason":{"type":"string"}},"required":["row","subjectHint","state"]}}},"required":["total","from","processed","done","records"]},"CreateConsentImport":{"type":"object","properties":{"data":{"type":"string","minLength":1,"description":"El contenido del archivo: CSV, JSON o NDJSON. Se detecta solo."},"format":{"type":"string","enum":["csv","json","ndjson"]},"mapping":{"type":"object","additionalProperties":{"type":"integer"},"description":"Qué columna es cada campo, cuando los encabezados no bastan."},"from":{"type":"integer","minimum":0,"description":"Índice del primer registro de esta tanda. Por omisión, 0."}},"required":["data"]},"DataSubjectRequestPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DataSubjectRequest"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"DataSubjectRequest":{"type":"object","properties":{"id":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un data subject request, siempre con el prefijo `dsr_`."},"code":{"type":"string","example":"K7M2P9","description":"El código con el que la persona sigue su solicitud."},"externalReference":{"type":"string"},"state":{"type":"string","enum":["awaiting_verification","validating","in_progress","resolved","identity_not_matched","expired"]},"outcome":{"type":["string","null"],"enum":["granted","partially_granted","refused",null]},"channel":{"type":"string","enum":["hosted_page","privacy_center","intake_email","console","widget","api"]},"rights":{"type":"array","items":{"type":"string","enum":["access","rectification","erasure","objection","automated_decision","blocking","portability"]}},"agreementId":{"type":["string","null"],"example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El acuerdo de esa persona, cuando se pudo enlazar."},"identifierType":{"type":"string"},"identifierHint":{"type":"string","example":"a***@e***.cl","description":"El identificador en claro no se guarda: sólo su huella y esta pista."},"receivedAt":{"type":"string"},"acknowledgedAt":{"type":["string","null"]},"deadline":{"type":"object","properties":{"from":{"type":"string","enum":["receipt","validation"],"description":"Desde dónde corre el plazo en esta empresa."},"dueAt":{"type":["string","null"]},"daysLeft":{"type":["integer","null"],"description":"Negativo si ya venció."},"stage":{"type":"string","enum":["not_started","on_time","due_soon","critical","overdue","resolved"]},"extendedAt":{"type":["string","null"]},"extensionReason":{"type":"string"}},"required":["from","dueAt","daysLeft","stage","extendedAt","extensionReason"]},"respondedAt":{"type":["string","null"]},"responseSentTo":{"type":"string","description":"La pista del correo al que se remitió el aviso de respuesta al cerrar; vacío si no salió."},"responseViewedAt":{"type":["string","null"],"description":"Cuándo el titular abrió la respuesta en su portal de derechos. Constancia de recepción."},"refusalReason":{"type":"string"},"internalNote":{"type":"string","description":"La nota interna de tu equipo. No se le muestra al titular."},"assignedTo":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"area":{"type":"string"},"version":{"type":"integer"}},"required":["id","code","externalReference","state","outcome","channel","rights","agreementId","identifierType","identifierHint","receivedAt","acknowledgedAt","deadline","respondedAt","responseSentTo","responseViewedAt","refusalReason","internalNote","assignedTo","area","version"]},"RightsStats":{"type":"object","properties":{"open":{"type":"integer"},"dueSoon":{"type":"integer"},"overdue":{"type":"integer"},"resolvedLast30Days":{"type":"integer"},"deadlineDays":{"type":"integer","description":"El plazo legal en días corridos."}},"required":["open","dueSoon","overdue","resolvedLast30Days","deadlineDays"]},"CreateDataSubjectRequest":{"type":"object","properties":{"rights":{"type":"array","items":{"type":"string","enum":["access","rectification","erasure","objection","automated_decision","blocking","portability"]},"minItems":1,"example":["access"],"description":"Uno o varios. Cada uno se tramita como su propio proceso."},"subject":{"allOf":[{"$ref":"#/components/schemas/SubjectIdentifier"},{"description":"Quién pide. Se hashea y se descarta: no se guarda en ninguna columna ni en ningún evento."}]},"channel":{"type":"string","enum":["hosted_page","privacy_center","intake_email","console","widget","api"],"description":"Por dónde entró. Por omisión, `api`."},"externalReference":{"type":"string","maxLength":120,"description":"Tu número de ticket, para conciliar con tu mesa de ayuda."},"area":{"type":"string","maxLength":120},"receivedAt":{"type":"string","description":"Cuándo llegó de verdad, si no fue ahora: una que entró por correo ayer. El plazo corre desde acá."}},"required":["rights","subject"]},"RightsProcess":{"type":"object","properties":{"id":{"type":"string","example":"prs_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un rights process, siempre con el prefijo `prs_`."},"right":{"type":"string","enum":["access","rectification","erasure","objection","automated_decision","blocking","portability"]},"state":{"type":"string","enum":["open","granted","refused"]},"verification":{"type":"object","properties":{"required":{"type":"string","enum":["none","prior_relationship","identifier_control","document","biometrics","registro_civil","in_person"]},"reached":{"type":"string","enum":["none","prior_relationship","identifier_control","document","biometrics","registro_civil","in_person"]}},"required":["required","reached"]},"refusalReason":{"type":"string"},"response":{"type":"string","description":"Lo que la empresa le dijo al titular sobre este derecho. Lo lee en su portal de derechos."},"resolvedBy":{"type":"string"},"resolvedAt":{"type":["string","null"]},"details":{"type":"object","additionalProperties":{},"description":"El contexto que la persona dio para ESE derecho."}},"required":["id","right","state","verification","refusalReason","response","resolvedBy","resolvedAt","details"]},"ExtendRightsRequest":{"type":"object","properties":{"reason":{"type":"string","minLength":1,"maxLength":500}},"required":["reason"]},"AssignRightsRequest":{"type":"object","properties":{"userId":{"type":["string","null"]}},"required":["userId"]},"OrderBlocking":{"type":"object","properties":{"reason":{"type":"string","minLength":1,"maxLength":500}},"required":["reason"]},"ResolveRightsProcess":{"type":"object","properties":{"state":{"type":"string","enum":["granted","refused"]},"reason":{"type":"string","maxLength":2000,"description":"Obligatorio al rechazar."},"response":{"type":"string","maxLength":4000,"description":"Lo que se le dice al titular sobre este derecho; lo lee en su portal. Para una entrega, sube el archivo como `delivered_to_data_subject` en la evidencia."}},"required":["state"]},"RightsEvidence":{"type":"object","properties":{"id":{"type":"string","example":"evd_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un evidence, siempre con el prefijo `evd_`."},"source":{"type":"string","enum":["data_subject","controller"]},"label":{"type":"string","enum":["identity_document","power_of_attorney","in_person_record","response_attachment","delivered_to_data_subject"]},"labelName":{"type":"string"},"mime":{"type":"string"},"bytes":{"type":"integer"},"sha256":{"type":"string","description":"El sello del archivo. Recomputable sobre el cuerpo."},"createdAt":{"type":"string"},"purgedAt":{"type":["string","null"],"description":"Cuándo se vació el cuerpo. La ficha se queda; el archivo no."},"purgeAfter":{"type":"string","description":"El cuerpo se borra solo a los 30 días del cierre."}},"required":["id","source","label","labelName","mime","bytes","sha256","createdAt","purgedAt","purgeAfter"]},"UploadRightsEvidence":{"type":"object","properties":{"label":{"type":"string","enum":["in_person_record","response_attachment","delivered_to_data_subject"],"example":"response_attachment","description":"Qué es el archivo. Una llave actúa como la empresa: puede adjuntar el acta del mesón y el respaldo de la respuesta. La cédula y el poder los aporta la persona por la página pública."},"content":{"type":"string","minLength":1,"maxLength":4194308,"description":"El archivo en base64. Hasta 3 MB; sólo application/pdf, image/jpeg, image/png. El tipo se reconoce por el contenido, no por lo que digas."}},"required":["label","content"]},"DpoInquiry":{"type":"object","properties":{"id":{"type":"string","example":"inq_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un DPO inquiry, siempre con el prefijo `inq_`."},"code":{"type":"string","example":"CD-A1B2C3"},"subject":{"type":"string"},"message":{"type":"string"},"requesterHint":{"type":"string","example":"j***@c***.cl","description":"Masked on purpose. The email is never exposed by the API."},"state":{"type":"string","enum":["open","answered","closed"]},"receivedAt":{"type":"string"},"dueAt":{"type":"string","description":"A Datrus criterion (10 calendar days), not a legal deadline."},"answer":{"type":"string"},"answeredBy":{"type":"string"},"answeredAt":{"type":["string","null"]}},"required":["id","code","subject","message","requesterHint","state","receivedAt","dueAt","answer","answeredBy","answeredAt"]},"AnswerDpoInquiry":{"type":"object","properties":{"answer":{"type":"string","minLength":1,"maxLength":4000}},"required":["answer"]},"AiSystem":{"type":"object","properties":{"id":{"type":"string","example":"ais_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un AI system, siempre con el prefijo `ais_`."},"code":{"type":"string","example":"IA-001"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["in_house","third_party","embedded"]},"vendorId":{"type":["string","null"],"example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processor, siempre con el prefijo `prc_`."},"purpose":{"type":"string"},"inputData":{"type":"array","items":{"type":"string"}},"processesPersonalData":{"type":"boolean"},"significantDecisions":{"type":"boolean","description":"Decisions (or followed recommendations) with legal or significant effects on people: the case of Art. 8 bis."},"humanIntervention":{"type":"boolean"},"reviewRightInformed":{"type":"boolean"},"risk":{"type":"string","enum":["unclassified","low","medium","high","unacceptable"],"description":"Set by a person with a rationale. A Datrus criterion, not a legal category."},"riskRationale":{"type":"string"},"suggestedRisk":{"type":"string","description":"Derived from the declared facts; never `unacceptable`."},"ownerId":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"state":{"type":"string","enum":["draft","in_use","suspended","retired"]},"processingActivityIds":{"type":"array","items":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."}},"assessmentRequired":{"type":"boolean","description":"High/unacceptable risk, or a linked activity with automated decisions (Art. 15 ter a)."},"assessmentApproved":{"type":"boolean"},"findings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","enum":["unclassified","high_without_assessment","decision_without_safeguards","no_processing_activities","third_party_without_vendor","no_owner","assessment_required"]},"text":{"type":"string"},"article":{"type":"string"},"severity":{"type":"string","enum":["warning","critical"]}},"required":["code","text","article","severity"]}},"version":{"type":"integer"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","name","description","type","vendorId","purpose","inputData","processesPersonalData","significantDecisions","humanIntervention","reviewRightInformed","risk","riskRationale","suggestedRisk","ownerId","state","processingActivityIds","assessmentRequired","assessmentApproved","findings","version","createdAt","updatedAt"]},"AiSystemInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":4000},"type":{"type":"string","enum":["in_house","third_party","embedded"]},"vendorId":{"type":["string","null"],"example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processor, siempre con el prefijo `prc_`."},"purpose":{"type":"string","maxLength":2000},"inputData":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":40},"processesPersonalData":{"type":"boolean"},"significantDecisions":{"type":"boolean"},"humanIntervention":{"type":"boolean"},"reviewRightInformed":{"type":"boolean"},"risk":{"type":"string","enum":["unclassified","low","medium","high","unacceptable"]},"riskRationale":{"type":"string","maxLength":2000},"ownerId":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"processingActivityIds":{"type":"array","items":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."}}},"required":["name","type"]},"AiSystemState":{"type":"object","properties":{"state":{"type":"string","enum":["draft","in_use","suspended","retired"]}},"required":["state"]},"AiSystemAssessment":{"type":"object","properties":{"state":{"type":"string","enum":["draft","approved"]},"sections":{"type":"object","additionalProperties":{"type":"string"},"description":"Eight keys: purpose, data, bias, explainability, human_oversight, rights, testing, monitoring."},"missing":{"type":"array","items":{"type":"string"}},"approvedBy":{"type":["string","null"]},"approvedAt":{"type":["string","null"]},"hash":{"type":["string","null"]}},"required":["state","sections","missing","approvedBy","approvedAt","hash"]},"AiSystemAssessmentInput":{"type":"object","properties":{"sections":{"type":"object","additionalProperties":{"type":"string","maxLength":8000}}},"required":["sections"]},"Control":{"type":"object","properties":{"id":{"type":"string","example":"ctl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un control, siempre con el prefijo `ctl_`."},"code":{"type":"string","example":"CT-001"},"name":{"type":"string"},"description":{"type":"string"},"origin":{"type":"string","enum":["datrus_catalog","own","free_text"],"description":"`datrus_catalog` is a Datrus criterion (ISO 27001 Annex A and Art. 14 quinquies), not a list from the law."},"catalogReference":{"type":"string"},"ownerId":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"reviewPeriod":{"type":"string","enum":["once","monthly","quarterly","half_yearly","yearly"]},"state":{"type":"string","enum":["planned","implemented","retired"]},"evidenceState":{"type":"string","enum":["no_evidence","current","expiring","expired"],"description":"Derived from the most recent evidence as of today."},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/ControlEvidence"}},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","name","description","origin","catalogReference","ownerId","reviewPeriod","state","evidenceState","evidence","createdAt","updatedAt"]},"ControlEvidence":{"type":"object","properties":{"id":{"type":"string","example":"cev_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un control evidence, siempre con el prefijo `cev_`."},"description":{"type":"string"},"reference":{"type":"string","description":"Where the proof lives (path, case file, internal link). Never the file itself."},"sha256":{"type":["string","null"]},"validUntil":{"type":["string","null"]},"recordedBy":{"type":"string"},"recordedAt":{"type":"string"}},"required":["id","description","reference","sha256","validUntil","recordedBy","recordedAt"]},"ControlAdoptInput":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":40}},"required":["keys"]},"ControlInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":4000},"origin":{"type":"string","enum":["datrus_catalog","own","free_text"]},"catalogReference":{"type":"string","maxLength":120},"ownerId":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"reviewPeriod":{"type":"string","enum":["once","monthly","quarterly","half_yearly","yearly"]},"state":{"type":"string","enum":["planned","implemented","retired"]}},"required":["name","origin","reviewPeriod"]},"ControlEvidenceInput":{"type":"object","properties":{"description":{"type":"string","minLength":1,"maxLength":500},"reference":{"type":"string","maxLength":500},"sha256":{"type":["string","null"],"pattern":"^[0-9a-f]{64}$"},"validUntil":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Omitted = suggested from the review period; `null` = does not expire."}},"required":["description"]},"Risk":{"type":"object","properties":{"id":{"type":"string","example":"rrg_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un register risk, siempre con el prefijo `rrg_`."},"code":{"type":"string","example":"RG-001"},"origin":{"type":"string","enum":["dpia","processing_activity","vendor","incident","ai_system","manual"]},"originId":{"type":["string","null"],"description":"The encoded id of the source record (processing activity, vendor, incident or AI system); null for dpia and manual."},"dpiaRiskId":{"type":["string","null"],"example":"dpr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un DPIA risk, siempre con el prefijo `dpr_`."},"description":{"type":"string"},"affectedRight":{"type":"string"},"impact":{"type":"integer"},"likelihood":{"type":"integer"},"scale":{"type":"integer","description":"The matrix scale (3, 4 or 5) in force when the risk was measured."},"level":{"type":"string","enum":["low","moderate","high","critical"],"description":"What the matrix gave, frozen with `matrixVersion`. The organisation criterion, not a legal category."},"declaredLevel":{"type":["string","null"],"enum":["low","moderate","high","critical",null]},"declaredLevelRationale":{"type":"string"},"residual":{"type":"string","enum":["accepted","reduced","high"]},"ownerId":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"state":{"type":"string","enum":["open","mitigated","accepted","closed"]},"matrixVersion":{"type":"integer"},"controlIds":{"type":"array","items":{"type":"string","example":"ctl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un control, siempre con el prefijo `ctl_`."}},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","origin","originId","dpiaRiskId","description","affectedRight","impact","likelihood","scale","level","declaredLevel","declaredLevelRationale","residual","ownerId","state","matrixVersion","controlIds","createdAt","updatedAt"]},"RiskInput":{"type":"object","properties":{"description":{"type":"string","minLength":1,"maxLength":2000,"description":"What can happen, never to whom it happened."},"origin":{"type":"string","enum":["dpia","processing_activity","vendor","incident","ai_system","manual"],"description":"`dpia` risks are created through /risks/adopt-dpia-risk, not here."},"originId":{"type":["string","null"]},"affectedRight":{"type":"string","maxLength":80},"impact":{"type":"integer","minimum":1,"maximum":5},"likelihood":{"type":"integer","minimum":1,"maximum":5},"declaredLevel":{"type":["string","null"],"enum":["low","moderate","high","critical",null]},"declaredLevelRationale":{"type":"string","maxLength":2000},"residual":{"type":"string","enum":["accepted","reduced","high"]},"ownerId":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"state":{"type":"string","enum":["open","mitigated","accepted","closed"]},"controlIds":{"type":"array","items":{"type":"string","example":"ctl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un control, siempre con el prefijo `ctl_`."},"maxItems":50}},"required":["description","origin","impact","likelihood"]},"RiskAdoptInput":{"type":"object","properties":{"dpiaRiskId":{"type":"string","example":"dpr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un DPIA risk, siempre con el prefijo `dpr_`."}},"required":["dpiaRiskId"]},"RiskControlsInput":{"type":"object","properties":{"controlIds":{"type":"array","items":{"type":"string","example":"ctl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un control, siempre con el prefijo `ctl_`."},"maxItems":50}},"required":["controlIds"]},"Article14TerLetter":{"type":"object","properties":{"letter":{"type":"string","enum":["a","b","c","d","e","f","g","h","i","j","k","l"]},"requires":{"type":"string","description":"Lo que el texto legal pide, abreviado pero sin adornos."},"requirements":{"type":"array","items":{"type":"string"}},"source":{"type":"string","enum":["derived","drafted","no_source"],"description":"`derived` la contesta un módulo; `drafted` la redacta la empresa; `no_source` todavía no la contesta nadie."},"answeredBy":{"type":"string","description":"Qué columna o módulo la responde. Vacío si nadie."}},"required":["letter","requires","requirements","source","answeredBy"]},"PrivacyDocumentPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PrivacyDocument"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"PrivacyDocument":{"type":"object","properties":{"id":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un document, siempre con el prefijo `doc_`."},"key":{"type":"string","example":"politica_privacidad","description":"Lo que va dentro de `{{ }}` al citarlo desde una plantilla de consentimiento."},"name":{"type":"string"},"kind":{"type":"string","enum":["privacy_policy","terms","notice","cookies","retention_policy","guideline","other"]},"state":{"type":"string","enum":["draft","approved","published","archived"],"description":"`approved` no es `published`: aprobar es adoptarlo, publicar es ponerlo a disposición del público."},"templateOrigin":{"type":"string","enum":["datrus_criteria","agency_instruction"]},"version":{"type":"integer","description":"La última versión sellada. 0 = ninguna."},"description":{"type":"string"},"archived":{"type":"boolean","description":"Archivo lógico: un documento nunca se borra, porque una evidencia lo cita."},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","key","name","kind","state","templateOrigin","version","description","archived","createdBy","createdAt","updatedAt"]},"DocumentVersion":{"type":"object","properties":{"version":{"type":"integer"},"title":{"type":"string"},"text":{"type":"string"},"hash":{"type":"string","description":"El sello del texto. Recomputable por un tercero."},"sealedBy":{"type":"string"},"sealedAt":{"type":"string","description":"Cuándo se SELLÓ, que no es cuándo se publicó. La vigencia vive en las publicaciones."},"approvedBy":{"type":"string","description":"Vacío = nadie la aprobó todavía."},"approvedAt":{"type":["string","null"]}},"required":["version","title","text","hash","sealedBy","sealedAt","approvedBy","approvedAt"]},"CreatePrivacyDocument":{"type":"object","properties":{"key":{"type":"string","minLength":1,"maxLength":60,"example":"politica_privacidad"},"name":{"type":"string","minLength":1,"maxLength":200},"kind":{"type":"string","enum":["privacy_policy","terms","notice","cookies","retention_policy","guideline","other"]},"title":{"type":"string","minLength":1,"maxLength":300},"text":{"type":"string","minLength":1}},"required":["key","name","title","text"]},"EditPrivacyDocument":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"kind":{"type":"string","enum":["privacy_policy","terms","notice","cookies","retention_policy","guideline","other"]},"title":{"type":"string","minLength":1,"maxLength":300},"text":{"type":"string","minLength":1}},"required":["title","text"]},"DocumentPublication":{"type":"object","properties":{"id":{"type":"string","example":"pub_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un document publication, siempre con el prefijo `pub_`."},"version":{"type":"integer"},"from":{"type":"string","description":"Inclusivo."},"to":{"type":["string","null"],"description":"EXCLUSIVO. `null` = sigue vigente."},"declaredUrl":{"type":"string","description":"Dónde la empresa DECLARA haberla puesto. Datrus no la visita."},"coveredLetters":{"type":"array","items":{"type":"string"},"description":"Las letras del art. 14 ter cubiertas AL PUBLICAR. Congeladas."},"coverage":{"type":"object","properties":{"covered":{"type":"integer"},"total":{"type":"integer"},"missing":{"type":"integer"}},"required":["covered","total","missing"]},"versionHash":{"type":"string"},"orderedBy":{"type":"string"},"orderedAt":{"type":"string"}},"required":["id","version","from","to","declaredUrl","coveredLetters","coverage","versionHash","orderedBy","orderedAt"]},"PublishDocument":{"type":"object","properties":{"version":{"type":"integer","minimum":1},"declaredUrl":{"type":"string","example":"https://www.acme.cl/privacidad","description":"Dónde la pusiste. Datrus no la visita: lo declaras tú."},"coveredLetters":{"type":"array","items":{"type":"string"},"example":["a","b","c"],"description":"Las letras del art. 14 ter que este texto cubre."},"letterSources":{"type":"object","additionalProperties":{"type":"string","enum":["derived","drafted","no_source"]}},"notes":{"type":"object","additionalProperties":{"type":"string"},"description":"Por qué se dio por cubierta cada letra. Va a la foto."}},"required":["version","declaredUrl","coveredLetters"]},"DocumentEffectiveAt":{"type":"object","properties":{"result":{"type":"string","enum":["in_force","no_publication"]},"version":{"type":["integer","null"]},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"sinceFirstPublication":{"type":["string","null"],"description":"Cuándo empezó la primera publicación, si la fecha es anterior."}},"required":["result","version","from","to","sinceFirstPublication"]},"DocumentCoverage":{"type":"object","properties":{"published":{"type":"boolean"},"covered":{"type":"integer"},"total":{"type":"integer"},"missing":{"type":"array","items":{"type":"string"},"description":"Las letras que faltan por cubrir."}},"required":["published","covered","total","missing"]},"ProcessorPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Processor"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"Processor":{"type":"object","properties":{"id":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processor, siempre con el prefijo `prc_`."},"code":{"type":"string","example":"PR-LK3F9A"},"name":{"type":"string"},"taxId":{"type":"string","description":"El RUT de la empresa, cuando es chilena."},"country":{"type":"string","example":"CL","description":"Código ISO de dos letras. Distinto de `CL` es, por sí solo, una transferencia internacional."},"role":{"type":"string","enum":["processor","assignee"],"description":"`processor` trata por cuenta tuya (art. 15 bis); `assignee` pasa a ser responsable para todos los efectos legales (art. 15 inc. 5)."},"criticality":{"type":"string","enum":["high","medium","low"]},"website":{"type":"string"},"contactName":{"type":"string"},"contactEmail":{"type":"string"},"state":{"type":"string","enum":["draft","current","archived"]},"version":{"type":"integer","description":"La última versión sellada. 0 = ninguna."},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","name","taxId","country","role","criticality","website","contactName","contactEmail","state","version","createdBy","createdAt","updatedAt"]},"CreateProcessor":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"code":{"type":"string","maxLength":40,"description":"Si no lo mandas, se genera uno."},"taxId":{"type":"string","maxLength":20},"country":{"type":"string","minLength":2,"maxLength":2,"example":"CL"},"role":{"type":"string","enum":["processor","assignee"]},"criticality":{"type":"string","enum":["high","medium","low"]},"website":{"type":"string","maxLength":300},"contactName":{"type":"string","maxLength":200},"contactEmail":{"type":"string","maxLength":200}},"required":["name"]},"UpdateProcessor":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"taxId":{"type":"string","maxLength":20},"country":{"type":"string","minLength":2,"maxLength":2},"role":{"type":"string","enum":["processor","assignee"]},"criticality":{"type":"string","enum":["high","medium","low"]},"website":{"type":"string","maxLength":300},"contactName":{"type":"string","maxLength":200},"contactEmail":{"type":"string","maxLength":200}},"required":["name"]},"LinkedProcessingActivity":{"type":"object","properties":{"id":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"code":{"type":"string"},"name":{"type":"string"},"internationalTransfer":{"type":"boolean"}},"required":["id","code","name","internationalTransfer"]},"LinkProcessingActivity":{"type":"object","properties":{"activityId":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."}},"required":["activityId"]},"ProcessingAgreement":{"type":"object","properties":{"processorId":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processor, siempre con el prefijo `prc_`."},"state":{"type":"string","enum":["no_contract","draft","sent","signed","expired","terminated"]},"signedAt":{"type":["string","null"]},"documentName":{"type":"string"},"measures":{"type":"array","items":{"type":"string","enum":["pseudonymisation_encryption","confidentiality_integrity_availability_resilience","restoration","regular_verification"]},"description":"Las cuatro letras del art. 14 quinquies inc. 2 que el encargado acredita."},"measuresDetail":{"type":"string"},"requiresBreachReport":{"type":"boolean"},"embedsComplianceProgramme":{"type":"boolean"},"terminationDestination":{"type":"string","enum":["erase","return","not_declared"]},"expiresInDays":{"type":["integer","null"],"description":"Días corridos hasta el vencimiento. Negativo = ya venció. `null` = sin fecha de término."},"clauses":{"$ref":"#/components/schemas/AgreementClauses"},"risk":{"type":"object","properties":{"level":{"type":"string","enum":["red","amber","green"]},"reasons":{"type":"array","items":{"type":"string"}}},"required":["level","reasons"]},"ratDrift":{"type":"array","items":{"type":"string"},"description":"En qué se separó el RAT de lo congelado en el contrato. Vacío = al día."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["processorId","state","signedAt","documentName","measures","measuresDetail","requiresBreachReport","embedsComplianceProgramme","terminationDestination","expiresInDays","clauses","risk","ratDrift","createdAt","updatedAt"]},"AgreementClauses":{"type":"object","properties":{"complete":{"type":"boolean"},"missing":{"type":"array","items":{"type":"string"},"example":["purpose"],"description":"Las cláusulas del art. 15 bis inc. 3 que faltan."},"subjectMatter":{"type":"string"},"durationFrom":{"type":["string","null"]},"durationTo":{"type":["string","null"]},"durationOpenEnded":{"type":"boolean","description":"Una duración indefinida es una duración DECLARADA, no un campo sin llenar."},"rightsAndObligations":{"type":"string"},"purpose":{"type":"array","items":{"type":"string"},"description":"Derivada del RAT. No se acepta en el cuerpo."},"dataTypes":{"type":"array","items":{"type":"string"},"description":"Derivada del RAT."},"dataSubjectCategories":{"type":"array","items":{"type":"string"},"description":"Derivada del RAT."}},"required":["complete","missing","subjectMatter","durationFrom","durationTo","durationOpenEnded","rightsAndObligations","purpose","dataTypes","dataSubjectCategories"]},"SaveProcessingAgreement":{"type":"object","properties":{"subjectMatter":{"type":"string","maxLength":4000},"durationFrom":{"type":["string","null"],"example":"2026-01-01"},"durationTo":{"type":["string","null"]},"durationOpenEnded":{"type":"boolean"},"rightsAndObligations":{"type":"string","maxLength":8000},"state":{"type":"string","enum":["no_contract","draft","sent","signed","expired","terminated"]},"signedAt":{"type":["string","null"]},"documentName":{"type":"string","maxLength":300},"measures":{"type":"array","items":{"type":"string","enum":["pseudonymisation_encryption","confidentiality_integrity_availability_resilience","restoration","regular_verification"]}},"measuresDetail":{"type":"string","maxLength":4000},"requiresBreachReport":{"type":"boolean"},"embedsComplianceProgramme":{"type":"boolean"},"terminationDestination":{"type":"string","enum":["erase","return","not_declared"]}}},"Subprocessor":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"country":{"type":"string"},"partOfTheAssignment":{"type":"string"},"authorisation":{"type":"string","enum":["authorised_in_writing","not_authorised","unknown"]},"authorisedAt":{"type":["string","null"]},"authorisationDocument":{"type":"string"},"declarationSource":{"type":"string","enum":["processor","contract","website","client"]},"declaredBy":{"type":"string"},"declaredAt":{"type":"string"}},"required":["id","name","country","partOfTheAssignment","authorisation","authorisedAt","authorisationDocument","declarationSource","declaredBy","declaredAt"]},"DeclareSubprocessor":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"country":{"type":"string","minLength":2,"maxLength":2},"partOfTheAssignment":{"type":"string","maxLength":2000},"authorisation":{"type":"string","enum":["authorised_in_writing","not_authorised","unknown"]},"authorisedAt":{"type":["string","null"]},"authorisationDocument":{"type":"string","maxLength":300},"declarationSource":{"type":"string","enum":["processor","contract","website","client"]}},"required":["name"]},"RegisterProcessorReview":{"type":"object","properties":{"date":{"type":"string","example":"2026-09-13"},"outcome":{"type":"string","minLength":1,"maxLength":500},"notes":{"type":"string","maxLength":4000}},"required":["date","outcome"]},"RegisterTermination":{"type":"object","properties":{"terminatedAt":{"type":"string","example":"2026-09-13"},"destination":{"type":"string","enum":["erase","return"],"description":"Lo que el art. 15 bis inc. 5 admite. No hay una tercera opción."},"record":{"type":"string","maxLength":4000},"recordSha256":{"type":"string","maxLength":64}},"required":["terminatedAt","destination"]},"ReportingObjective":{"type":["object","null"],"properties":{"hours":{"type":"integer"},"origin":{"type":"string","enum":["datrus_criteria","company_policy","agency_instruction"]},"effectiveFrom":{"type":"string"},"note":{"type":"string"}},"required":["hours","origin","effectiveFrom","note"]},"SetReportingObjective":{"type":"object","properties":{"hours":{"type":"integer","minimum":1,"example":72},"origin":{"type":"string","enum":["datrus_criteria","company_policy","agency_instruction"],"default":"company_policy"},"effectiveFrom":{"type":"string","example":"2026-01-01"},"note":{"type":"string","minLength":1,"maxLength":2000}},"required":["hours","effectiveFrom","note"]},"IncidentPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Incident"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"Incident":{"type":"object","properties":{"id":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un incident, siempre con el prefijo `inc_`."},"caseNumber":{"type":"integer","description":"El folio, correlativo por empresa."},"title":{"type":"string"},"description":{"type":"string"},"eventTypes":{"type":"array","items":{"type":"string","enum":["destruction","leak","loss","alteration","unauthorised_disclosure","unauthorised_access"]},"description":"Los hechos del art. 14 sexies inc. 1."},"origin":{"type":"string","enum":["internal_report","processor_report","ai_secure","data_subject","third_party","public_media"]},"state":{"type":"string","enum":["open","under_assessment","notified","not_notifiable","closed"]},"occurredAt":{"type":["string","null"]},"occurredAtIsEstimate":{"type":"boolean"},"detectedAt":{"type":"string","description":"El instante que arranca el reloj."},"confirmedAt":{"type":["string","null"]},"ceasedAt":{"type":["string","null"],"description":"Mientras sea `null`, la vulneración sigue abierta: agravante de carácter continuado (art. 36 b)."},"clock":{"$ref":"#/components/schemas/IncidentClock"},"version":{"type":"integer","description":"La última versión sellada del expediente. 0 = ninguna."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","caseNumber","title","description","eventTypes","origin","state","occurredAt","occurredAtIsEstimate","detectedAt","confirmedAt","ceasedAt","clock","version","createdAt","updatedAt"]},"IncidentClock":{"type":"object","properties":{"level":{"type":"string","enum":["green","amber","red","met","past_objective"]},"objectiveHours":{"type":"integer"},"objectiveOrigin":{"type":"string","enum":["datrus_criteria","company_policy","agency_instruction"]},"hoursElapsed":{"type":"number"},"hoursRemaining":{"type":"number","description":"Negativo cuando ya se pasó el objetivo. No es un plazo legal."}},"required":["level","objectiveHours","objectiveOrigin","hoursElapsed","hoursRemaining"]},"WriteIncident":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","maxLength":8000,"description":"Los hechos, no las personas: un RUT o un correo acá se rechaza."},"eventTypes":{"type":"array","items":{"type":"string","enum":["destruction","leak","loss","alteration","unauthorised_disclosure","unauthorised_access"]},"minItems":1},"origin":{"type":"string","enum":["internal_report","processor_report","ai_secure","data_subject","third_party","public_media"]},"occurredAt":{"type":["string","null"]},"occurredAtIsEstimate":{"type":"boolean"},"detectedAt":{"type":"string","example":"2026-09-13T10:00:00Z","description":"Arranca el reloj."},"confirmedAt":{"type":["string","null"]},"ceasedAt":{"type":["string","null"]}},"required":["title","eventTypes","detectedAt"]},"SetIncidentState":{"type":"object","properties":{"state":{"type":"string","enum":["open","under_assessment","notified","not_notifiable","closed"]}},"required":["state"]},"IncidentScope":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"name":{"type":"string"}},"required":["id","name"]}},"dataCategories":{"type":"array","items":{"type":"string"}},"subjectCategories":{"type":"array","items":{"type":"string"}},"hasSensitiveArt2g":{"type":"boolean"},"under14":{"type":"string","enum":["yes","no","unknown"],"description":"`unknown` es una respuesta de primera clase: afirmar «no» por omisión sería decidir que no hay que avisarle a nadie."},"internationalTransfer":{"type":"boolean"}},"required":["data","dataCategories","subjectCategories","hasSensitiveArt2g","under14","internationalTransfer"]},"LinkIncidentActivity":{"type":"object","properties":{"activityId":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."}},"required":["activityId"]},"IncidentRegister":{"type":"object","properties":{"nature":{"type":"string"},"effects":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"affectedSubjects":{"type":["integer","null"]},"estimationMethod":{"type":"string","enum":["exact_count","company_estimate","declared_range","not_determined"]},"rangeFrom":{"type":["integer","null"]},"rangeTo":{"type":["integer","null"]},"measures":{"type":"string"},"complete":{"type":"boolean"},"missing":{"type":"array","items":{"type":"string"},"description":"Los campos del art. 14 sexies inc. 2 que faltan."},"updatedBy":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["nature","effects","categories","affectedSubjects","estimationMethod","rangeFrom","rangeTo","measures","complete","missing","updatedBy","updatedAt"]},"WriteIncidentRegister":{"type":"object","properties":{"nature":{"type":"string","maxLength":8000},"effects":{"type":"string","maxLength":8000},"categories":{"type":"array","items":{"type":"string"}},"affectedSubjects":{"type":["integer","null"],"minimum":0},"estimationMethod":{"type":"string","enum":["exact_count","company_estimate","declared_range","not_determined"]},"rangeFrom":{"type":["integer","null"],"minimum":0},"rangeTo":{"type":["integer","null"],"minimum":0},"measures":{"type":"string","maxLength":8000}}},"IncidentAssessment":{"type":"object","properties":{"isArt14SexiesEvent":{"type":"boolean"},"agencyFactors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"article":{"type":"string"},"value":{"type":"string"}},"required":["key","label","article","value"]}},"dataSubjects":{"type":"object","properties":{"mustNotify":{"type":"string","enum":["yes","no","review"]},"grounds":{"type":"array","items":{"type":"string","enum":["sensitive_data","under_14","economic_obligations"]}},"why":{"type":["string","null"]}},"required":["mustNotify","grounds","why"]}},"required":["isArt14SexiesEvent","agencyFactors","dataSubjects"]},"IncidentDecision":{"type":"object","properties":{"id":{"type":"string","example":"dcs_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un incident decision, siempre con el prefijo `dcs_`."},"recipient":{"type":"string","enum":["agency","data_subjects"]},"outcome":{"type":"string","enum":["notify","do_not_notify"]},"reason":{"type":"string"},"factors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"article":{"type":"string"},"value":{"type":"string"}},"required":["key","label","article","value"]}},"decidedBy":{"type":"string"},"decidedAt":{"type":"string"}},"required":["id","recipient","outcome","reason","factors","decidedBy","decidedAt"]},"RecordIncidentDecision":{"type":"object","properties":{"recipient":{"type":"string","enum":["agency","data_subjects"]},"outcome":{"type":"string","enum":["notify","do_not_notify"]},"reason":{"type":"string","maxLength":4000}},"required":["recipient","outcome"]},"IncidentNotification":{"type":"object","properties":{"id":{"type":"string","example":"ntf_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un incident notification, siempre con el prefijo `ntf_`."},"recipient":{"type":"string","enum":["agency","data_subjects","other_authority"]},"channel":{"type":"string","enum":["individual","public_notice","official_letter","email","form","other"]},"channelJustification":{"type":"string","description":"Obligatoria para `public_notice`: por qué no fue posible avisar a cada titular."},"sentAt":{"type":["string","null"]},"acknowledgedAt":{"type":["string","null"]},"acknowledgementReference":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","recipient","channel","channelJustification","sentAt","acknowledgedAt","acknowledgementReference","createdAt"]},"CreateIncidentNotification":{"type":"object","properties":{"recipient":{"type":"string","enum":["agency","data_subjects","other_authority"]},"channel":{"type":"string","enum":["individual","public_notice","official_letter","email","form","other"]},"channelJustification":{"type":"string","maxLength":4000},"packageHash":{"type":["string","null"],"description":"El sha256 del paquete que se mandó, si lo hay."}},"required":["recipient","channel"]},"MarkNotificationSent":{"type":"object","properties":{"sentAt":{"type":"string","example":"2026-09-13T15:00:00Z"}},"required":["sentAt"]},"RecordAcknowledgement":{"type":"object","properties":{"acknowledgedAt":{"type":"string"},"reference":{"type":"string","maxLength":300}},"required":["acknowledgedAt","reference"]},"IncidentMassNotice":{"type":"object","properties":{"id":{"type":"string","example":"bnt_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un mass notice to data subjects, siempre con el prefijo `bnt_`."},"notificationId":{"type":"string","example":"ntf_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un incident notification, siempre con el prefijo `ntf_`."},"recipients":{"type":"integer","description":"Cuántas personas: la nómina no se guarda."},"listHash":{"type":"string","description":"sha256 de la lista (ordenada, en minúsculas): acredita «a estas N personas» sin tenerlas."},"template":{"type":"string"},"state":{"type":"string","enum":["prepared","sending","sent","with_failures"]},"delivered":{"type":"integer"},"failed":{"type":"integer"},"createdAt":{"type":"string"},"purgeAfter":{"type":"string","description":"Cuándo se vacían los correos cifrados del registro de entrega."}},"required":["id","notificationId","recipients","listHash","template","state","delivered","failed","createdAt","purgeAfter"]},"SendMassNotice":{"type":"object","properties":{"recipients":{"type":"array","items":{"type":"string","maxLength":320},"minItems":1,"maxItems":20000,"example":["ana@example.com"]}},"required":["recipients"]},"IncidentPublicNotice":{"type":"object","properties":{"id":{"type":"string","example":"pnt_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un public breach notice, siempre con el prefijo `pnt_`."},"notificationId":{"type":"string","example":"ntf_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un incident notification, siempre con el prefijo `ntf_`."},"url":{"type":"string"},"hash":{"type":"string"},"version":{"type":"integer"},"publishedAt":{"type":"string"},"withdrawnAt":{"type":["string","null"]}},"required":["id","notificationId","url","hash","version","publishedAt","withdrawnAt"]},"DpiaTemplate":{"type":["object","null"],"properties":{"version":{"type":"integer"},"origin":{"type":"string","enum":["datrus_criteria","agency_guidance"]},"effectiveFrom":{"type":"string"},"note":{"type":"string"}},"required":["version","origin","effectiveFrom","note"]},"SetDpiaTemplate":{"type":"object","properties":{"origin":{"type":"string","enum":["datrus_criteria","agency_guidance"],"default":"datrus_criteria"},"effectiveFrom":{"type":"string","example":"2026-01-01"},"note":{"type":"string","minLength":1,"maxLength":2000}},"required":["effectiveFrom","note"]},"DpiaPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Dpia"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"Dpia":{"type":"object","properties":{"id":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un impact assessment, siempre con el prefijo `dpa_`."},"code":{"type":"string","example":"EI-001"},"name":{"type":"string"},"area":{"type":"string"},"state":{"type":"string","enum":["draft","under_assessment","approved","discarded"]},"moment":{"type":"string","enum":["prior","on_ongoing_processing"]},"trigger":{"$ref":"#/components/schemas/DpiaTrigger"},"inc1Decision":{"type":"string","enum":["undecided","required","not_required"],"description":"Lo que la empresa decidió sobre el inc. 1 («riesgo elevado»), que no se calcula."},"inc1Reason":{"type":"string"},"inc1DecidedAt":{"type":["string","null"]},"finalRequirement":{"type":"string","enum":["required","not_required","cannot_tell"],"description":"El inc. 2 o la decisión del inc. 1, lo que exija primero."},"content":{"$ref":"#/components/schemas/DpiaContent"},"templateVersion":{"type":"integer"},"templateOrigin":{"type":"string","enum":["datrus_criteria","agency_guidance"]},"activities":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"code":{"type":"string"},"name":{"type":"string"}},"required":["id","code","name"]},"description":"Snapshot con nombre: renombrar un tratamiento no cambia una evaluación ya sellada."},"approvedBy":{"type":["string","null"]},"approvedAt":{"type":["string","null"]},"version":{"type":"integer"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","name","area","state","moment","trigger","inc1Decision","inc1Reason","inc1DecidedAt","finalRequirement","content","templateVersion","templateOrigin","activities","approvedBy","approvedAt","version","createdAt","updatedAt"]},"DpiaTrigger":{"type":"object","properties":{"requirement":{"type":"string","enum":["required","not_required","cannot_tell"],"description":"`cannot_tell` cuando falta un dato: no se adivina «no»."},"confirmed":{"type":"array","items":{"type":"string","enum":["a_automated_decisions","b_massive_or_large_scale","c_public_area_monitoring","d_sensitive_without_consent"]}},"undeclared":{"type":"array","items":{"type":"string","enum":["a_automated_decisions","b_massive_or_large_scale","c_public_area_monitoring","d_sensitive_without_consent"]},"description":"Los supuestos que no se pueden resolver porque falta el dato."}},"required":["requirement","confirmed","undeclared"]},"DpiaContent":{"type":"object","properties":{"operationsDescription":{"type":"string"},"purpose":{"type":"string"},"necessityAndProportionality":{"type":"string"},"riskAssessment":{"type":"string"},"mitigationMeasures":{"type":"string"},"complete":{"type":"array","items":{"type":"string","enum":["operations_description","purpose","necessity_and_proportionality","risk_assessment","mitigation_measures"]}},"missing":{"type":"array","items":{"type":"string","enum":["operations_description","purpose","necessity_and_proportionality","risk_assessment","mitigation_measures"]},"description":"Las piezas del inc. 3 que faltan. Con alguna, no se aprueba."}},"required":["operationsDescription","purpose","necessityAndProportionality","riskAssessment","mitigationMeasures","complete","missing"]},"OpenDpia":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"area":{"type":"string","maxLength":200},"moment":{"type":"string","enum":["prior","on_ongoing_processing"]},"activityIds":{"type":"array","items":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"minItems":1},"significantLegalEffects":{"type":"string","enum":["unknown","yes","no"]}},"required":["name","activityIds"]},"EditDpia":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"area":{"type":"string","maxLength":200},"moment":{"type":"string","enum":["prior","on_ongoing_processing"]},"inc1Decision":{"type":"string","enum":["undecided","required","not_required"]},"inc1Reason":{"type":"string","maxLength":4000},"operationsDescription":{"type":"string","maxLength":8000},"purpose":{"type":"string","maxLength":8000},"necessityAndProportionality":{"type":"string","maxLength":8000},"riskAssessment":{"type":"string","maxLength":8000},"mitigationMeasures":{"type":"string","maxLength":8000}}},"RecomputeDpiaTrigger":{"type":"object","properties":{"significantLegalEffects":{"type":"string","enum":["unknown","yes","no"]}},"required":["significantLegalEffects"]},"DpiaRisk":{"type":"object","properties":{"id":{"type":"string"},"description":{"type":"string"},"affectedRight":{"type":"string"},"probability":{"type":"string","enum":["remote","possible","likely","very_likely"]},"gravity":{"type":"string","enum":["limited","significant","serious","very_serious"]},"mitigation":{"type":"string"},"owner":{"type":"string"},"commitmentDate":{"type":["string","null"]},"residual":{"type":"string","enum":["accepted","reduced","high"]},"order":{"type":"integer"}},"required":["id","description","affectedRight","probability","gravity","mitigation","owner","commitmentDate","residual","order"]},"WriteDpiaRisk":{"type":"object","properties":{"description":{"type":"string","minLength":1,"maxLength":2000},"affectedRight":{"type":"string","minLength":1},"probability":{"type":"string","enum":["remote","possible","likely","very_likely"]},"gravity":{"type":"string","enum":["limited","significant","serious","very_serious"]},"mitigation":{"type":"string","maxLength":2000},"owner":{"type":"string","maxLength":200},"commitmentDate":{"type":["string","null"]},"residual":{"type":"string","enum":["accepted","reduced","high"],"description":"Lo que queda después de la medida. Es lo ÚNICO que enciende algo: el criterio del inc. final es del responsable."}},"required":["description","affectedRight","probability","gravity","residual"]},"DpiaConsultationDecision":{"type":"object","properties":{"id":{"type":"string"},"decision":{"type":"string","enum":["consult","do_not_consult"]},"reason":{"type":"string"},"highResidualAtTheTime":{"type":"boolean"},"decidedBy":{"type":"string"},"decidedAt":{"type":"string"}},"required":["id","decision","reason","highResidualAtTheTime","decidedBy","decidedAt"]},"RecordDpiaConsultation":{"type":"object","properties":{"decision":{"type":"string","enum":["consult","do_not_consult"]},"reason":{"type":"string","minLength":1,"maxLength":4000}},"required":["decision","reason"]},"RiskMatrix":{"type":"object","properties":{"name":{"type":"string"},"origin":{"type":"string","enum":["datrus_reference","organisation","agency_guidance"]},"scale":{"type":"integer","example":4,"description":"3, 4 o 5: los dos ejes van de 1 a la escala."},"impactLabels":{"type":"array","items":{"type":"string"}},"likelihoodLabels":{"type":"array","items":{"type":"string"}},"thresholds":{"type":"object","properties":{"moderate":{"type":"integer"},"high":{"type":"integer"},"critical":{"type":"integer"}},"required":["moderate","high","critical"],"description":"Puntaje (impacto × probabilidad) desde el que empieza cada nivel; por debajo de `moderate` es `low`."},"weights":{"type":"object","additionalProperties":{"type":"number"},"description":"El peso de cada regla de sugerencia (0 apaga la regla). Claves en inglés, ver `GET /risk-matrix/rules`."},"version":{"type":"integer","description":"0 = todavía rige la matriz de referencia de Datrus, sin versión sellada."}},"required":["name","origin","scale","impactLabels","likelihoodLabels","thresholds","weights","version"]},"SetRiskMatrix":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"scale":{"anyOf":[{"type":"number","enum":[3]},{"type":"number","enum":[4]},{"type":"number","enum":[5]}]},"impactLabels":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"likelihoodLabels":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"thresholds":{"type":"object","properties":{"moderate":{"type":"integer"},"high":{"type":"integer"},"critical":{"type":"integer"}},"required":["moderate","high","critical"]},"weights":{"type":"object","additionalProperties":{"type":"number","minimum":0,"maximum":3}},"note":{"type":"string","minLength":1,"maxLength":2000}},"required":["name","scale","impactLabels","likelihoodLabels","thresholds","note"]},"RiskMapPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RiskMapRow"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"RiskMapRow":{"type":"object","properties":{"activity":{"type":"object","properties":{"id":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"code":{"type":"string"},"name":{"type":"string"},"area":{"type":"string"}},"required":["id","code","name","area"]},"state":{"type":"string","enum":["not_assessed","draft","sealed","outdated"]},"impact":{"type":"integer"},"likelihood":{"type":"integer"},"level":{"type":"string","enum":["low","moderate","high","critical"]},"recommendation":{"type":"string","enum":["required_by_law","recommended","not_needed","cannot_tell"]},"missing":{"type":"array","items":{"type":"string","enum":["subjectVolume","largeScale","publicAreaMonitoring","legalBasis","significantLegalEffects"]}},"assessment":{"type":["object","null"],"properties":{"id":{"type":"string","example":"rsk_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un risk assessment, siempre con el prefijo `rsk_`."},"code":{"type":"string"},"version":{"type":"integer"},"sealedAt":{"type":["string","null"]}},"required":["id","code","version","sealedAt"]}},"required":["activity","state","impact","likelihood","level","recommendation","missing","assessment"]},"RiskAssessment":{"type":"object","properties":{"id":{"type":"string","example":"rsk_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un risk assessment, siempre con el prefijo `rsk_`."},"code":{"type":"string","example":"RI-001"},"activity":{"type":"object","properties":{"id":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"code":{"type":"string"},"name":{"type":"string"},"version":{"type":"integer"}},"required":["id","code","name","version"]},"state":{"type":"string","enum":["not_assessed","draft","sealed","outdated"]},"matrix":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"integer"},"scale":{"type":"integer"}},"required":["name","version","scale"]},"suggested":{"type":"object","properties":{"impact":{"type":"integer"},"likelihood":{"type":"integer"}},"required":["impact","likelihood"]},"impact":{"type":"integer"},"likelihood":{"type":"integer"},"level":{"type":"string","enum":["low","moderate","high","critical"],"description":"El nivel en la matriz de la organización. No es «alto riesgo» según la ley."},"inc2Requirement":{"type":"string","enum":["required","not_required","cannot_tell"]},"recommendation":{"type":"string","enum":["required_by_law","recommended","not_needed","cannot_tell"]},"factors":{"type":"array","items":{"$ref":"#/components/schemas/RiskFactor"}},"missing":{"type":"array","items":{"type":"string","enum":["subjectVolume","largeScale","publicAreaMonitoring","legalBasis","significantLegalEffects"]},"description":"Lo que al registro le falta declarar para sugerir con todo."},"significantLegalEffects":{"type":"string","enum":["unknown","yes","no"]},"reason":{"type":"string"},"assessedBy":{"type":"string"},"sealedBy":{"type":["string","null"]},"sealedAt":{"type":["string","null"]},"hash":{"type":["string","null"],"description":"La huella sha256 de la última versión sellada; `null` en un borrador."},"version":{"type":"integer"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","activity","state","matrix","suggested","impact","likelihood","level","inc2Requirement","recommendation","factors","missing","significantLegalEffects","reason","assessedBy","sealedBy","sealedAt","hash","version","createdAt","updatedAt"]},"RiskFactor":{"type":"object","properties":{"rule":{"type":"string","example":"health_data"},"axis":{"type":"string","enum":["impact","likelihood"]},"text":{"type":"string","description":"La frase, en español: es contenido del documento sellado."},"contribution":{"type":"number"},"articles":{"type":"array","items":{"type":"string"}}},"required":["rule","axis","text","contribution","articles"]},"AssessRisk":{"type":"object","properties":{"activityId":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"impact":{"type":"integer","minimum":1,"maximum":5},"likelihood":{"type":"integer","minimum":1,"maximum":5},"reason":{"type":"string","maxLength":2000},"significantLegalEffects":{"type":"string","enum":["unknown","yes","no"]}},"required":["activityId"]},"RosterPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RosterPerson"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"RosterPerson":{"type":"object","properties":{"id":{"type":"string","example":"ppl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un roster person, siempre con el prefijo `ppl_`."},"name":{"type":"string"},"email":{"type":"string"},"area":{"type":"string"},"role":{"type":"string"},"employment":{"type":"string","enum":["internal","external"]},"externalId":{"type":"string"},"source":{"type":"string","enum":["manual","spreadsheet","directory"]},"archived":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","name","email","area","role","employment","externalId","source","archived","createdAt"]},"AddRosterPerson":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","minLength":3,"maxLength":200},"area":{"type":"string","maxLength":120},"role":{"type":"string","maxLength":120},"employment":{"type":"string","enum":["internal","external"]},"externalId":{"type":"string","maxLength":120,"description":"Tu propio identificador de la persona, para reconciliar con tu directorio."}},"required":["name","email"]},"TrainingContent":{"type":"object","properties":{"id":{"type":"string","example":"tcn_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un training content, siempre con el prefijo `tcn_`."},"key":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"origin":{"type":"string","enum":["datrus_criteria","regulation_662"],"description":"`regulation_662` cuando el texto sigue el reglamento en tramitación; `datrus_criteria` mientras no."},"originNote":{"type":"string"},"version":{"type":"integer","description":"La última versión sellada. 0 = ninguna."},"archived":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","key","name","description","origin","originNote","version","archived","createdAt"]},"CreateTrainingContent":{"type":"object","properties":{"key":{"type":"string","minLength":1,"maxLength":60,"example":"induccion_datos_personales"},"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":2000},"origin":{"type":"string","enum":["datrus_criteria","regulation_662"]},"originNote":{"type":"string","maxLength":2000}},"required":["key","name"]},"TrainingContentVersion":{"type":"object","properties":{"id":{"type":"string"},"version":{"type":"integer"},"title":{"type":"string"},"body":{"type":"string"},"hash":{"type":"string"},"sealedBy":{"type":"string"},"sealedAt":{"type":"string"}},"required":["id","version","title","body","hash","sealedBy","sealedAt"]},"SealTrainingVersion":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"body":{"type":"string","minLength":1}},"required":["title","body"]},"TrainingCampaignPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TrainingCampaign"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"TrainingCampaign":{"type":"object","properties":{"id":{"type":"string","example":"tdf_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un training campaign, siempre con el prefijo `tdf_`."},"title":{"type":"string"},"contentVersionId":{"type":["string","null"]},"documentPublicationId":{"type":["string","null"],"description":"Cuando lo difundido es una publicación de un documento de privacidad, no un contenido propio."},"contentHash":{"type":"string","description":"El sello de lo difundido, copiado AL ABRIR. Vacío mientras es borrador."},"state":{"type":"string","enum":["draft","open","closed"]},"suggestedDeadline":{"type":["string","null"],"description":"Expectativa del responsable. No es un vencimiento legal: no existe uno."},"openedAt":{"type":["string","null"]},"closedAt":{"type":["string","null"]},"createdAt":{"type":"string"}},"required":["id","title","contentVersionId","documentPublicationId","contentHash","state","suggestedDeadline","openedAt","closedAt","createdAt"]},"CreateTrainingCampaign":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"contentVersionId":{"type":"string","description":"El `id` de una versión sellada de `/training/contents/{id}/versions`."},"documentPublicationId":{"type":"string","example":"pub_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un document publication, siempre con el prefijo `pub_`."},"suggestedDeadline":{"type":"string","example":"2026-12-31","description":"Expectativa, no plazo legal."}},"required":["title"]},"OpenTrainingCampaign":{"type":"object","properties":{"area":{"type":"string"}}},"TrainingCoverage":{"type":"object","properties":{"hasData":{"type":"boolean"},"convened":{"type":"integer"},"acknowledged":{"type":"integer"},"percentage":{"type":"number"},"self":{"type":"integer"},"thirdPartyRecords":{"type":"integer"},"outsideTheSet":{"type":"integer"},"missing":{"type":"array","items":{"type":"object","properties":{"personId":{"type":"string","example":"ppl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un roster person, siempre con el prefijo `ppl_`."},"area":{"type":"string"}},"required":["personId","area"]}}},"required":["hasData","convened","acknowledged","percentage","self","thirdPartyRecords","outsideTheSet","missing"]},"TrainingAcknowledgement":{"type":"object","properties":{"id":{"type":"string","example":"ack_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un training acknowledgement, siempre con el prefijo `ack_`."},"personId":{"type":"string","example":"ppl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un roster person, siempre con el prefijo `ppl_`."},"type":{"type":"string","enum":["self","third_party_record"]},"registeredBy":{"type":"string","description":"Quién cargó el registro, cuando es de un tercero. La mitad de la evidencia."},"evaluation":{"type":"string","enum":["passed","failed","not_applicable"]},"score":{"type":["integer","null"]},"hash":{"type":"string"},"acknowledgedAt":{"type":"string"}},"required":["id","personId","type","registeredBy","evaluation","score","hash","acknowledgedAt"]},"RecordTrainingAcknowledgement":{"type":"object","properties":{"personId":{"type":"string","example":"ppl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un roster person, siempre con el prefijo `ppl_`."},"type":{"type":"string","enum":["self","third_party_record"]},"registeredBy":{"type":"string","maxLength":200},"evaluation":{"type":"string","enum":["passed","failed"]},"score":{"type":"integer","minimum":0,"maximum":100}},"required":["personId","type"]},"ReportPieceDefinition":{"type":"object","properties":{"key":{"type":"string"},"module":{"type":"string"},"title":{"type":"string"},"declaredDenominator":{"type":"string"},"countable":{"type":"boolean"},"ifMissing":{"type":"string","description":"Qué hacer el lunes si esta pieza falta."}},"required":["key","module","title","declaredDenominator","countable","ifMissing"]},"ReportPieceReading":{"type":"object","properties":{"key":{"type":"string"},"module":{"type":"string"},"moduleState":{"type":"string","enum":["demo","beta","operational","off"]},"reading":{"type":"string","enum":["measured","unmeasured","not_applicable","unreadable"],"description":"`unreadable` cuando el lector falló: se dice, no se cuenta como cero."},"numerator":{"type":["number","null"]},"denominator":{"type":["number","null"]},"sourceHash":{"type":["string","null"],"description":"El sello de la fuente que se leyó, cuando la tiene."},"sourceRef":{"type":["string","null"]},"note":{"type":"string"}},"required":["key","module","moduleState","reading","numerator","denominator","sourceHash","sourceRef","note"]},"Report":{"type":"object","properties":{"id":{"type":"string","example":"rpt_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un report, siempre con el prefijo `rpt_`."},"code":{"type":"string","example":"RP-001"},"periodFrom":{"type":"string"},"periodTo":{"type":"string"},"state":{"type":"string","enum":["draft","sealed","voided"]},"registered":{"type":"integer"},"applicable":{"type":"integer"},"generatedBy":{"type":"string"},"sealedBy":{"type":["string","null"]},"sealedAt":{"type":["string","null"]},"voidedBy":{"type":["string","null"]},"voidReason":{"type":["string","null"]},"voidedAt":{"type":["string","null"]},"createdAt":{"type":"string"}},"required":["id","code","periodFrom","periodTo","state","registered","applicable","generatedBy","sealedBy","sealedAt","voidedBy","voidReason","voidedAt","createdAt"]},"IssueReport":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-01-01"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-06-30"}},"required":["from","to"]},"VoidReport":{"type":"object","properties":{"replacementId":{"type":"string","example":"rpt_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un report, siempre con el prefijo `rpt_`."},"reason":{"type":"string","minLength":1,"maxLength":2000}},"required":["replacementId","reason"]},"Connector":{"type":"object","properties":{"id":{"type":"string","example":"cnx_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un connector, siempre con el prefijo `cnx_`."},"type":{"type":"string","example":"esquema_subido"},"name":{"type":"string"},"system":{"type":"string"},"state":{"type":"string","enum":["draft","active","paused","error"]},"allowsSampling":{"type":"boolean"},"hasCredential":{"type":"boolean"},"lastRunAt":{"type":["string","null"]},"createdAt":{"type":"string"}},"required":["id","type","name","system","state","allowsSampling","hasCredential","lastRunAt","createdAt"]},"WriteConnector":{"type":"object","properties":{"type":{"type":"string","example":"esquema_subido"},"name":{"type":"string","minLength":1,"maxLength":120},"system":{"type":"string","minLength":1,"maxLength":120,"example":"crm","description":"La clave del sistema en tu catálogo (`/catalogs/systems`), no texto libre: lo descubierto tiene que caer en un sistema que el inventario conozca."},"config":{"type":"object","additionalProperties":{},"description":"Para `esquema_subido`: `{ \"schema\": <el JSON del script de exportación> }`."},"allowsSampling":{"type":"boolean"},"secret":{"type":["string","null"],"maxLength":4000,"description":"La credencial, cuando el tipo la pide. Se cifra antes de tocar la base y nunca vuelve a salir."}},"required":["type","name","system"]},"UpdateConnector":{"type":"object","properties":{"type":{"type":"string","example":"esquema_subido"},"name":{"type":"string","minLength":1,"maxLength":120},"system":{"type":"string","minLength":1,"maxLength":120,"example":"crm","description":"La clave del sistema en tu catálogo (`/catalogs/systems`), no texto libre: lo descubierto tiene que caer en un sistema que el inventario conozca."},"config":{"type":"object","additionalProperties":{},"description":"Para `esquema_subido`: `{ \"schema\": <el JSON del script de exportación> }`."},"allowsSampling":{"type":"boolean"},"secret":{"type":["string","null"],"maxLength":4000,"description":"La credencial, cuando el tipo la pide. Se cifra antes de tocar la base y nunca vuelve a salir."},"state":{"type":"string","enum":["draft","active","paused","error"]}}},"ConnectorRun":{"type":"object","properties":{"id":{"type":"string","example":"run_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un connector run, siempre con el prefijo `run_`."},"number":{"type":"integer"},"state":{"type":"string","enum":["running","ok","error"]},"partial":{"type":"boolean","description":"El adaptador SABE que no trajo todo. Una propuesta sobre medio inventario nunca se presenta como el inventario entero."},"startedAt":{"type":"string"},"finishedAt":{"type":["string","null"]},"summary":{"type":"object","additionalProperties":{}},"errorMessage":{"type":"string"}},"required":["id","number","state","partial","startedAt","finishedAt","summary","errorMessage"]},"ConnectorFinding":{"type":"object","properties":{"id":{"type":"string"},"system":{"type":"string"},"container":{"type":"string"},"field":{"type":"string"},"dataType":{"type":"string"},"classification":{"type":"array","items":{"type":"string"}},"sensitive":{"type":"boolean"},"confidence":{"type":"number"},"approxRows":{"type":["number","null"]},"seenBefore":{"type":"boolean"}},"required":["id","system","container","field","dataType","classification","sensitive","confidence","approxRows","seenBefore"]},"InventoryProposal":{"type":"object","properties":{"id":{"type":"string","example":"prp_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un inventory proposal, siempre con el prefijo `prp_`."},"runId":{"type":["string","null"],"example":"run_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un connector run, siempre con el prefijo `run_`."},"suggestedName":{"type":"string"},"systems":{"type":"array","items":{"type":"string"}},"dataCategories":{"type":"array","items":{"type":"string"}},"subjectKinds":{"type":"array","items":{"type":"string"}},"sensitive":{"type":"boolean"},"state":{"type":"string","enum":["pending","accepted","discarded"]},"activityId":{"type":["string","null"],"example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"fields":{"type":"integer"},"decidedBy":{"type":"string"},"decidedAt":{"type":["string","null"]}},"required":["id","runId","suggestedName","systems","dataCategories","subjectKinds","sensitive","state","activityId","fields","decidedBy","decidedAt"]},"AcceptProposal":{"type":"object","properties":{"purpose":{"type":"string","minLength":1,"description":"Clave de finalidad del catálogo. Obligatoria."},"name":{"type":"string","maxLength":200},"area":{"type":"string","maxLength":120},"subjectKinds":{"type":"array","items":{"type":"string"}},"systems":{"type":"array","items":{"type":"string"}}},"required":["purpose"]},"EmbeddablePiece":{"type":"object","properties":{"type":{"type":"string","enum":["consent_form","cookie_banner","rights_page","rights_portal","privacy_centre_button","training_acknowledgement","evidence_badge","published_policy","incident_report","processor_questionnaire","data_protection_centre"]},"name":{"type":"string"},"module":{"type":"string"},"what":{"type":"string"},"deliveries":{"type":"array","items":{"type":"string","enum":["link","qr","script","iframe"]}},"comingSoon":{"type":["string","null"],"description":"Lo que falta, dicho como tal. Regla de paridad total: lo diferido se declara, nunca se omite."}},"required":["type","name","module","what","deliveries","comingSoon"]},"BuildSnippet":{"type":"object","properties":{"piece":{"type":"string","enum":["consent_form","privacy_centre_button","rights_page"]},"token":{"type":"string","minLength":8,"maxLength":200},"mode":{"type":"string","enum":["modal","banner"]},"open":{"type":"string","enum":["load","click"]},"delaySeconds":{"type":"integer","minimum":0,"maximum":60},"position":{"type":"string","enum":["bottom","top"]},"expiryDays":{"type":"integer","minimum":1,"maximum":730},"googleConsentMode":{"type":"boolean"},"preview":{"type":"boolean","description":"Apunta al modo prueba: nada de lo que se registre cuenta."}},"required":["piece","token"]},"AuditEvent":{"type":"object","properties":{"id":{"type":"integer"},"type":{"type":"string","example":"documentos.publicacion.abierta"},"entity":{"type":"string"},"entityId":{"type":["string","null"]},"summary":{"type":"string"},"actor":{"type":"string"},"detail":{"type":"object","additionalProperties":{}},"previousHash":{"type":["string","null"]},"hash":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","type","entity","entityId","summary","actor","detail","previousHash","hash","createdAt"]},"AuditEventPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AuditEvent"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"AuditChainVerdict":{"type":"object","properties":{"ok":{"type":"boolean"},"brokenAt":{"type":["integer","null"]},"verified":{"type":"integer"},"total":{"type":"integer"},"head":{"type":["string","null"]},"partial":{"type":"boolean"},"verifiedAt":{"type":"string"}},"required":["ok","brokenAt","verified","total","head","partial","verifiedAt"]},"Webhook":{"type":"object","properties":{"id":{"type":"string","example":"whk_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un webhook, siempre con el prefijo `whk_`."},"name":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"state":{"type":"string","enum":["active","paused"]},"secretHint":{"type":"string","description":"Los últimos caracteres del secreto, para reconocerlo. El secreto entero sólo se entrega al crear y al rotar."},"secretRotatedAt":{"type":["string","null"]},"lastAttemptAt":{"type":["string","null"]},"createdAt":{"type":"string"}},"required":["id","name","url","events","state","secretHint","secretRotatedAt","lastAttemptAt","createdAt"]},"WriteWebhook":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["consentimiento.otorgado","consentimiento.revocado","consentimiento.corregido","consentimiento.fusionado","permiso.expirado","formulario.entrada","solicitud.recibida","solicitud.acusada","solicitud.prorrogada","solicitud.bloqueo_ordenado","solicitud.por_vencer","solicitud.resuelta"]},"minItems":1}},"required":["name","url","events"]},"UpdateWebhook":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["consentimiento.otorgado","consentimiento.revocado","consentimiento.corregido","consentimiento.fusionado","permiso.expirado","formulario.entrada","solicitud.recibida","solicitud.acusada","solicitud.prorrogada","solicitud.bloqueo_ordenado","solicitud.por_vencer","solicitud.resuelta"]},"minItems":1},"state":{"type":"string","enum":["active","paused"]}}},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"string","example":"dlv_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un webhook delivery, siempre con el prefijo `dlv_`."},"webhookId":{"type":"string","example":"whk_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un webhook, siempre con el prefijo `whk_`."},"event":{"type":"string"},"state":{"type":"string"},"attempts":{"type":"integer"},"nextAttemptAt":{"type":["string","null"]},"lastStatusCode":{"type":["integer","null"]},"lastError":{"type":"string"},"createdAt":{"type":"string"},"deliveredAt":{"type":["string","null"]}},"required":["id","webhookId","event","state","attempts","nextAttemptAt","lastStatusCode","lastError","createdAt","deliveredAt"]},"DispatchWebhooks":{"type":"object","properties":{"max":{"type":"integer","minimum":1,"maximum":200,"default":50}}},"Dashboard":{"type":"object","properties":{"areas":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"score":{"type":"number"},"light":{"type":"string"},"detail":{"type":["string","null"]},"measuredBy":{"type":"string","enum":["module","tasks","nothing"]}},"required":["id","name","score","light","detail","measuredBy"]}},"phases":{"type":"array","items":{"type":"object","properties":{"phase":{"type":"integer"},"name":{"type":"string"},"total":{"type":"integer"},"done":{"type":"integer"},"overdue":{"type":"integer"}},"required":["phase","name","total","done","overdue"]}},"nextSteps":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"module":{"type":"string"}},"required":["text","module"]}},"alerts":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"text":{"type":"string"},"severity":{"type":"string","enum":["info","warning","critical"]}},"required":["type","text","severity"]}},"totalEvents":{"type":"integer"}},"required":["areas","phases","nextSteps","alerts","totalEvents"]},"PlanUsage":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"what":{"type":"string"},"used":{"type":"number"},"quota":{"type":"number"},"pct":{"type":"integer"},"level":{"type":"string","enum":["ok","warning","cap"]},"extended":{"type":"boolean"}},"required":["key","name","what","used","quota","pct","level","extended"]}}},"required":["data"]},"TaskPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"Task":{"type":"object","properties":{"id":{"type":"string","example":"tsk_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un task, siempre con el prefijo `tsk_`."},"phase":{"type":"integer","minimum":1,"maximum":6},"phaseName":{"type":"string","example":"Inventario, RAT y bases de licitud"},"title":{"type":"string"},"description":{"type":"string"},"owner":{"type":"object","properties":{"id":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"email":{"type":["string","null"]}},"required":["id","email"]},"state":{"type":"string","enum":["pending","in_progress","done"]},"dueAt":{"type":["string","null"],"description":"Plazo de gestión, no legal."},"source":{"type":"string","enum":["manual","assessment","consulting","consent","ropa_confirmation"]},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"doneAt":{"type":["string","null"]}},"required":["id","phase","phaseName","title","description","owner","state","dueAt","source","createdBy","createdAt","doneAt"]},"CreateTask":{"type":"object","properties":{"phase":{"type":"integer","minimum":1,"maximum":6},"title":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":2000},"ownerId":{"type":["string","null"]},"dueAt":{"type":["string","null"],"example":"2026-10-31"}},"required":["phase","title"]},"UpdateTask":{"type":"object","properties":{"state":{"type":"string","enum":["pending","in_progress","done"]}},"required":["state"]},"ConsentFormPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentForm"}},"nextCursor":{"type":["string","null"],"example":null}},"required":["data","nextCursor"]},"ConsentForm":{"type":"object","properties":{"id":{"type":"string","example":"frm_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent form, siempre con el prefijo `frm_`."},"code":{"type":"string","example":"FO-001"},"name":{"type":"string","example":"Newsletter y ofertas"},"templateId":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent template, siempre con el prefijo `tpl_`."},"state":{"type":"string","enum":["draft","published","closed"]},"token":{"type":"string","example":"5eyx6jehtwd7j0r4er6g41","description":"El token público. Vacío mientras nunca se publicó. Es lo que mandas como `form` en `POST /consents`."},"testToken":{"type":"string","description":"El enlace de prueba: la pantalla es la misma, pero el envío no pasa por el motor. Vacío = modo prueba apagado."},"version":{"type":"integer"},"identifierType":{"type":["string","null"],"enum":["email","rut","phone","external","anonymous",null]},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/OfferedScope"}},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","code","name","templateId","state","token","testToken","version","identifierType","scopes","createdBy","createdAt","updatedAt"]},"OfferedScope":{"type":"object","properties":{"key":{"type":"string","example":"newsletter","description":"Una de las claves de la plantilla."},"label":{"type":"string","example":"Quiero recibir novedades"},"mandatory":{"type":"boolean","description":"El titular no lo puede desmarcar: sin él no hay servicio que prestar."},"checked":{"type":"boolean","description":"Llega marcado al abrir la página. Un obligatorio siempre lo está."}},"required":["key","label","mandatory","checked"]},"CreateConsentForm":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":40,"example":"FO-001"},"name":{"type":"string","minLength":1,"maxLength":200},"templateId":{"type":"string","description":"La plantilla que este formulario pone en pantalla."},"schema":{"type":"object","properties":{"title":{"type":"string"},"introduction":{"type":"string"},"identifierType":{"type":"string","enum":["email","rut","phone","external","anonymous"]},"identifierLabel":{"type":"string","example":"Tu correo"},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/OfferedScope"},"maxItems":30},"channels":{"type":"array","items":{"type":"string","enum":["digital","in_person","phone_call"]},"description":"Por dónde se admite la captura en esta página."},"buttonText":{"type":"string"},"thanksText":{"type":"string"},"privacyPolicyUrl":{"type":"string","description":"Obligatorio para publicar."},"controllerContact":{"type":"string","description":"A quién reclama el titular. Obligatorio para publicar."},"retentionPeriod":{"type":"string","description":"Cuánto se conservan los datos. Obligatorio para publicar."},"redirectUrl":{"type":"string","description":"Una URL https del sitio de la empresa que se ofrece tras decidir."}},"required":["title","introduction","identifierType","identifierLabel","scopes","channels","buttonText","thanksText"]}},"required":["code","name","templateId","schema"]},"EditConsentForm":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"schema":{"type":"object","properties":{"title":{"type":"string"},"introduction":{"type":"string"},"identifierType":{"type":"string","enum":["email","rut","phone","external","anonymous"]},"identifierLabel":{"type":"string","example":"Tu correo"},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/OfferedScope"},"maxItems":30},"channels":{"type":"array","items":{"type":"string","enum":["digital","in_person","phone_call"]},"description":"Por dónde se admite la captura en esta página."},"buttonText":{"type":"string"},"thanksText":{"type":"string"},"privacyPolicyUrl":{"type":"string","description":"Obligatorio para publicar."},"controllerContact":{"type":"string","description":"A quién reclama el titular. Obligatorio para publicar."},"retentionPeriod":{"type":"string","description":"Cuánto se conservan los datos. Obligatorio para publicar."},"redirectUrl":{"type":"string","description":"Una URL https del sitio de la empresa que se ofrece tras decidir."}},"required":["title","introduction","identifierType","identifierLabel","scopes","channels","buttonText","thanksText"]}},"required":["schema"]},"ConsentFormVersion":{"type":"object","properties":{"version":{"type":"integer"},"schema":{"$ref":"#/components/schemas/ConsentFormSchema"},"hash":{"type":"string"},"publishedBy":{"type":"string"},"publishedAt":{"type":"string"}},"required":["version","schema","hash","publishedBy","publishedAt"]},"ConsentFormSchema":{"type":"object","properties":{"title":{"type":"string"},"introduction":{"type":"string"},"identifierType":{"type":"string","enum":["email","rut","phone","external","anonymous"]},"identifierLabel":{"type":"string","example":"Tu correo"},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/OfferedScope"},"maxItems":30},"channels":{"type":"array","items":{"type":"string","enum":["digital","in_person","phone_call"]},"description":"Por dónde se admite la captura en esta página."},"buttonText":{"type":"string"},"thanksText":{"type":"string"},"privacyPolicyUrl":{"type":"string","description":"Obligatorio para publicar."},"controllerContact":{"type":"string","description":"A quién reclama el titular. Obligatorio para publicar."},"retentionPeriod":{"type":"string","description":"Cuánto se conservan los datos. Obligatorio para publicar."},"redirectUrl":{"type":"string","description":"Una URL https del sitio de la empresa que se ofrece tras decidir."}},"required":["title","introduction","identifierType","identifierLabel","scopes","channels","buttonText","thanksText","privacyPolicyUrl","controllerContact","retentionPeriod"]},"ConsentFormEntry":{"type":"object","properties":{"id":{"type":"string","example":"ent_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent entry, siempre con el prefijo `ent_`."},"state":{"type":"string","enum":["started","completed","discarded","expired"]},"identifierType":{"type":"string"},"identifierHint":{"type":"string","example":"a***@e***.cl","description":"Lo único legible: el identificador en claro no existe en esta tabla."},"scopes":{"type":"array","items":{"type":"string"}},"channel":{"type":"string"},"createdAt":{"type":"string"},"completedAt":{"type":["string","null"]}},"required":["id","state","identifierType","identifierHint","scopes","channel","createdAt","completedAt"]},"ConsentCreated":{"type":"object","properties":{"agreementId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El acuerdo de esa persona con tu empresa. Es estable: no cambia aunque decida otra cosa después."},"entryId":{"type":"string","example":"ent_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"Esta decisión en particular, con su evidencia sellada."},"version":{"type":"integer","example":2},"captureKind":{"type":"string","enum":["direct_by_controller"],"description":"Así queda marcada la evidencia: la capturó el responsable, no el formulario alojado de Datrus."}},"required":["agreementId","entryId","version","captureKind"]},"CreateConsent":{"type":"object","properties":{"form":{"type":"string","minLength":8,"example":"5eyx6jehtwd7j0r4er6g41","description":"El token público de un formulario publicado de tu empresa. Lo obtienes en `GET /consent-forms`."},"identifier":{"type":"object","properties":{"value":{"type":"string","minLength":1,"maxLength":200,"example":"ana@empresa.cl"}},"required":["value"],"description":"Quién decidió. Se normaliza, se convierte en huella y se descarta: no se guarda en claro."},"scopes":{"type":"array","items":{"type":"string","minLength":1},"example":["service","newsletter"],"description":"Las claves de los alcances que la persona autorizó (o que retira, si `intent` es `revoke`)."},"intent":{"type":"string","enum":["grant","revoke"],"default":"grant","description":"`grant` autoriza; `revoke` registra el retiro."},"channel":{"type":"string","enum":["digital","in_person","phone_call"],"default":"digital","description":"Cómo se capturó la decisión: en pantalla, presencial o por teléfono. Queda en la evidencia."},"context":{"type":"object","properties":{"ip":{"type":"string","maxLength":64,"example":"190.20.1.10"},"userAgent":{"type":"string","maxLength":512},"url":{"type":"string","maxLength":2048,"example":"https://www.acme.cl/registro"}},"description":"Dónde y cómo decidió la persona. Obligatorio en las capturas `digital`: es lo que sostiene la evidencia."},"witness":{"type":"string","maxLength":64,"example":"SUC-01","description":"Quién atestiguó una captura presencial: sucursal, código de vendedor, mesón."},"phone":{"type":"string","maxLength":32,"description":"El teléfono por el que se hizo una captura telefónica."}},"required":["form","identifier","scopes"]},"SubjectCompliance":{"type":"object","properties":{"agreementId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."},"consents":{"type":"array","items":{"type":"object","properties":{"templateId":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un consent template, siempre con el prefijo `tpl_`."},"name":{"type":"string","example":"Newsletter y ofertas"},"version":{"type":"integer"},"active":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"active":{"type":"boolean"},"required":{"type":"boolean"},"expiresAt":{"type":["string","null"]}},"required":["key","active","required","expiresAt"]}}},"required":["templateId","name","version","active","scopes"]}}},"required":["agreementId","consents"]},"PrivacyCenterSession":{"type":"object","properties":{"url":{"type":"string","format":"uri","example":"https://www.datrus.cl/p/p56x0vbtwhzj6821vvdfq3"},"agreementId":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un agreement, siempre con el prefijo `agr_`."}},"required":["url","agreementId"]},"SubjectSummaryStored":{"type":"object","properties":{"identifierHint":{"type":"string","example":"+569****5678","description":"The masked hint the person sees. Never the value."},"updatedAt":{"type":"string","format":"date-time"}},"required":["identifierHint","updatedAt"]},"SubjectSummaryInput":{"type":"object","properties":{"identifier":{"$ref":"#/components/schemas/PortalIdentifier"},"summary":{"$ref":"#/components/schemas/SubjectSummaryContent"}},"required":["identifier","summary"]},"PortalIdentifier":{"type":"object","properties":{"type":{"type":"string","enum":["email","phone","rut"],"example":"phone","description":"The three identifiers the portal accepts: a phone (SMS code), an email (branded email code) or a Chilean RUT (biometrics / branch)."},"value":{"type":"string","minLength":1,"maxLength":200,"example":"+56 9 1234 5678"}},"required":["type","value"]},"SubjectSummaryContent":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","minLength":1,"maxLength":120,"example":"Contact details"},"description":{"type":"string","minLength":1,"maxLength":400,"example":"Phone number used for delivery notices and campaigns."},"systems":{"type":"array","items":{"type":"string","minLength":1,"maxLength":80},"maxItems":10,"default":[],"example":["CRM","Messaging platform"]},"since":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","default":null,"example":"2025-03-12","description":"ISO date, or null when unknown."}},"required":["category","description"]},"minItems":1,"maxItems":50},"note":{"type":"string","maxLength":400,"default":"","example":"Declared by the company from its systems; refreshed nightly."}},"required":["items"]},"SubjectSummary":{"type":"object","properties":{"identifierHint":{"type":"string","example":"+569****5678"},"updatedAt":{"type":"string","format":"date-time"},"summary":{"$ref":"#/components/schemas/SubjectSummaryContent"}},"required":["identifierHint","updatedAt","summary"]},"RightsPortalSession":{"type":"object","properties":{"url":{"type":"string","format":"uri","example":"https://www.datrus.cl/t/5ych0s3hj30yjw1h2yw0k5/entrar?s=…","description":"Open it in the person's browser. It sets the portal session and redirects to the portal."},"expiresAt":{"type":"string","format":"date-time"}},"required":["url","expiresAt"]},"RightsPortalSessionInput":{"type":"object","properties":{"identifier":{"$ref":"#/components/schemas/PortalIdentifier"},"verificationLevel":{"type":"string","enum":["identifier_control","id_document","biometrics"],"default":"identifier_control","description":"How strongly YOUR app verified this person before opening the portal. `identifier_control` (default) opens everything about that identifier; `id_document` and `biometrics` also open requests about the whole person, as in the console rules. You vouch for it: the level is recorded with provider `api:<key>`."}},"required":["identifier"]}},"parameters":{}},"paths":{"/api/v1/verify":{"post":{"tags":["Verificación"],"summary":"Verificar un sello, sin cuenta","description":"Recomputa el sello del contenido con la canonicalización de Datrus y lo compara con `hash`. Público: no pide llave. El contenido no se guarda. Tope: 512000 caracteres.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifySeal"}}}},"responses":{"200":{"description":"El veredicto, o la razón por la que no hay veredicto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SealVerdict"}}}},"400":{"description":"Cuerpo inválido."}}}},"/api/v1/data-subject-requests/track/{code}":{"get":{"tags":["Derechos"],"summary":"Seguir una solicitud por su código, sin cuenta","description":"Lo mismo que ve la persona en la página pública de derechos: el estado, los derechos pedidos, las fechas y una pista enmascarada de su identificador. Público: no pide llave. Límite: 30 consultas por minuto por dirección IP. Un código que no existe y uno de otra empresa se ven igual.","security":[],"parameters":[{"schema":{"type":"string","minLength":6,"maxLength":12,"example":"DR-K7M2Q4"},"required":true,"name":"code","in":"path"}],"responses":{"200":{"description":"El estado público de la solicitud.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsRequestTracking"}}}},"400":{"description":"El código no tiene la forma `DR-` más seis caracteres.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No hay una solicitud con ese código.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Más de 30 consultas por minuto desde la misma dirección.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/me":{"get":{"tags":["Cuenta"],"summary":"Quién soy","description":"La empresa detrás de la llave, la llave misma con sus permisos, los productos contratados y el estado de cada módulo. Es la primera llamada que conviene hacer.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/modules":{"get":{"tags":["Cuenta"],"summary":"Los módulos y su estado","description":"Un módulo `off` está apagado para tu empresa: sus endpoints responden 403 `module_disabled` antes de mirar los permisos.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Module"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/permissions":{"get":{"tags":["Cuenta"],"summary":"El catálogo de permisos","description":"`admin` incluye `write`, que incluye `read`. `*` da todo; `<recurso>:*` da un recurso entero. Dale a cada llave sólo lo que ese sistema necesita.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Permission"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/api-keys":{"get":{"tags":["Llaves de API"],"summary":"Listar las llaves","description":"Todas las llaves de tu empresa, incluidas las revocadas: la fila se queda para el rastro de auditoría. Nunca el secreto, sólo el prefijo.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Llaves de API"],"summary":"Crear una llave","description":"El `secret` se devuelve una sola vez, acá. Manda un `Idempotency-Key` para que reintentar no te deje dos llaves.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKey"}}}},"responses":{"201":{"description":"Llave creada. El `secret` viene en esta respuesta y no se vuelve a mostrar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyWithSecret"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/api-keys/{id}":{"get":{"tags":["Llaves de API"],"summary":"Ver una llave","parameters":[{"schema":{"type":"string","example":"key_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Llaves de API"],"summary":"Cambiar el nombre, los permisos o el vencimiento","description":"Sólo lo que mandes. Para cambiar el secreto no se edita: se rota.","parameters":[{"schema":{"type":"string","example":"key_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKey"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"tags":["Llaves de API"],"summary":"Revocar una llave","description":"La revocación es inmediata y definitiva. La fila de la llave se queda, marcada con `revokedAt`, para el rastro de auditoría. Una llave no puede revocarse a sí misma.","parameters":[{"schema":{"type":"string","example":"key_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Revocada."},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/api-keys/{id}/rotate":{"post":{"tags":["Llaves de API"],"summary":"Rotar una llave","description":"Crea un secreto nuevo con el mismo nombre, ambiente y permisos, y revoca el anterior en la misma llamada. El `secret` nuevo se devuelve una sola vez. Es lo que haces cuando se te filtró una llave.","parameters":[{"schema":{"type":"string","example":"key_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"201":{"description":"Llave rotada. La anterior queda revocada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyWithSecret"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/roles":{"get":{"tags":["Cuenta"],"summary":"Los roles y lo que puede cada uno","description":"La matriz de permisos de la consola, tal como la aplica Datrus. Es de sólo lectura: los roles no se inventan por empresa.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Role"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/users":{"get":{"tags":["Usuarios"],"summary":"Listar las personas con acceso","description":"Quiénes entran a la consola de tu empresa, con su rol y si están activas.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Usuarios"],"summary":"Dar acceso a una persona","description":"Crea la cuenta con su rol. La persona entra por primera vez desde la pantalla de ingreso de Datrus y define ahí su contraseña; esta llamada no manda correos.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUser"}}}},"responses":{"201":{"description":"Cuenta creada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/users/{id}":{"get":{"tags":["Usuarios"],"summary":"Ver una persona","parameters":[{"schema":{"type":"string","example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Usuarios"],"summary":"Cambiar el rol o suspender","description":"Suspender (`active: false`) conserva todo lo que esa persona hizo; sólo le cierra la puerta. No puedes dejar a la empresa sin ningún administrador activo.","parameters":[{"schema":{"type":"string","example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUser"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"tags":["Usuarios"],"summary":"Quitar el acceso","description":"Borra la cuenta. Lo que esa persona hizo queda en la bitácora, que no se toca. Si sólo quieres cerrarle la puerta, suspende con `PATCH`.","parameters":[{"schema":{"type":"string","example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Cuenta eliminada."},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/company":{"get":{"tags":["Empresa"],"summary":"La identidad de tu empresa","description":"Lo que encabeza tu RAT exportado y tus documentos de privacidad.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Empresa"],"summary":"Cambiar la identidad de tu empresa","description":"Sólo lo que mandes. No se puede cambiar por API el identificador de la empresa, los productos contratados ni el estado de los módulos: eso lo administra Datrus con tu contrato.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCompany"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/settings":{"get":{"tags":["Ajustes"],"summary":"Todos los ajustes de una vez","description":"Las cuatro áreas juntas, para no hacer cuatro llamadas al arrancar. Para escribir, usa el endpoint de cada área.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"consent":{"$ref":"#/components/schemas/ConsentSettings"},"dataSubjectRequests":{"$ref":"#/components/schemas/RightsSettings"},"privacyCenter":{"$ref":"#/components/schemas/PrivacyCenterSettings"},"brand":{"$ref":"#/components/schemas/BrandSettings"}},"required":["consent","dataSubjectRequests","privacyCenter","brand"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/settings/consent":{"get":{"tags":["Ajustes"],"summary":"Ajustes de Consentimiento","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Ajustes"],"summary":"Cambiar los ajustes de Consentimiento","description":"Pasa por la misma validación que la consola: un texto obligatorio con el dato de una persona adentro se rechaza, porque esos textos se muestran en todas tus plantillas.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConsentSettings"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/settings/data-subject-requests":{"get":{"tags":["Ajustes"],"summary":"Ajustes de Derechos","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Ajustes"],"summary":"Cambiar los ajustes de Derechos","description":"No puedes dejar cero derechos habilitados: una empresa que no recibe ninguno no está cumpliendo el art. 10, está apagando el módulo.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRightsSettings"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/settings/privacy-center":{"get":{"tags":["Ajustes"],"summary":"Ajustes del centro de privacidad","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacyCenterSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Ajustes"],"summary":"Encender o apagar el centro de privacidad","description":"Encendido, cualquier persona puede pedir el enlace a su portal desde tu sitio. Apagarlo no borra nada de lo ya registrado.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePrivacyCenterSettings"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacyCenterSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/settings/brand":{"get":{"tags":["Ajustes"],"summary":"La marca de tus páginas públicas","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Ajustes"],"summary":"Cambiar la marca","description":"El contraste no se negocia: si el texto sobre la superficie o el color principal no alcanzan la razón que exige la WCAG, la respuesta es 400 con el número que dio. El logo se sube desde la consola, no por API.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBrandSettings"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/settings/data-subject-requests/notifications":{"get":{"tags":["Ajustes"],"summary":"Avisos de Derechos por evento","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsNotificationSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["Ajustes"],"summary":"Cambiar los avisos de Derechos por evento","description":"Manda sólo los eventos que quieres cambiar. Un correo mal formado se descarta; la lista tiene tope de 10 por evento.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRightsNotificationSettings"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsNotificationSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/settings/data-subject-requests/assignment-rules":{"get":{"tags":["Ajustes"],"summary":"Reglas de asignación de Derechos","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsAssignmentRules"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["Ajustes"],"summary":"Reemplazar las reglas de asignación de Derechos","description":"Se evalúan de arriba abajo al abrir cada solicitud, por cualquier canal; la primera activa que calza asigna. Toda persona tiene que ser de tu empresa y estar activa: si una no lo es, no se guarda ninguna.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRightsAssignmentRules"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsAssignmentRules"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/settings/data-protection-center":{"get":{"tags":["Ajustes"],"summary":"El centro de protección de datos","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataProtectionCenterSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["Ajustes"],"summary":"Encender, reemitir o apagar el centro y su canal de consultas","description":"`enabled: true` sobre un centro ya encendido REEMITE el enlace y el anterior deja de servir. Para conservar el enlace manda sólo `inquiriesEnabled`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDataProtectionCenterSettings"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataProtectionCenterSettings"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/catalogs/{type}":{"get":{"tags":["Catálogos"],"summary":"Listar un catálogo","description":"El catálogo de Datrus más lo que agregó tu empresa, en el orden en que se ofrece al llenar un tratamiento.","parameters":[{"schema":{"type":"string","enum":["data-categories","subject-kinds","systems","purposes","legal-bases"],"example":"systems","description":"Qué catálogo: categorías de dato, tipos de titular, sistemas, finalidades o bases de licitud."},"required":true,"description":"Qué catálogo: categorías de dato, tipos de titular, sistemas, finalidades o bases de licitud.","name":"type","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CatalogEntry"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Catálogos"],"summary":"Agregar una entrada propia","description":"La clave se deriva del nombre y es la que quedará escrita en tus tratamientos. Si ya existe una entrada con esa clave —tuya o del catálogo de Datrus— la respuesta es 409.","parameters":[{"schema":{"type":"string","enum":["data-categories","subject-kinds","systems","purposes","legal-bases"],"example":"systems","description":"Qué catálogo: categorías de dato, tipos de titular, sistemas, finalidades o bases de licitud."},"required":true,"description":"Qué catálogo: categorías de dato, tipos de titular, sistemas, finalidades o bases de licitud.","name":"type","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCatalogEntry"}}}},"responses":{"201":{"description":"Entrada creada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogEntry"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/catalogs/{type}/{id}":{"delete":{"tags":["Catálogos"],"summary":"Desactivar una entrada propia","description":"Deja de ofrecerse al llenar un tratamiento, pero NO se borra: los tratamientos y los cortes sellados que ya la citan tienen que seguir leyéndose igual. Las entradas del catálogo de Datrus no se pueden desactivar.","parameters":[{"schema":{"type":"string","enum":["data-categories","subject-kinds","systems","purposes","legal-bases"],"example":"systems","description":"Qué catálogo: categorías de dato, tipos de titular, sistemas, finalidades o bases de licitud."},"required":true,"description":"Qué catálogo: categorías de dato, tipos de titular, sistemas, finalidades o bases de licitud.","name":"type","in":"path"},{"schema":{"type":"string","example":"cat_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Entrada desactivada."},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processing-activities":{"get":{"tags":["Inventario y RAT"],"summary":"Listar los tratamientos","description":"El registro de actividades de tratamiento de tu empresa, con los filtros que usa la consola.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["draft","current","archived"]},"required":false,"name":"state","in":"query"},{"schema":{"type":"string"},"required":false,"name":"area","in":"query"},{"schema":{"type":"string","enum":["consent","financial_obligations","contract","legal_obligation","legitimate_interest","legal_claims","vital_interests","public_task"]},"required":false,"name":"legalBasis","in":"query"},{"schema":{"type":"string","enum":["true","false"]},"required":false,"name":"sensitive","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingActivityPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Inventario y RAT"],"summary":"Registrar un tratamiento","description":"Nace en borrador. La base de licitud y la retención pueden quedar pendientes; lo que no puede faltar es qué dato, de quién y para qué.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteProcessingActivity"}}}},"responses":{"201":{"description":"Tratamiento creado, en borrador.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingActivity"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processing-activities/{id}":{"get":{"tags":["Inventario y RAT"],"summary":"Ver un tratamiento","parameters":[{"schema":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingActivity"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Inventario y RAT"],"summary":"Cambiar un tratamiento","description":"Sólo lo que mandes. Los cambios no entran al RAT sellado hasta que cierres una versión con `/seal`.","parameters":[{"schema":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"area":{"type":"string","maxLength":120},"ownerId":{"type":["string","null"]},"purpose":{"type":"string","maxLength":120},"purposeDetail":{"type":"string","maxLength":2000},"legalBasis":{"type":["string","null"],"enum":["consent","financial_obligations","contract","legal_obligation","legitimate_interest","legal_claims","vital_interests","public_task",null]},"legalBasisReason":{"type":"string","maxLength":2000},"dataCategories":{"type":"array","items":{"type":"string"}},"subjectKinds":{"type":"array","items":{"type":"string"}},"systems":{"type":"array","items":{"type":"string"}},"minors":{"type":"boolean"},"minorsAgeRange":{"type":["string","null"],"enum":["under_14","from_14_to_15","from_16_to_17","unknown",null]},"securityMeasures":{"type":"string","maxLength":4000},"recipients":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"example":"Transbank S.A."},"role":{"type":"string","enum":["processor","assignee","legal_recipient"],"example":"processor","description":"La ley les da consecuencias distintas: `processor` trata por cuenta tuya y lleva contrato de encargo; `assignee` pasa a ser responsable por su cuenta; `legal_recipient` recibe porque una norma lo manda."}},"required":["name","role"]}},"nextReviewAt":{"type":["string","null"]},"automatedDecisions":{"type":"object","properties":{"enabled":{"type":"boolean"},"logic":{"type":"string","maxLength":4000},"effects":{"type":"string","maxLength":4000},"humanReview":{"type":"boolean"},"reviewerId":{"type":["string","null"]}}},"internationalTransfer":{"type":"object","properties":{"enabled":{"type":"boolean"},"countries":{"type":"array","items":{"type":"string"}},"safeguard":{"type":["string","null"],"enum":["adequacy_decision","standard_clauses","binding_corporate_rules","certified_model","subject_consent","legal_exception",null]},"safeguardDetail":{"type":"string","maxLength":2000}}},"processors":{"type":"array","items":{"type":"string"}},"retention":{"type":"object","properties":{"rule":{"type":["string","null"],"enum":["while_relationship","legal_period","fixed_term","until_withdrawal",null]},"detail":{"type":"string","maxLength":2000}}},"volume":{"type":["string","null"],"enum":["up_to_100","up_to_1000","up_to_10000","up_to_100000","over_100000",null]},"largeScale":{"type":["string","null"],"enum":["yes","no",null]},"publicAreaMonitoring":{"type":["string","null"],"enum":["yes","no",null]},"monitoringDetail":{"type":"string","maxLength":2000}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingActivity"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processing-activities/{id}/archive":{"post":{"tags":["Inventario y RAT"],"summary":"Archivar un tratamiento","description":"Deja de describir algo que la empresa hace hoy. No se borra: los cortes sellados que lo citan siguen valiendo.","parameters":[{"schema":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingActivity"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processing-activities/{id}/seal":{"post":{"tags":["Inventario y RAT"],"summary":"Cerrar una versión","description":"Congela una foto del tratamiento y la sella con el hash de su contenido canonicalizado. Es lo que después entra en un corte del RAT. Exige que el tratamiento esté completo para quedar vigente.","parameters":[{"schema":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"201":{"description":"Versión sellada.","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"integer"},"hash":{"type":"string"}},"required":["version","hash"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processing-activities/{id}/versions":{"get":{"tags":["Inventario y RAT"],"summary":"Las versiones selladas","parameters":[{"schema":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ActivityVersion"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processing-activities/{id}/versions/{version}":{"get":{"tags":["Inventario y RAT"],"summary":"Una versión sellada","description":"La foto tal como se congeló, con su hash. Es lo que se le entrega a quien pregunta qué decía el RAT en una fecha.","parameters":[{"schema":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"example":2},"required":true,"name":"version","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityVersion"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processing-activities/{id}/findings":{"get":{"tags":["Inventario y RAT"],"summary":"Qué le falta a este tratamiento","description":"Los hallazgos en orden de consecuencia: lo que impide que el tratamiento quede vigente va primero. Un tratamiento archivado no tiene hallazgos.","parameters":[{"schema":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ActivityFinding"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processing-activities/import":{"post":{"tags":["Inventario y RAT"],"summary":"Importar tratamientos desde una planilla","description":"Analiza la planilla con las mismas reglas de la consola y crea los tratamientos válidos, uno por fila. Con `dryRun` no escribe nada: devuelve qué pasaría. Los valores que no están en tus catálogos se reportan; no se inventan entradas.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportProcessingActivities"}}}},"responses":{"200":{"description":"Resultado del análisis y, si no era `dryRun`, de la creación.","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object","properties":{"rows":{"type":"integer"},"valid":{"type":"integer"},"withErrors":{"type":"integer"},"ignored":{"type":"integer"},"created":{"type":"integer"}},"required":["rows","valid","withErrors","ignored","created"]},"created":{"type":"array","items":{"type":"object","properties":{"row":{"type":"integer"},"id":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"code":{"type":"string"}},"required":["row","id","code"]}},"rejected":{"type":"array","items":{"type":"object","properties":{"row":{"type":"integer"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["field","message"]}}},"required":["row","errors"]}},"unknownValues":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"catalogue":{"type":"string"},"value":{"type":"string"}},"required":["field","catalogue","value"]}}},"required":["summary","created","rejected","unknownValues"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/register/snapshots":{"get":{"tags":["Inventario y RAT"],"summary":"Listar los cortes del RAT","description":"Cada corte es una foto sellada del registro en una fecha, con su hash raíz. Del más nuevo al más viejo.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RegisterSnapshot"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Inventario y RAT"],"summary":"Generar un corte del RAT","description":"Sella una foto de todos los tratamientos vigentes y la firma en la bitácora. Exige que cada tratamiento vigente tenga su versión cerrada: si alguno no la tiene, la respuesta es 409 y no se sella nada a medias.","responses":{"201":{"description":"Corte sellado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterSnapshot"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/register/snapshots/{number}":{"get":{"tags":["Inventario y RAT"],"summary":"Ver un corte","parameters":[{"schema":{"type":"integer","minimum":1,"example":3},"required":true,"name":"number","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterSnapshot"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/register/snapshots/{number}/export":{"get":{"tags":["Inventario y RAT"],"summary":"Descargar un corte en CSV","description":"El RAT tal como quedó sellado, no como está hoy. Antes de entregarlo se recomputan los hashes contra la bitácora: si la foto está incompleta o alguien tocó el contenido, responde 409 en vez de un archivo que no reproduce su sello.","parameters":[{"schema":{"type":"integer","minimum":1,"example":3},"required":true,"name":"number","in":"path"}],"responses":{"200":{"description":"El CSV del corte, con punto y coma como separador.","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/register/snapshots/{from}/diff/{to}":{"get":{"tags":["Inventario y RAT"],"summary":"Comparar dos cortes","description":"Qué entró, qué salió y qué cambió entre dos fotos selladas. Se comparan los cortes entre sí, nunca un corte contra el inventario de hoy.","parameters":[{"schema":{"type":"integer","minimum":1,"example":3},"required":true,"name":"from","in":"path"},{"schema":{"type":"integer","minimum":1,"example":3},"required":true,"name":"to","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDiff"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/register/data-map":{"get":{"tags":["Inventario y RAT"],"summary":"El mapa de datos","description":"Qué categoría de dato vive en qué sistema, y en cuántos tratamientos. Se arma solo con lo que el inventario declara; los sistemas que guardan datos sensibles van primero.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataMap"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/register/required-modules":{"get":{"tags":["Inventario y RAT"],"summary":"Los módulos que tu inventario exige y están apagados","description":"La ley no se cumple con los módulos encendidos, sino con lo que el inventario declara. Si un tratamiento se apoya en el consentimiento y el módulo está apagado, acá sale dicho, con cuántos tratamientos lo exigen.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RequiredModule"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-templates":{"get":{"tags":["Consentimiento"],"summary":"Listar las plantillas","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["draft","active","paused","archived"]},"required":false,"name":"state","in":"query"},{"schema":{"type":"string","enum":["consent","cookies","third_parties","contract","other"]},"required":false,"name":"kind","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentTemplatePage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Consentimiento"],"summary":"Crear una plantilla","description":"Nace en borrador y con su primera versión publicada: el texto se resuelve contra los documentos de privacidad vigentes y se sella. Enlázala a un tratamiento con `/link` antes de activarla.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConsentTemplate"}}}},"responses":{"201":{"description":"Plantilla creada, con su versión sellada.","content":{"application/json":{"schema":{"type":"object","properties":{"template":{"$ref":"#/components/schemas/ConsentTemplate"},"version":{"$ref":"#/components/schemas/ConsentTemplateVersion"}},"required":["template","version"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-templates/stats":{"get":{"tags":["Consentimiento"],"summary":"Las cifras por plantilla","description":"Cómo rinde cada plantilla: cuántos otorgaron y cuántos retiraron (actos y personas distintas), cuántas entradas de formulario se iniciaron y se completaron, y las dos tasas. Las tasas se miden sobre PERSONAS y no sobre actos: una persona que otorga y retira cuenta una vez de cada lado. `null` en una tasa significa que no hay a quién medir, y no es 0. `partial` avisa si la lectura tocó el tope de filas y las cifras son parciales.","parameters":[{"schema":{"type":"string","example":"2026-01-01","description":"Fecha o instante ISO; se compara contra la creación del acto o la entrada."},"required":false,"description":"Fecha o instante ISO; se compara contra la creación del acto o la entrada.","name":"from","in":"query"},{"schema":{"type":"string","example":"2026-12-31"},"required":false,"name":"to","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentTemplateStats"}},"partial":{"type":"boolean"}},"required":["data","partial"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-templates/{id}/stats":{"get":{"tags":["Consentimiento"],"summary":"Las cifras de una plantilla","description":"Lo mismo que `GET /consent-templates/stats`, para una sola plantilla. Una plantilla sin actos responde en cero, no 404.","parameters":[{"schema":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"2026-01-01","description":"Fecha o instante ISO; se compara contra la creación del acto o la entrada."},"required":false,"description":"Fecha o instante ISO; se compara contra la creación del acto o la entrada.","name":"from","in":"query"},{"schema":{"type":"string","example":"2026-12-31"},"required":false,"name":"to","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ConsentTemplateStats"},{"type":"object","properties":{"partial":{"type":"boolean"}},"required":["partial"]}]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-templates/{id}":{"get":{"tags":["Consentimiento"],"summary":"Ver una plantilla","parameters":[{"schema":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentTemplate"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Consentimiento"],"summary":"Editar una plantilla y publicar una versión nueva","description":"Editar el texto o los alcances PUBLICA una versión: lo firmado con la versión anterior no cambia. Manda siempre `text` y `scopes` completos, que es lo que se sella.","parameters":[{"schema":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditConsentTemplate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"template":{"$ref":"#/components/schemas/ConsentTemplate"},"version":{"$ref":"#/components/schemas/ConsentTemplateVersion"}},"required":["template","version"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-templates/{id}/versions":{"get":{"tags":["Consentimiento"],"summary":"Las versiones publicadas","description":"Cada solicitud cita una versión, no la plantilla: así lo que alguien autorizó ayer se lee igual aunque el texto cambie hoy.","parameters":[{"schema":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentTemplateVersion"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-templates/{id}/versions/{version}":{"get":{"tags":["Consentimiento"],"summary":"Una versión publicada","parameters":[{"schema":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"example":2},"required":true,"name":"version","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentTemplateVersion"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-templates/{id}/state":{"post":{"tags":["Consentimiento"],"summary":"Activar, pausar o archivar","description":"Sólo una plantilla `active` puede emitir solicitudes. Pausar no invalida nada de lo ya firmado; archivar la saca de circulación.","parameters":[{"schema":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeTemplateState"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentTemplate"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-templates/{id}/link":{"post":{"tags":["Consentimiento"],"summary":"Enlazar la plantilla a un tratamiento","description":"El enlace con el RAT es lo que mantiene honesto el consentimiento: la finalidad que lee la persona es la que declara el registro. Al enlazar, la plantilla puede heredar la finalidad y la base del tratamiento. Manda `null` para desenlazar.","parameters":[{"schema":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkTemplate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"template":{"$ref":"#/components/schemas/ConsentTemplate"},"inherited":{"type":"object","properties":{"primaryUse":{"type":"boolean"},"legalBasis":{"type":"boolean"}},"required":["primaryUse","legalBasis"]}},"required":["template","inherited"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-requests":{"get":{"tags":["Consentimiento"],"summary":"Listar las solicitudes","description":"La bandeja. Lo vencido se marca al leerlo: no hay un proceso por detrás que lo haga.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["issued","sent","opened","verified","decided","expired","disputed","cancelled"]},"required":false,"name":"state","in":"query"},{"schema":{"type":"string"},"required":false,"name":"agreementId","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRequestPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Consentimiento"],"summary":"Pedirle a una persona que decida","description":"Emite el enlace y, si el canal manda mensajes, lo manda. La plantilla tiene que estar activa. Queda registrada como emitida por `api`. Manda un `Idempotency-Key`: reintentar no puede dejar a la misma persona con dos solicitudes vivas.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConsentRequest"}}}},"responses":{"201":{"description":"Solicitud emitida.","content":{"application/json":{"schema":{"type":"object","properties":{"request":{"$ref":"#/components/schemas/ConsentRequest"},"link":{"type":"string","example":"https://www.datrus.cl/s/5eyx6jehtwd7j0r4er6g41","description":"El enlace que abre la persona. Entrégalo tú si el canal no manda mensajes."},"delivery":{"type":["object","null"],"properties":{"sent":{"type":"boolean"},"detail":{"type":"string"}},"required":["sent","detail"],"description":"`null` cuando el canal no manda nada (un QR, el mesón)."}},"required":["request","link","delivery"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-requests/stats":{"get":{"tags":["Consentimiento"],"summary":"Cuántas hay en cada estado","description":"Todos los estados salen, aunque sea en cero.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRequestStats"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-requests/{id}":{"get":{"tags":["Consentimiento"],"summary":"Ver una solicitud","parameters":[{"schema":{"type":"string","example":"csr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRequest"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-requests/{id}/cancel":{"post":{"tags":["Consentimiento"],"summary":"Anular una solicitud","description":"El enlace deja de servir. Sólo se anula lo que todavía no se decidió: una decisión tomada no se borra.","parameters":[{"schema":{"type":"string","example":"csr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRequest"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-requests/{id}/deliveries":{"get":{"tags":["Consentimiento"],"summary":"Qué pasó con los mensajes","description":"Cada intento de entrega con su estado y su costo. Es lo que se mira cuando alguien dice que nunca le llegó.","parameters":[{"schema":{"type":"string","example":"csr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentRequestDelivery"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-requests/{id}/verifications":{"get":{"tags":["Consentimiento"],"summary":"Cómo se verificó la identidad","description":"Qué método se usó, en qué nivel y cómo terminó. Es la evidencia de que quien decidió era quien decía ser.","parameters":[{"schema":{"type":"string","example":"csr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentRequestVerification"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/agreements/{id}":{"get":{"tags":["Consentimiento"],"summary":"Ver el acuerdo de una persona","description":"El registro de una persona con tu empresa. Estable en el tiempo: no cambia aunque decida otra cosa. Para llegar acá desde un correo o un RUT, usa `POST /data-subjects/lookup`.","parameters":[{"schema":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agreement"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/agreements/{id}/versions/{version}/evidence":{"get":{"tags":["Consentimiento"],"summary":"Descargar la evidencia de una versión","description":"La evidencia sellada de una versión del acuerdo, como archivo. `format=pdf` (por defecto) entrega el documento que se le muestra a un auditor; `format=json` entrega el sobre sellado, el mismo que acepta `POST /verify` sin cuenta. Si la evidencia ya no cuadra con su sello, no se exporta: 409.","parameters":[{"schema":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"example":1},"required":true,"name":"version","in":"path"},{"schema":{"type":"string","enum":["pdf","json"],"default":"pdf"},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"El archivo.","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"$ref":"#/components/schemas/SealedConsentEvidence"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/agreements/{id}/permissions":{"get":{"tags":["Consentimiento"],"summary":"Qué puedes tratar hoy de esta persona","description":"Se recomputa desde los actos, que son la fuente de verdad. Cada permiso vigente trae las plantillas que lo sostienen: un permiso vive mientras AL MENOS UNA lo sostenga, así que revocar una no se lleva por delante lo que otra requiere.","parameters":[{"schema":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementPermissions"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/agreements/{id}/dossier":{"get":{"tags":["Consentimiento"],"summary":"El expediente completo","description":"Todo lo que pasó con esta persona: qué autorizó, cuándo, por dónde, cómo se verificó su identidad y con qué sello quedó cada acto. Es lo que se entrega cuando alguien pregunta cómo se obtuvo un consentimiento.","parameters":[{"schema":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementDossier"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/agreements/{id}/revocation-preview":{"post":{"tags":["Consentimiento"],"summary":"Qué pasaría si se revocara esto","description":"NO escribe nada, y ése es el punto: es lo que se le muestra a alguien antes de apretar el botón. Devuelve las dos fotos, el diff y qué permisos sobreviven porque otra plantilla los sostiene. Sin `scopes` se previsualiza la plantilla entera.","parameters":[{"schema":{"type":"string","example":"agr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevocationPreviewRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevocationPreview"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consents/stats":{"get":{"tags":["Consentimiento"],"summary":"Las cifras del módulo","description":"Cuántas personas tienen registro, cuántas con autorización vigente, cuántas quedaron pendientes de reconsentir tras cambiar una plantilla, y cómo van las solicitudes.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentStats"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-activity":{"get":{"tags":["Consentimiento"],"summary":"Quién hizo qué en el módulo","description":"El registro de acciones de Consentimiento: quién publicó una plantilla, quién emitió una solicitud, quién corrigió un registro. Nunca lleva el identificador de un titular; una reja lo comprueba antes de entregar la lista.","parameters":[{"schema":{"type":"string"},"required":false,"name":"actor","in":"query"},{"schema":{"type":"string","example":"consentimiento.plantilla.publicada"},"required":false,"name":"type","in":"query"},{"schema":{"type":"string","description":"Fecha o instante ISO."},"required":false,"description":"Fecha o instante ISO.","name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"name":"to","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentActivity"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/third-party-roles":{"get":{"tags":["Consentimiento"],"summary":"Los cuatro roles de un tercero","description":"Catálogo cerrado. El rol decide qué se le avisa a cada tercero cuando alguien revoca.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ThirdPartyRole"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/third-parties":{"get":{"tags":["Consentimiento"],"summary":"Listar los terceros","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"true"},"required":false,"name":"includeArchived","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ThirdParty"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Consentimiento"],"summary":"Registrar un tercero","description":"La razón social no puede traer el dato de una persona: un tercero es una empresa, y ese nombre termina en un CSV, en el PDF de una evidencia y en la pantalla del socio.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteThirdParty"}}}},"responses":{"201":{"description":"Tercero registrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThirdParty"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/third-parties/{id}":{"get":{"tags":["Consentimiento"],"summary":"Ver un tercero","parameters":[{"schema":{"type":"string","example":"trd_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThirdParty"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Consentimiento"],"summary":"Editar un tercero","description":"El `code` es estable y no se cambia: es lo que quedó sellado en las evidencias. El nombre sí, porque una empresa se puede renombrar.","parameters":[{"schema":{"type":"string","example":"trd_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteThirdParty"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThirdParty"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/third-parties/{id}/state":{"post":{"tags":["Consentimiento"],"summary":"Archivar o reactivar un tercero","description":"Archivar es la baja, y significa algo: un tercero archivado NO se puede enlazar a una plantilla. Lo ya sellado no cambia.","parameters":[{"schema":{"type":"string","example":"trd_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeThirdPartyState"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThirdParty"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-templates/{id}/third-parties":{"get":{"tags":["Consentimiento"],"summary":"Con quién comparte datos esta plantilla","description":"Lo que el titular ve declarado al consentir, y lo que se sella con cada acto.","parameters":[{"schema":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LinkedThirdParty"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["Consentimiento"],"summary":"Fijar con quién comparte datos esta plantilla","description":"Reemplaza el conjunto completo: lo que mandes es lo que queda. Un tercero archivado no se puede enlazar. Cambiar esto no altera lo ya sellado; rige desde la próxima versión que se publique.","parameters":[{"schema":{"type":"string","example":"tpl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTemplateThirdParties"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"}},"required":["total"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-revocations":{"post":{"tags":["Consentimiento"],"summary":"Revocar un consentimiento por decisión de la empresa","description":"La empresa retira lo que ella misma sostenía: sin `scopes` se retira la plantilla entera. Pasa por el mismo motor que una revocación del titular, así que deja la misma evidencia sellada. Manda `sourceEvent` para que reintentar no selle dos veces.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConsentRevocation"}}}},"responses":{"201":{"description":"Revocación registrada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagementResult"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-corrections/preview":{"post":{"tags":["Consentimiento"],"summary":"Qué haría esta corrección","description":"No escribe nada. Dice qué alcances se retirarían, cuáles se ampliarían —si amplía, no es una corrección— y si es estrecha, que es la condición para poder aplicarla.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewConsentCorrection"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentCorrectionPreview"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-corrections":{"post":{"tags":["Consentimiento"],"summary":"Corregir lo que quedó registrado","description":"«Esto es lo que debió quedar otorgado». Sólo ACOTA: si lo que mandas ampliaría lo que la persona autorizó, se rechaza — no se puede otorgar por cuenta de nadie. Previsualiza primero con `/preview`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConsentCorrection"}}}},"responses":{"201":{"description":"Corrección aplicada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagementResult"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-corrections/{id}/rollback":{"post":{"tags":["Consentimiento"],"summary":"Revertir una corrección","description":"Restaura lo que esa plantilla sostenía antes. La reversión ES un acto y queda en el expediente; pedirla dos veces no sella una versión más.","parameters":[{"schema":{"type":"string","example":"cor_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollbackConsentCorrection"}}}},"responses":{"200":{"description":"Corrección revertida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagementResult"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/subject-merges":{"post":{"tags":["Titulares"],"summary":"Fusionar dos registros de la misma persona","description":"El absorbido NO se borra: se marca y se redirige, para que un expediente viejo siga resolviendo. El motivo es obligatorio y sale de un catálogo cerrado. Fusionar dos veces los mismos registros no sella nada nuevo.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubjectMerge"}}}},"responses":{"201":{"description":"Registros fusionados.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectMerge"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-import-templates":{"get":{"tags":["Consentimiento"],"summary":"Contra qué plantillas se puede importar","description":"Las que tienen una versión publicada y no están archivadas, con sus claves de alcance. Una archivada la rechaza el motor y una en borrador no tiene alcances contra los que validar.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ImportableTemplate"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-imports":{"post":{"tags":["Consentimiento"],"summary":"Importar consentimientos históricos","description":"Cada fila es UN ACTO del motor, no una fila insertada a mano: versión del acuerdo, diff, evidencia sellada y evento encadenado. Por eso un consentimiento importado produce exactamente la misma evidencia que uno capturado en pantalla. Se procesa de a 20 registros: manda `from` con el índice siguiente para continuar. El archivo NO se guarda en ninguna parte.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConsentImport"}}}},"responses":{"200":{"description":"Resultado de la tanda.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentImportResult"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests":{"get":{"tags":["Derechos"],"summary":"Listar las solicitudes de derechos","description":"La bandeja, con el plazo de cada una ya calculado: `daysLeft` negativo es una solicitud vencida.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["awaiting_verification","validating","in_progress","resolved","identity_not_matched","expired"]},"required":false,"name":"state","in":"query"},{"schema":{"type":"string"},"required":false,"name":"area","in":"query"},{"schema":{"type":"string","description":"El id de la persona a cargo."},"required":false,"description":"El id de la persona a cargo.","name":"assignedTo","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataSubjectRequestPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Derechos"],"summary":"Registrar una solicitud","description":"Para cargar la que llegó por otro canal —un correo, una carta, el mesón— sin perder el plazo: manda `receivedAt` con la fecha real y el reloj corre desde ahí. Cada derecho pedido abre su propio proceso.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDataSubjectRequest"}}}},"responses":{"201":{"description":"Solicitud registrada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataSubjectRequest"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/stats":{"get":{"tags":["Derechos"],"summary":"Cómo va el módulo","description":"Abiertas, por vencer, vencidas y resueltas en los últimos 30 días. La lista viene seudonimizada.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsStats"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/{id}":{"get":{"tags":["Derechos"],"summary":"Ver una solicitud","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataSubjectRequest"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/{id}/processes":{"get":{"tags":["Derechos"],"summary":"Los derechos pedidos, uno por uno","description":"Cada derecho es su propio proceso: la supresión se puede rechazar mientras el acceso se concede, y el expediente tiene que decir las dos cosas.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RightsProcess"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/{id}/acknowledge":{"post":{"tags":["Derechos"],"summary":"Acusar recibo","description":"Deja constancia de que la solicitud se recibió. Acusar dos veces responde lo mismo y no escribe: el acuse es uno solo.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"acknowledgedAt":{"type":"string"}},"required":["acknowledgedAt"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/{id}/extend":{"post":{"tags":["Derechos"],"summary":"Prorrogar el plazo","description":"La ley admite UNA prórroga de 30 días corridos, y exige justificarla. Pedir una segunda se rechaza: el plazo no es negociable dos veces.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendRightsRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"dueAt":{"type":"string"}},"required":["dueAt"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/{id}/assign":{"post":{"tags":["Derechos"],"summary":"Asignar a una persona","description":"Manda `userId: null` para dejarla sin dueño.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignRightsRequest"}}}},"responses":{"204":{"description":"Asignada."},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/{id}/blocking-order":{"post":{"tags":["Derechos"],"summary":"Ordenar el bloqueo provisional","description":"El art. 8 ter: mientras se resuelve una rectificación, una supresión o una oposición, los datos se bloquean. Sólo procede con uno de esos tres derechos en trámite, y exige justificación.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderBlocking"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"dueAt":{"type":"string"}},"required":["dueAt"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/{id}/processes/{processId}/resolve":{"post":{"tags":["Derechos"],"summary":"Resolver un derecho","description":"Concede o rechaza UN derecho de la solicitud. Rechazar exige el motivo: el art. 11 obliga a fundar la negativa. Cuando se resuelve el último proceso abierto, la solicitud se cierra sola y queda su desenlace.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"prs_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"processId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveRightsProcess"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"closedRequest":{"type":"boolean","description":"`true` si con esto se cerró la solicitud entera."}},"required":["closedRequest"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/{id}/evidence":{"get":{"tags":["Derechos"],"summary":"Los archivos del expediente","description":"La cédula que aportó la persona, el poder de representación, el acta del mesón, el respaldo de la respuesta. Se listan sus fichas y su sello; el CUERPO del archivo se borra solo a los 30 días del cierre, y `purgedAt` dice cuándo se vació.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RightsEvidence"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Derechos"],"summary":"Adjuntar un archivo al expediente","description":"Sube el acta del mesón o el respaldo de la respuesta. Idempotente por contenido: el mismo archivo dos veces devuelve la ficha que ya estaba, y no ensucia el sello del expediente. El nombre del archivo no se guarda: sólo la etiqueta y el sha256 del contenido. El cuerpo se borra solo a los 30 días del cierre.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadRightsEvidence"}}}},"responses":{"201":{"description":"Adjuntado (o ya estaba: misma ficha).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsEvidence"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subject-requests/{id}/evidence/{evidenceId}":{"get":{"tags":["Derechos"],"summary":"Descargar un archivo del expediente","description":"El cuerpo del archivo, con su tipo real. Un archivo ya purgado responde 404: la ficha se queda en la lista, el cuerpo no.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"evd_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"evidenceId","in":"path"}],"responses":{"200":{"description":"El archivo.","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpo-inquiries":{"get":{"tags":["Derechos"],"summary":"Las consultas al delegado","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DpoInquiry"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpo-inquiries/{id}/answer":{"post":{"tags":["Derechos"],"summary":"Responder una consulta al delegado","description":"La respuesta se registra y, si el correo de la persona no se purgó todavía, sale por correo con la marca de la empresa. `emailed` dice si salió.","parameters":[{"schema":{"type":"string","example":"inq_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerDpoInquiry"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/DpoInquiry"},{"type":"object","properties":{"emailed":{"type":"boolean"}},"required":["emailed"]}]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/ai-systems":{"get":{"tags":["Gobernanza IA"],"summary":"Los sistemas de IA de la empresa","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AiSystem"}},"summary":{"type":"object","properties":{"total":{"type":"integer"},"unclassified":{"type":"integer"},"high":{"type":"integer"},"assessmentMissing":{"type":"integer"}},"required":["total","unclassified","high","assessmentMissing"]}},"required":["data","summary"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Gobernanza IA"],"summary":"Registrar un sistema de IA","description":"Un sistema `third_party` exige `vendorId`. `risk` distinto de `unclassified` exige `riskRationale`: la clasificación es un criterio de Datrus y la razón es lo que se muestra.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSystemInput"}}}},"responses":{"201":{"description":"Registrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSystem"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/ai-systems/{id}":{"get":{"tags":["Gobernanza IA"],"summary":"Ver un sistema de IA","parameters":[{"schema":{"type":"string","example":"ais_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSystem"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Gobernanza IA"],"summary":"Editar un sistema de IA","parameters":[{"schema":{"type":"string","example":"ais_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":4000},"type":{"type":"string","enum":["in_house","third_party","embedded"]},"vendorId":{"type":["string","null"],"example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processor, siempre con el prefijo `prc_`."},"purpose":{"type":"string","maxLength":2000},"inputData":{"type":"array","items":{"type":"string","maxLength":120},"maxItems":40},"processesPersonalData":{"type":"boolean"},"significantDecisions":{"type":"boolean"},"humanIntervention":{"type":"boolean"},"reviewRightInformed":{"type":"boolean"},"risk":{"type":"string","enum":["unclassified","low","medium","high","unacceptable"]},"riskRationale":{"type":"string","maxLength":2000},"ownerId":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"processingActivityIds":{"type":"array","items":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSystem"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/ai-systems/{id}/state":{"post":{"tags":["Gobernanza IA"],"summary":"Cambiar el estado","parameters":[{"schema":{"type":"string","example":"ais_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSystemState"}}}},"responses":{"204":{"description":"Cambiado."},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/ai-systems/{id}/assessment":{"get":{"tags":["Gobernanza IA"],"summary":"La evaluación de impacto algorítmico","parameters":[{"schema":{"type":"string","example":"ais_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSystemAssessment"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["Gobernanza IA"],"summary":"Guardar el borrador de la evaluación","description":"Ocho secciones (criterio de Datrus sobre la plantilla de EIPD). Aprobada, no se edita.","parameters":[{"schema":{"type":"string","example":"ais_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSystemAssessmentInput"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSystemAssessment"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/ai-systems/{id}/assessment/approve":{"post":{"tags":["Gobernanza IA"],"summary":"Aprobar y sellar la evaluación","description":"Sólo completa. Queda sellada con hash e inmutable.","parameters":[{"schema":{"type":"string","example":"ais_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSystemAssessment"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/ai-systems/{id}/seal":{"post":{"tags":["Gobernanza IA"],"summary":"Sellar una versión del sistema","description":"Congela la ficha con su hash. Sin cambios desde la última versión no sella otra vez.","parameters":[{"schema":{"type":"string","example":"ais_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"integer"},"hash":{"type":"string"}},"required":["version","hash"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/controls":{"get":{"tags":["Controles y riesgos"],"summary":"Los controles con su evidencia","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Control"}},"summary":{"type":"object","properties":{"total":{"type":"integer"},"implemented":{"type":"integer"},"withoutCurrentEvidence":{"type":"integer"},"expired":{"type":"integer"},"expiring":{"type":"integer"}},"required":["total","implemented","withoutCurrentEvidence","expired","expiring"]}},"required":["data","summary"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Controles y riesgos"],"summary":"Crear un control","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControlInput"}}}},"responses":{"201":{"description":"Creado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Control"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/controls/catalog":{"get":{"tags":["Controles y riesgos"],"summary":"El catálogo de controles de Datrus","description":"Twenty controls an auditor expects first (ISO 27001 Annex A and Art. 14 quinquies). A Datrus criterion, not a list from the law.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"reference":{"type":"string"},"reviewPeriod":{"type":"string","enum":["once","monthly","quarterly","half_yearly","yearly"]}},"required":["key","name","description","reference","reviewPeriod"]}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/controls/adopt":{"post":{"tags":["Controles y riesgos"],"summary":"Adoptar controles del catálogo","description":"Copies the chosen catalog controls to the company with their reference. Already adopted keys are skipped, never duplicated.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControlAdoptInput"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"array","items":{"$ref":"#/components/schemas/Control"}},"skipped":{"type":"array","items":{"type":"string"}}},"required":["created","skipped"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/controls/{id}":{"get":{"tags":["Controles y riesgos"],"summary":"Ver un control","parameters":[{"schema":{"type":"string","example":"ctl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Control"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Controles y riesgos"],"summary":"Editar un control","parameters":[{"schema":{"type":"string","example":"ctl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":4000},"origin":{"type":"string","enum":["datrus_catalog","own","free_text"]},"catalogReference":{"type":"string","maxLength":120},"ownerId":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"reviewPeriod":{"type":"string","enum":["once","monthly","quarterly","half_yearly","yearly"]},"state":{"type":"string","enum":["planned","implemented","retired"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Control"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/controls/{id}/evidence":{"post":{"tags":["Controles y riesgos"],"summary":"Registrar evidencia de un control","description":"A description, where the proof lives and an optional sha256. Never the file nor personal data. Without `validUntil`, the expiry is suggested from the review period.","parameters":[{"schema":{"type":"string","example":"ctl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControlEvidenceInput"}}}},"responses":{"201":{"description":"Registrada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControlEvidence"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risks":{"get":{"tags":["Controles y riesgos"],"summary":"El registro de riesgos","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Risk"}},"summary":{"type":"object","properties":{"total":{"type":"integer"},"open":{"type":"integer"},"byLevel":{"type":"object","additionalProperties":{"type":"integer"}},"openWithoutControls":{"type":"integer"}},"required":["total","open","byLevel","openWithoutControls"]},"dpiaRisksNotAdopted":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"dpr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un DPIA risk, siempre con el prefijo `dpr_`."},"dpiaId":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un impact assessment, siempre con el prefijo `dpa_`."},"description":{"type":"string"},"affectedRight":{"type":"string"},"likelihood":{"type":"string"},"severity":{"type":"string"},"residual":{"type":"string"}},"required":["id","dpiaId","description","affectedRight","likelihood","severity","residual"]}}},"required":["data","summary","dpiaRisksNotAdopted"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Controles y riesgos"],"summary":"Registrar un riesgo","description":"Measured with the current matrix: `impact` and `likelihood` go from 1 to the matrix scale; the level is computed and frozen with the matrix version. A `declaredLevel` requires its rationale.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskInput"}}}},"responses":{"201":{"description":"Registrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Risk"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risks/adopt-dpia-risk":{"post":{"tags":["Controles y riesgos"],"summary":"Adoptar un riesgo de una EIPD","description":"Brings a DPIA risk into the register (the DPIA is untouched), translating its four words to the current matrix scale. Adopting twice returns the existing one.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAdoptInput"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Risk"},{"type":"object","properties":{"alreadyExisted":{"type":"boolean"}},"required":["alreadyExisted"]}]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risks/{id}":{"get":{"tags":["Controles y riesgos"],"summary":"Ver un riesgo","parameters":[{"schema":{"type":"string","example":"rrg_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Risk"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Controles y riesgos"],"summary":"Editar un riesgo","description":"The origin does not change. New impact or likelihood are measured again with the current matrix.","parameters":[{"schema":{"type":"string","example":"rrg_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string","minLength":1,"maxLength":2000,"description":"What can happen, never to whom it happened."},"affectedRight":{"type":"string","maxLength":80},"impact":{"type":"integer","minimum":1,"maximum":5},"likelihood":{"type":"integer","minimum":1,"maximum":5},"declaredLevel":{"type":["string","null"],"enum":["low","moderate","high","critical",null]},"declaredLevelRationale":{"type":"string","maxLength":2000},"residual":{"type":"string","enum":["accepted","reduced","high"]},"ownerId":{"type":["string","null"],"example":"usr_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un console user, siempre con el prefijo `usr_`."},"state":{"type":"string","enum":["open","mitigated","accepted","closed"]},"controlIds":{"type":"array","items":{"type":"string","example":"ctl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un control, siempre con el prefijo `ctl_`."},"maxItems":50}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Risk"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risks/{id}/controls":{"put":{"tags":["Controles y riesgos"],"summary":"Vincular los controles que mitigan un riesgo","description":"Replaces the whole set.","parameters":[{"schema":{"type":"string","example":"rrg_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskControlsInput"}}}},"responses":{"204":{"description":"Vinculados."},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents/article-14-ter":{"get":{"tags":["Documentos"],"summary":"Las doce letras del art. 14 ter","description":"Lo que la ley obliga a decir en una política de privacidad, letra por letra, con qué módulo contesta cada una. Verificado contra el Diario Oficial N° 44.023 del 13-12-2024.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Article14TerLetter"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents":{"get":{"tags":["Documentos"],"summary":"Listar los documentos","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["privacy_policy","terms","notice","cookies","retention_policy","guideline","other"]},"required":false,"name":"kind","in":"query"},{"schema":{"type":"string","enum":["true","false"],"default":"false"},"required":false,"name":"includeArchived","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacyDocumentPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Documentos"],"summary":"Crear un documento","description":"Nace en borrador con su versión 1 sellada. La `key` es lo que las plantillas de consentimiento citan entre llaves; es estable y no se cambia.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePrivacyDocument"}}}},"responses":{"201":{"description":"Documento creado.","content":{"application/json":{"schema":{"type":"object","properties":{"document":{"$ref":"#/components/schemas/PrivacyDocument"},"version":{"$ref":"#/components/schemas/DocumentVersion"}},"required":["document","version"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents/{id}":{"get":{"tags":["Documentos"],"summary":"Ver un documento","parameters":[{"schema":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacyDocument"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Documentos"],"summary":"Editar y sellar una versión nueva","description":"Editar el texto SELLA una versión: la anterior se queda, porque puede haber estado publicada y eso es evidencia.","parameters":[{"schema":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditPrivacyDocument"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"document":{"$ref":"#/components/schemas/PrivacyDocument"},"version":{"$ref":"#/components/schemas/DocumentVersion"}},"required":["document","version"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents/{id}/versions":{"get":{"tags":["Documentos"],"summary":"Las versiones selladas","parameters":[{"schema":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DocumentVersion"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents/{id}/versions/{version}/approve":{"post":{"tags":["Documentos"],"summary":"Aprobar una versión","description":"Aprobar es ADOPTAR el texto. Es el paso previo y obligatorio para publicar: el art. 14 ter manda publicar lo que la empresa adoptó.","parameters":[{"schema":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"example":1},"required":true,"name":"version","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"integer"},"versionHash":{"type":"string"},"approvedBy":{"type":"string"},"approvedAt":{"type":"string"}},"required":["version","versionHash","approvedBy","approvedAt"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents/{id}/publish":{"post":{"tags":["Documentos"],"summary":"Publicar una versión aprobada","description":"Abre el período de vigencia y cierra el anterior en el MISMO instante, para que no quede un hueco en el que ninguna versión regía. Exige que la versión esté aprobada y sellada. `coveredLetters` congela qué letras del art. 14 ter cubría al publicar.","parameters":[{"schema":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishDocument"}}}},"responses":{"201":{"description":"Publicada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentPublication"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents/{id}/unpublish":{"post":{"tags":["Documentos"],"summary":"Despublicar","description":"Cierra el período vigente. Lo que estuvo publicado sigue constando: despublicar no borra la historia, la cierra.","parameters":[{"schema":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"until":{"type":"string"}},"required":["until"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents/{id}/publications":{"get":{"tags":["Documentos"],"summary":"Los períodos de vigencia","description":"Cada publicación con su intervalo `[from, to)` y las letras que cubría. Es lo que responde «qué decía tu política el 3 de marzo».","parameters":[{"schema":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DocumentPublication"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents/{id}/effective-at":{"get":{"tags":["Documentos"],"summary":"Qué versión regía en una fecha","description":"Tres respuestas posibles, y `no_publication` es legítima: una fecha anterior a la primera publicación, o caída en un hueco, no tiene versión vigente. Devolver la más antigua sería afirmar sobre esa fecha algo que nadie publicó.","parameters":[{"schema":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"2026-03-03T12:00:00Z"},"required":true,"name":"at","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentEffectiveAt"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/documents/{id}/coverage":{"get":{"tags":["Documentos"],"summary":"Qué letras del art. 14 ter cubre hoy","description":"Según su publicación vigente. Sin publicación vigente no hay cobertura que declarar: la respuesta lo dice en vez de inventar un número.","parameters":[{"schema":{"type":"string","example":"doc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCoverage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/security-measures":{"get":{"tags":["Proveedores"],"summary":"Las cuatro medidas del art. 14 quinquies","description":"Lo que un encargado puede acreditar, letra por letra. El art. 14 quinquies inciso final pone sobre el responsable la carga de probar que existen y funcionan.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"measure":{"type":"string","enum":["pseudonymisation_encryption","confidentiality_integrity_availability_resilience","restoration","regular_verification"]},"letter":{"type":"string"},"requires":{"type":"string"}},"required":["measure","letter","requires"]}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors":{"get":{"tags":["Proveedores"],"summary":"Listar los proveedores","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["draft","current","archived"]},"required":false,"name":"state","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessorPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Proveedores"],"summary":"Dar de alta un proveedor","description":"Nace en borrador. `role` importa: `processor` trata por cuenta tuya, `assignee` pasa a ser responsable para todos los efectos legales, y son dos contratos distintos.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProcessor"}}}},"responses":{"201":{"description":"Proveedor creado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Processor"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}":{"get":{"tags":["Proveedores"],"summary":"Ver un proveedor","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Processor"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Proveedores"],"summary":"Editar un proveedor","description":"Un proveedor archivado no se edita: archivar es una salida, no una etapa.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProcessor"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Processor"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}/seal":{"post":{"tags":["Proveedores"],"summary":"Sellar una versión del proveedor","description":"Congela la ficha del proveedor con un sello recomputable, con el mismo recorte que la versión de un tratamiento. Es la versión de la FICHA, no el expediente completo que se entrega a un fiscalizador: ése se sella aparte y no lleva el correo del contacto.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"integer"},"hash":{"type":"string"}},"required":["version","hash"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}/versions":{"get":{"tags":["Proveedores"],"summary":"Las versiones selladas","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"version":{"type":"integer"},"hash":{"type":"string"},"sealedBy":{"type":"string"},"sealedAt":{"type":"string"}},"required":["version","hash","sealedBy","sealedAt"]}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}/archive":{"post":{"tags":["Proveedores"],"summary":"Archivar un proveedor","description":"Archivar es un cambio de estado, nunca un borrado: la evidencia no se borra.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"archived":{"type":"boolean"}},"required":["archived"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}/processing-activities":{"get":{"tags":["Proveedores"],"summary":"Qué tratamientos toca este encargado","description":"El radio de impacto: los tratamientos del RAT que declaran a este proveedor como encargado. De acá salen las tres cláusulas derivadas del contrato, y es lo que hace falta tener en la misma base para poder contestarlo.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LinkedProcessingActivity"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Proveedores"],"summary":"Vincular un tratamiento","description":"Declara que este proveedor trata por cuenta tuya en ese tratamiento. Vincular dos veces lo mismo es idempotente. Un proveedor archivado no se vincula: lo devolvería al RAT por la puerta de atrás.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkProcessingActivity"}}}},"responses":{"200":{"description":"Vinculado.","content":{"application/json":{"schema":{"type":"object","properties":{"linked":{"type":"boolean"}},"required":["linked"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}/processing-activities/{activityId}":{"delete":{"tags":["Proveedores"],"summary":"Desvincular un tratamiento","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"activityId","in":"path"}],"responses":{"200":{"description":"Desvinculado.","content":{"application/json":{"schema":{"type":"object","properties":{"linked":{"type":"boolean"}},"required":["linked"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}/agreement":{"get":{"tags":["Proveedores"],"summary":"El contrato de encargo (art. 15 bis)","description":"Con sus seis cláusulas: tres escritas y tres derivadas del RAT. `missing` es lo que falta para que el contrato cumpla el inc. 3, y `ratDrift` dice en qué se separó el registro de lo que el contrato congeló.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingAgreement"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["Proveedores"],"summary":"Guardar el contrato de encargo","description":"Las cláusulas derivadas del RAT —finalidad, tipos de datos y categorías de titulares— NO se aceptan acá: salen de los tratamientos vinculados. Un contrato que declarara sus propias finalidades podría contradecir al registro, y el registro es lo que se selló.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveProcessingAgreement"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingAgreement"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}/subprocessors":{"get":{"tags":["Proveedores"],"summary":"Los subencargados declarados","description":"Art. 15 bis inc. 3: delegar parte del encargo exige autorización específica y por escrito. No saber no es lo mismo que saber que no, y por eso `authorisation` tiene tres valores.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Subprocessor"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Proveedores"],"summary":"Declarar un subencargado","description":"Exige que el proveedor ya tenga contrato de encargo: un subencargo cuelga del encargo. No hay un tercer nivel, y no es una regla que se pueda ablandar — es una fila que no tiene dónde escribirse.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeclareSubprocessor"}}}},"responses":{"201":{"description":"Subencargado declarado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subprocessor"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}/reviews":{"get":{"tags":["Proveedores"],"summary":"Las revisiones periódicas","description":"La cadencia es criterio de producto, no plazo legal: la Ley 21.719 no fija ninguno. `nextReviewAt` sale de la criticidad del proveedor.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"nextReviewAt":{"type":"string"},"overdue":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"outcome":{"type":"string"},"notes":{"type":"string"},"reviewedBy":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","date","outcome","notes","reviewedBy","createdAt"]}}},"required":["nextReviewAt","overdue","data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Proveedores"],"summary":"Registrar una revisión","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterProcessorReview"}}}},"responses":{"201":{"description":"Revisión registrada.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/processors/{id}/termination":{"get":{"tags":["Proveedores"],"summary":"El término del encargo","description":"Art. 15 bis inc. 5: cumplida la prestación, los datos se suprimen o se devuelven. Es la pregunta que hace un fiscalizador cuando un contrato terminó — «¿y los datos?».","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK. `terminated` en `false` cuando no hay término registrado.","content":{"application/json":{"schema":{"type":"object","properties":{"terminated":{"type":"boolean"},"terminatedAt":{"type":["string","null"]},"destination":{"type":["string","null"],"enum":["erase","return",null]},"record":{"type":["string","null"],"description":"La constancia declarada de lo que se hizo con los datos."},"recordSha256":{"type":["string","null"]},"registeredBy":{"type":["string","null"]}},"required":["terminated","terminatedAt","destination","record","recordSha256","registeredBy"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Proveedores"],"summary":"Registrar el término","description":"Es un ACTO que se acredita, no una baja: no borra el proveedor, no borra el contrato y no borra la evidencia. Sólo escribe el hecho.","parameters":[{"schema":{"type":"string","example":"prc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterTermination"}}}},"responses":{"201":{"description":"Término registrado.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/event-types":{"get":{"tags":["Incidentes"],"summary":"Los hechos del art. 14 sexies","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["destruction","leak","loss","alteration","unauthorised_disclosure","unauthorised_access"]},"label":{"type":"string"}},"required":["type","label"]}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/reporting-objective":{"get":{"tags":["Incidentes"],"summary":"El objetivo interno de reporte","description":"La ley no fija horas: «sin dilaciones indebidas». El objetivo lo define la empresa, y cada cambio se apila con su vigencia y su nota. `current` es el vigente hoy; `null` si nunca se cargó.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"current":{"$ref":"#/components/schemas/ReportingObjective"},"history":{"type":"array","items":{"$ref":"#/components/schemas/ReportingObjective"}}},"required":["current","history"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["Incidentes"],"summary":"Apilar un objetivo de reporte","description":"No reemplaza: apila. El día que alguien pregunte por qué el objetivo bajó a 24 horas, la `note` es la única respuesta que va a existir.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetReportingObjective"}}}},"responses":{"201":{"description":"Apilado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingObjective"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents":{"get":{"tags":["Incidentes"],"summary":"Listar los expedientes","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["open","under_assessment","notified","not_notifiable","closed"]},"required":false,"name":"state","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Incidentes"],"summary":"Abrir un expediente","description":"Exige que exista un objetivo de reporte vigente: sin él no hay reloj contra el cual medir. El folio lo asigna la base.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteIncident"}}}},"responses":{"201":{"description":"Expediente abierto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Incident"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}":{"get":{"tags":["Incidentes"],"summary":"Ver un expediente","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Incident"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Incidentes"],"summary":"Editar un expediente","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteIncident"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Incident"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/state":{"patch":{"tags":["Incidentes"],"summary":"Cambiar el estado","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetIncidentState"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string","enum":["open","under_assessment","notified","not_notifiable","closed"]}},"required":["state"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/processing-activities":{"get":{"tags":["Incidentes"],"summary":"El alcance en el RAT","description":"Los tratamientos alcanzados, y lo que de ellos se deriva: categorías de datos, si hay sensibles del art. 2 g), si hay menores de 14. Es lo que decide a quién hay que avisar.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentScope"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Incidentes"],"summary":"Vincular un tratamiento al alcance","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkIncidentActivity"}}}},"responses":{"200":{"description":"Vinculado.","content":{"application/json":{"schema":{"type":"object","properties":{"linked":{"type":"boolean"}},"required":["linked"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/processing-activities/{activityId}":{"delete":{"tags":["Incidentes"],"summary":"Sacar un tratamiento del alcance","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"activityId","in":"path"}],"responses":{"200":{"description":"Desvinculado.","content":{"application/json":{"schema":{"type":"object","properties":{"linked":{"type":"boolean"}},"required":["linked"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/register":{"get":{"tags":["Incidentes"],"summary":"El registro del art. 14 sexies inc. 2","description":"Naturaleza, efectos, categorías, número APROXIMADO de titulares con su método, y medidas. `missing` dice qué falta. El número de titulares se completa de tres maneras y ninguna es una cifra suelta: una cifra sin método no completa.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentRegister"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["Incidentes"],"summary":"Guardar el registro del inc. 2","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteIncidentRegister"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentRegister"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/assessment":{"get":{"tags":["Incidentes"],"summary":"Los hechos que mira la Agencia, sin puntaje","description":"No hay severidad ni riesgo calculado: el «riesgo razonable» del inc. 1 no se computa. Se devuelven los factores del régimen sancionatorio con su artículo, y las causales tasadas del inc. 3 que obligan a avisar a los titulares. `economicObligations` lo declara quien pregunta: el RAT no lo sabe.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["true","false"],"default":"false"},"required":false,"name":"economicObligations","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentAssessment"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/decisions":{"get":{"tags":["Incidentes"],"summary":"Las decisiones tomadas","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IncidentDecision"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Incidentes"],"summary":"Registrar una decisión","description":"Decidir es un acto humano. `do_not_notify` exige una razón de fondo de al menos veinte caracteres: es lo que el art. 14 quinquies inc. final obliga a poder acreditar, y lo que el art. 34 quáter f) mira cuando pregunta si la omisión fue deliberada. La razón no puede identificar a nadie.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordIncidentDecision"}}}},"responses":{"201":{"description":"Registrada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentDecision"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/notifications":{"get":{"tags":["Incidentes"],"summary":"Las comunicaciones del expediente","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IncidentNotification"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Incidentes"],"summary":"Crear el borrador de una comunicación","description":"La API no manda nada: deja constancia. `public_notice` es la salida de segunda del inc. 3 —«a cada titular afectado y, si ello no fuere posible…»— y sin `channelJustification` se rechaza: dejar pasar el diario con el campo en blanco convierte la salida de segunda en la salida cómoda.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIncidentNotification"}}}},"responses":{"201":{"description":"Borrador creado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentNotification"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/notifications/{notificationId}/sent":{"post":{"tags":["Incidentes"],"summary":"Dejar constancia de que se envió","description":"Es el acto que detiene el reloj cuando el destinatario es la Agencia.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"ntf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"notificationId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkNotificationSent"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentNotification"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/notifications/{notificationId}/acknowledgement":{"post":{"tags":["Incidentes"],"summary":"Anotar el acuse de recibo","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"ntf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"notificationId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordAcknowledgement"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentNotification"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/seal":{"post":{"tags":["Incidentes"],"summary":"Sellar una versión del expediente","description":"Congela el expediente con su alcance —tratamientos, categorías y sistemas— y un sello recomputable. Sin cambios desde la última versión no sella otra vez.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"integer"},"hash":{"type":"string"}},"required":["version","hash"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"tags":["Incidentes"],"summary":"La última versión sellada","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK. `sealed` en `false` si nunca se selló.","content":{"application/json":{"schema":{"type":"object","properties":{"sealed":{"type":"boolean"},"version":{"type":["integer","null"]},"hash":{"type":["string","null"]},"sealedBy":{"type":["string","null"]},"sealedAt":{"type":["string","null"]},"affectedActivities":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."},"name":{"type":"string"}},"required":["id","name"]}}},"required":["sealed","version","hash","sealedBy","sealedAt","affectedActivities"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/notifications/{notificationId}/mass-notices":{"get":{"tags":["Incidentes"],"summary":"Los envíos del aviso a titulares hechos desde Datrus","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"ntf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"notificationId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IncidentMassNotice"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Incidentes"],"summary":"Enviar el aviso a cada titular desde Datrus","description":"Manda la nómina y Datrus despacha el aviso del art. 14 sexies inc. 3º correo por correo, nunca en copia. Lo que queda es la cantidad, el hash de la lista y, por persona, el correo cifrado con la llave de tu empresa hasta que se purga. Hasta 20.000 direcciones por envío; las que no tienen forma de correo vuelven en `rejected` con su posición.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"ntf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"notificationId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMassNotice"}}}},"responses":{"201":{"description":"Despachado.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/IncidentMassNotice"},{"type":"object","properties":{"rejected":{"type":"array","items":{"type":"object","properties":{"position":{"type":"integer"},"reason":{"type":"string"}},"required":["position","reason"]}},"duplicates":{"type":"integer"}},"required":["rejected","duplicates"]}]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/public-notices":{"get":{"tags":["Incidentes"],"summary":"Los avisos públicos del expediente","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IncidentPublicNotice"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/notifications/{notificationId}/public-notice":{"post":{"tags":["Incidentes"],"summary":"Publicar el aviso público con la marca de la empresa","description":"Sólo para una comunicación con `channel: public_notice` («si ello no fuere posible»). Publica los cuatro elementos tasados y el contacto en una página de Datrus con tu marca, sellada por hash.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"ntf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"notificationId","in":"path"}],"responses":{"201":{"description":"Publicado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentPublicNotice"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/incidents/{id}/public-notices/{publicNoticeId}":{"delete":{"tags":["Incidentes"],"summary":"Retirar un aviso público","description":"La página deja de servir; la fila queda con la fecha y quién lo retiró.","parameters":[{"schema":{"type":"string","example":"inc_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"pnt_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"publicNoticeId","in":"path"}],"responses":{"204":{"description":"Retirado."},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpias/triggers":{"get":{"tags":["EIPD"],"summary":"Los cuatro supuestos del art. 15 ter inc. 2","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"trigger":{"type":"string","enum":["a_automated_decisions","b_massive_or_large_scale","c_public_area_monitoring","d_sensitive_without_consent"]},"label":{"type":"string"},"text":{"type":"string"}},"required":["trigger","label","text"]}},"affectableRights":{"type":"array","items":{"type":"string"}}},"required":["data","affectableRights"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpias/template":{"get":{"tags":["EIPD"],"summary":"La plantilla de evaluación","description":"Las plantillas se apilan y nunca se editan: cuando la Agencia publique sus orientaciones se apila una con `agency_guidance`, y las evaluaciones ya selladas conservan la suya. `current` es `null` si nunca se cargó: no se cae a una por defecto invisible.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"current":{"$ref":"#/components/schemas/DpiaTemplate"},"history":{"type":"array","items":{"$ref":"#/components/schemas/DpiaTemplate"}}},"required":["current","history"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["EIPD"],"summary":"Apilar una plantilla","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetDpiaTemplate"}}}},"responses":{"201":{"description":"Apilada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DpiaTemplate"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpias":{"get":{"tags":["EIPD"],"summary":"Listar las evaluaciones","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["draft","under_assessment","approved","discarded"]},"required":false,"name":"state","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DpiaPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["EIPD"],"summary":"Abrir una evaluación","description":"Sobre uno o más tratamientos del RAT. El disparador del inc. 2 se deriva del registro y se CONGELA; la descripción de operaciones y la finalidad nacen del RAT. `significantLegalEffects` es lo único que el RAT no puede contestar: si lo omites, la letra a) queda sin declarar y la exigencia dirá `cannot_tell` cuando corresponda.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenDpia"}}}},"responses":{"201":{"description":"Abierta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dpia"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpias/{id}":{"get":{"tags":["EIPD"],"summary":"Ver una evaluación","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dpia"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["EIPD"],"summary":"Editar el contenido y la decisión del inc. 1","description":"Las cinco piezas del inc. 3 y la decisión del inc. 1 con su razón. La razón es obligatoria en las dos salidas: la positiva también hay que poder fecharla, porque es lo que prueba que la evaluación fue previa. Una evaluación aprobada no se edita.","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditDpia"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dpia"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpias/{id}/trigger":{"post":{"tags":["EIPD"],"summary":"Recalcular el disparador desde el RAT","description":"Vuelve a leer los tratamientos y congela el resultado de nuevo. El adjetivo «significativos» de la letra a) lo contesta una persona.","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecomputeDpiaTrigger"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dpia"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpias/{id}/risks":{"get":{"tags":["EIPD"],"summary":"Los riesgos identificados","description":"Sin puntaje: `summary` cuenta por residual, y `highResidual` mira SÓLO el residual. Un riesgo muy probable y muy grave que la persona declaró aceptado no enciende nada.","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DpiaRisk"}},"highResidual":{"type":"boolean"},"summary":{"type":"object","properties":{"accepted":{"type":"integer"},"reduced":{"type":"integer"},"high":{"type":"integer"}},"required":["accepted","reduced","high"]}},"required":["data","highResidual","summary"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["EIPD"],"summary":"Agregar un riesgo","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteDpiaRisk"}}}},"responses":{"201":{"description":"Agregado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DpiaRisk"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpias/{id}/risks/{riskId}":{"patch":{"tags":["EIPD"],"summary":"Editar un riesgo","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"riskId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteDpiaRisk"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DpiaRisk"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"tags":["EIPD"],"summary":"Quitar un riesgo","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"riskId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpias/{id}/consultation":{"get":{"tags":["EIPD"],"summary":"Las decisiones sobre consultar a la Agencia","description":"Art. 15 ter inc. final: consultar es una FACULTAD para obtener recomendaciones, no una autorización que esperar. Se apilan las dos decisiones con su razón; la que habrá que defender es la de no consultar.","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DpiaConsultationDecision"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["EIPD"],"summary":"Registrar la decisión de consultar o no","description":"Se apila, nunca se edita. Congela si en ese momento había riesgo residual alto: si mañana alguien baja el residual, la decisión de ayer se sigue explicando con lo que se sabía ayer.","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordDpiaConsultation"}}}},"responses":{"201":{"description":"Registrada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DpiaConsultationDecision"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dpias/{id}/approve":{"post":{"tags":["EIPD"],"summary":"Aprobar y sellar","description":"La única regla dura del módulo: no se aprueba una evaluación incompleta. No bloquea el RAT ni el tratamiento; bloquea el acto de declarar aprobado lo que después se exhibe ante la Agencia. Aprobar sella una versión.","parameters":[{"schema":{"type":"string","example":"dpa_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"integer"},"hash":{"type":"string"},"dpia":{"$ref":"#/components/schemas/Dpia"}},"required":["version","hash","dpia"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risk-matrix":{"get":{"tags":["EIPD"],"summary":"La matriz de riesgo de la organización","description":"Escala, etiquetas, umbrales y pesos vigentes. `version` 0 significa que todavía rige la matriz de referencia de Datrus (4×4, umbrales 4/8/12) sin que la organización haya sellado la suya.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskMatrix"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["EIPD"],"summary":"Sellar una versión de la matriz","description":"Guardar es versionar: queda una versión sellada con su sha256 y la nota. Las evaluaciones ya selladas conservan la versión con que se calcularon.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRiskMatrix"}}}},"responses":{"201":{"description":"Sellada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskMatrix"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risk-matrix/rules":{"get":{"tags":["EIPD"],"summary":"Las reglas de sugerencia","description":"Las claves que aceptan `weights` en `PUT /risk-matrix`. Cada regla suma a un eje cuando el registro declara lo que la activa; su frase y su artículo salen en `factors` de cada evaluación.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risk-assessments":{"get":{"tags":["EIPD"],"summary":"El mapa de riesgo","description":"Una fila por tratamiento vigente. En los `not_assessed`, `impact` y `likelihood` son la sugerencia de Datrus, no una decisión; sólo lo sellado vale como evaluación.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["not_assessed","draft","sealed","outdated"]},"required":false,"name":"state","in":"query"},{"schema":{"type":"string","enum":["low","moderate","high","critical"]},"required":false,"name":"level","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskMapPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["EIPD"],"summary":"Evaluar un tratamiento","description":"Crea o actualiza el borrador de la evaluación del tratamiento. Omite `impact` y `likelihood` para aceptar la sugerencia; si cambias uno, `reason` es obligatoria. `significantLegalEffects` sólo importa si el tratamiento toma decisiones automatizadas. Una evaluación sellada vuelve a borrador hasta el próximo sello.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssessRisk"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAssessment"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risk-assessments/export":{"get":{"tags":["EIPD"],"summary":"Exportar para el modelo de prevención (CSV)","description":"La lista de actividades con su riesgo para la letra d) del art. 49: una fila por tratamiento vigente, con nivel, recomendación, factores, razón y el sello de cada evaluación. Separador `;`.","responses":{"200":{"description":"CSV con BOM, separado por `;`.","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risk-assessments/{id}":{"get":{"tags":["EIPD"],"summary":"Ver una evaluación de riesgo","parameters":[{"schema":{"type":"string","example":"rsk_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAssessment"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/risk-assessments/{id}/seal":{"post":{"tags":["EIPD"],"summary":"Sellar la evaluación","description":"Escribe la versión append-only con su sha256 y deja el evento en la bitácora. Se verifica en la página pública con la foto sellada.","parameters":[{"schema":{"type":"string","example":"rsk_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Sellada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAssessment"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/roster":{"get":{"tags":["Capacitación"],"summary":"El padrón activo","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string"},"required":false,"name":"area","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RosterPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Capacitación"],"summary":"Agregar una persona al padrón","description":"Sólo lo que hace falta para convocar y acreditar: nombre, correo, área, cargo y vínculo. Nada más entra, a propósito.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddRosterPerson"}}}},"responses":{"201":{"description":"Agregada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RosterPerson"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/roster/{id}":{"get":{"tags":["Capacitación"],"summary":"Ver una persona del padrón","parameters":[{"schema":{"type":"string","example":"ppl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RosterPerson"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/roster/{id}/archive":{"post":{"tags":["Capacitación"],"summary":"Archivar a una persona","description":"Nunca se borra: sus acuses son evidencia y la citan.","parameters":[{"schema":{"type":"string","example":"ppl_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"archived":{"type":"boolean"}},"required":["archived"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/contents":{"get":{"tags":["Capacitación"],"summary":"Los contenidos de capacitación","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TrainingContent"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Capacitación"],"summary":"Crear un contenido","description":"Nace sin versión: el texto se sella aparte, y sólo lo sellado se difunde.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTrainingContent"}}}},"responses":{"201":{"description":"Creado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingContent"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/contents/{id}":{"get":{"tags":["Capacitación"],"summary":"Ver un contenido","parameters":[{"schema":{"type":"string","example":"tcn_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingContent"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/contents/{id}/versions":{"get":{"tags":["Capacitación"],"summary":"Las versiones selladas","parameters":[{"schema":{"type":"string","example":"tcn_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TrainingContentVersion"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Capacitación"],"summary":"Sellar una versión del texto","description":"El sello es lo que prueba qué recibió la gente. Una versión sellada no se edita ni se borra.","parameters":[{"schema":{"type":"string","example":"tcn_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SealTrainingVersion"}}}},"responses":{"201":{"description":"Sellada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingContentVersion"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/campaigns":{"get":{"tags":["Capacitación"],"summary":"Las difusiones","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["draft","open","closed"]},"required":false,"name":"state","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingCampaignPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Capacitación"],"summary":"Crear una difusión","description":"Lleva o una versión sellada de contenido propio o una publicación de un documento de privacidad: exactamente una. Nace en borrador; el conjunto convocado se congela al abrirla.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTrainingCampaign"}}}},"responses":{"201":{"description":"Creada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingCampaign"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/campaigns/{id}":{"get":{"tags":["Capacitación"],"summary":"Ver una difusión","parameters":[{"schema":{"type":"string","example":"tdf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingCampaign"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/campaigns/{id}/open":{"post":{"tags":["Capacitación"],"summary":"Abrir: congela el conjunto convocado","description":"Copia quién estaba en el padrón activo en ese instante, opcionalmente de un área. Ése es el denominador de la cobertura y no se recalcula. Con el padrón vacío no se abre: no mediría nada.","parameters":[{"schema":{"type":"string","example":"tdf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenTrainingCampaign"}}}},"responses":{"200":{"description":"Abierta.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingCampaign"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/campaigns/{id}/close":{"post":{"tags":["Capacitación"],"summary":"Cerrar una difusión","parameters":[{"schema":{"type":"string","example":"tdf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Cerrada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingCampaign"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/campaigns/{id}/attendees":{"get":{"tags":["Capacitación"],"summary":"El conjunto convocado","description":"Tal como quedó congelado al abrir, con el código de acuse de cada persona.","parameters":[{"schema":{"type":"string","example":"tdf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"personId":{"type":"string","example":"ppl_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un roster person, siempre con el prefijo `ppl_`."},"name":{"type":"string"},"email":{"type":"string"},"area":{"type":"string"},"employment":{"type":"string"},"acknowledgementCode":{"type":"string"},"convenedAt":{"type":"string"}},"required":["personId","name","email","area","employment","acknowledgementCode","convenedAt"]}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/campaigns/{id}/coverage":{"get":{"tags":["Capacitación"],"summary":"La cobertura","description":"Contra el conjunto congelado. Una persona cuenta una vez y se queda con el acuse propio, que prueba más. Un acuse de fuera del conjunto se cuenta aparte y no sube el porcentaje. Cero convocados es «sin datos», no 0 %.","parameters":[{"schema":{"type":"string","example":"tdf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":false,"name":"area","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingCoverage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/training/campaigns/{id}/acknowledgements":{"get":{"tags":["Capacitación"],"summary":"Los acuses","description":"Dos tipos, y prueban cosas distintas. `self`: La persona entró por su propio enlace y confirmó haber recibido el contenido. El acto es suyo y queda con su instante. `third_party_record`: Alguien de la organización cargó la asistencia —una lista de un taller presencial, por ejemplo—. Vale como constancia, y dice quién la cargó: sobre la persona hay un testimonio, no un acto propio.","parameters":[{"schema":{"type":"string","example":"tdf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TrainingAcknowledgement"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Capacitación"],"summary":"Registrar un acuse","description":"Sólo de una persona del conjunto convocado. Un `third_party_record` exige `registeredBy`: sobre la persona hay un testimonio, y el testimonio necesita autor. El acuse lleva un sello recomputable y no se borra.","parameters":[{"schema":{"type":"string","example":"tdf_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordTrainingAcknowledgement"}}}},"responses":{"201":{"description":"Registrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingAcknowledgement"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/reports/pieces":{"get":{"tags":["Reportes"],"summary":"El catálogo de piezas","description":"Las dieciocho piezas que un corte cuenta, con el denominador declarado de cada una y qué hacer si falta. `legend` y `sealScope` son el texto que viaja dentro de cada corte sellado.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ReportPieceDefinition"}},"legend":{"type":"array","items":{"type":"string"}},"sealScope":{"type":"string"}},"required":["data","legend","sealScope"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/reports/preview":{"get":{"tags":["Reportes"],"summary":"Leer las piezas sin sellar nada","description":"Lo que un corte diría hoy para ese período, pieza por pieza. No escribe: es la revisión antes de emitir.","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-01-01"},"required":true,"name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-06-30"},"required":true,"name":"to","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"registered":{"type":"integer"},"applicable":{"type":"integer"},"pieces":{"type":"array","items":{"$ref":"#/components/schemas/ReportPieceReading"}}},"required":["registered","applicable","pieces"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/reports":{"get":{"tags":["Reportes"],"summary":"Los cortes","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Report"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Reportes"],"summary":"Emitir un corte: leer todo y sellar","description":"Lee cada módulo para el período, guarda las piezas PRIMERO y sella. Un período tiene un solo corte. Puede tardar: consulta todos los módulos.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueReport"}}}},"responses":{"201":{"description":"Sellado.","content":{"application/json":{"schema":{"type":"object","properties":{"report":{"$ref":"#/components/schemas/Report"},"hash":{"type":"string"}},"required":["report","hash"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/reports/{id}":{"get":{"tags":["Reportes"],"summary":"Ver un corte","parameters":[{"schema":{"type":"string","example":"rpt_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/reports/{id}/pieces":{"get":{"tags":["Reportes"],"summary":"Las piezas del corte","description":"Tal como se leyeron al emitir: son las filas que sostienen el índice.","parameters":[{"schema":{"type":"string","example":"rpt_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ReportPieceReading"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/reports/{id}/content":{"get":{"tags":["Reportes"],"summary":"El contenido sellado y su sello","description":"La foto tal como se selló, con el hash que un tercero recomputa sin nuestro código. `sealed` en `false` si es un borrador.","parameters":[{"schema":{"type":"string","example":"rpt_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"sealed":{"type":"boolean"},"version":{"type":["integer","null"]},"hash":{"type":["string","null"]},"sealedAt":{"type":["string","null"]},"content":{"type":["object","null"],"additionalProperties":{}}},"required":["sealed","version","hash","sealedAt","content"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/reports/{id}/void":{"post":{"tags":["Reportes"],"summary":"Anular un corte con reemplazo","description":"Sólo lo sellado se anula, siempre con un reemplazo y un motivo, y los dos cortes quedan. Anular no borra: deja constancia de que hubo uno mejor.","parameters":[{"schema":{"type":"string","example":"rpt_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoidReport"}}}},"responses":{"200":{"description":"Anulado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/connectors/types":{"get":{"tags":["Conectores"],"summary":"El catálogo de tipos de conector","description":"Con su familia, si está disponible, qué lee y qué permisos pide. `esquema_subido` es el camino sin credencial.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"family":{"type":"string","enum":["file","cloud","database","saas","internal"]},"availability":{"type":"string","enum":["available","in_progress","planned"]},"summary":{"type":"string"},"reads":{"type":"array","items":{"type":"string"}},"requirements":{"type":"array","items":{"type":"string"}}},"required":["type","name","family","availability","summary","reads","requirements"]}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/connectors":{"get":{"tags":["Conectores"],"summary":"Los conectores","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Connector"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Conectores"],"summary":"Crear un conector","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteConnector"}}}},"responses":{"201":{"description":"Creado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Connector"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/connectors/{id}":{"get":{"tags":["Conectores"],"summary":"Ver un conector","parameters":[{"schema":{"type":"string","example":"cnx_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Connector"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Conectores"],"summary":"Editar un conector","parameters":[{"schema":{"type":"string","example":"cnx_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConnector"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Connector"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"tags":["Conectores"],"summary":"Borrar un conector","description":"Se lleva sus propuestas PENDIENTES —preguntas sin contestar sobre un escaneo que ya no está—. Las decididas sobreviven: son la respuesta de una persona y pertenecen a la empresa.","parameters":[{"schema":{"type":"string","example":"cnx_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/connectors/{id}/run":{"post":{"tags":["Conectores"],"summary":"Correr el descubrimiento","description":"Lee la estructura, clasifica los campos y deja propuestas. Nunca lee una fila. Si la fuente trae valores, se rechaza entera.","parameters":[{"schema":{"type":"string","example":"cnx_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","example":"run_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un connector run, siempre con el prefijo `run_`."},"number":{"type":"integer"},"partial":{"type":"boolean"},"findings":{"type":"integer"},"proposals":{"type":"integer"},"tasks":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["runId","number","partial","findings","proposals","tasks","warnings"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/connectors/{id}/runs":{"get":{"tags":["Conectores"],"summary":"Las corridas","parameters":[{"schema":{"type":"string","example":"cnx_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConnectorRun"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/connectors/{id}/runs/{runId}/findings":{"get":{"tags":["Conectores"],"summary":"Los hallazgos de una corrida","description":"Campo por campo: qué se clasificó, con qué confianza y si ya se había visto. Nombres y tipos; nunca un valor.","parameters":[{"schema":{"type":"string","example":"cnx_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"run_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"runId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConnectorFinding"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/connectors/{id}/proposals":{"get":{"tags":["Conectores"],"summary":"Las propuestas de tratamiento","description":"De todas las corridas del conector. Una propuesta es una pregunta: se acepta con una finalidad declarada, o se descarta.","parameters":[{"schema":{"type":"string","example":"cnx_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["pending","accepted","discarded"]},"required":false,"name":"state","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/InventoryProposal"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/proposals/{id}/accept":{"post":{"tags":["Conectores"],"summary":"Aceptar una propuesta: crea el tratamiento en borrador","description":"La finalidad la declara la persona: nunca se infiere de la estructura. El tratamiento nace en borrador, para que el inventario lo revise como a cualquier otro.","parameters":[{"schema":{"type":"string","example":"prp_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptProposal"}}}},"responses":{"201":{"description":"Tratamiento creado en borrador.","content":{"application/json":{"schema":{"type":"object","properties":{"activityId":{"type":"string","example":"pa_0104f9ae5df240be8a3a57c1d2e3f4a5","description":"El identificador de un processing activity, siempre con el prefijo `pa_`."}},"required":["activityId"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/proposals/{id}/discard":{"post":{"tags":["Conectores"],"summary":"Descartar una propuesta","parameters":[{"schema":{"type":"string","example":"prp_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"discarded":{"type":"boolean"}},"required":["discarded"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/integrations/pieces":{"get":{"tags":["Integrables"],"summary":"El catálogo de piezas integrables","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/EmbeddablePiece"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/integrations/snippet":{"post":{"tags":["Integrables"],"summary":"El fragmento de una línea para tu sitio","description":"Compone el `<script>` con las mismas opciones y la misma función que la consola: el resultado es idéntico byte a byte. `token` es el token público de la pieza, que ya tienes (por ejemplo, el de un formulario en `/consent-forms`). Sólo tres piezas se entregan por script.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildSnippet"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"html":{"type":"string"},"options":{"type":"object","additionalProperties":{}}},"required":["html","options"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/audit-log":{"get":{"tags":["Bitácora"],"summary":"La bitácora encadenada","description":"Del más nuevo al más viejo. Es también el flujo de eventos de todos los módulos: filtra por `type` o por `entity`.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string"},"required":false,"name":"type","in":"query"},{"schema":{"type":"string"},"required":false,"name":"entity","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":500},"required":false,"name":"window","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/AuditEventPage"},{"type":"object","properties":{"total":{"type":"integer"}},"required":["total"]}]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/audit-log/verify":{"get":{"tags":["Bitácora"],"summary":"Recomputar la cadena","description":"Verifica la ventana de los últimos eventos con la misma regla que la pantalla de Evidencia. `partial` dice si la ventana no llega al primer evento de la empresa.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditChainVerdict"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/webhooks/events":{"get":{"tags":["Webhooks"],"summary":"Los eventos que se pueden suscribir","description":"Los seis eventos de consentimiento y los seis de derechos. Cada entrega va firmada en `X-Datrus-Firma` con HMAC del secreto sobre la marca de tiempo y el cuerpo tal cual, con 300 s de tolerancia; se reintenta 8 veces con esperas de 60, 300, 900, 3600, 21600, 43200, 86400 segundos.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"event":{"type":"string"},"label":{"type":"string"}},"required":["event","label"]}},"signatureHeader":{"type":"string"},"maxAttempts":{"type":"integer"},"backoffSeconds":{"type":"array","items":{"type":"integer"}}},"required":["data","signatureHeader","maxAttempts","backoffSeconds"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"Los destinos","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Webhooks"],"summary":"Crear un destino","description":"Devuelve el secreto UNA sola vez. Guárdalo: después sólo verás su pista.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteWebhook"}}}},"responses":{"201":{"description":"Creado.","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"},"secret":{"type":"string"}},"required":["webhook","secret"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/webhooks/{id}":{"patch":{"tags":["Webhooks"],"summary":"Editar un destino o pausarlo","parameters":[{"schema":{"type":"string","example":"whk_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhook"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/webhooks/{id}/rotate-secret":{"post":{"tags":["Webhooks"],"summary":"Rotar el secreto","description":"El nuevo secreto se entrega una sola vez. Las entregas pendientes se firman con el nuevo.","parameters":[{"schema":{"type":"string","example":"whk_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"secret":{"type":"string"},"rotatedAt":{"type":"string"}},"required":["secret","rotatedAt"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"Las entregas de un destino","parameters":[{"schema":{"type":"string","example":"whk_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/webhooks/{id}/deliveries/{deliveryId}/resend":{"post":{"tags":["Webhooks"],"summary":"Reenviar una entrega","description":"El mismo aviso, otra vez, como una entrega nueva: para cuando tu receptor lo perdió (un despliegue a mitad de una entrega, una cola vaciada del otro lado). La entrega original no se toca; su historia de intentos es evidencia. La nueva sale en el acto con el mismo cuerpo —incluido el `id` del aviso, para que un receptor que deduplica por id lo reconozca— y firmada con el secreto vigente.","parameters":[{"schema":{"type":"string","example":"whk_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","example":"dlv_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"deliveryId","in":"path"}],"responses":{"201":{"description":"Encolada y despachada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDelivery"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/webhooks/dispatch":{"post":{"tags":["Webhooks"],"summary":"Despachar las entregas pendientes","description":"Manda lo que esté pendiente y cuyo próximo intento ya venció, con firma y reintentos. Existe como acción explícita porque hoy ningún planificador la corre sola; cuando lo haga, esta ruta seguirá sirviendo para forzar un despacho.","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchWebhooks"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"attempted":{"type":"integer"},"delivered":{"type":"integer"},"failed":{"type":"integer"},"exhausted":{"type":"integer"},"missingKey":{"type":"boolean"}},"required":["attempted","delivered","failed","exhausted","missingKey"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/exports/register-snapshots/{number}":{"get":{"tags":["Exportaciones"],"summary":"Un corte sellado del RAT, como archivo","description":"CSV, JSON o PDF. Confronta el sello antes de entregar: un corte cuyo contenido ya no cuadra con su hash raíz no se exporta como evidencia, y el 409 lo dice.","parameters":[{"schema":{"type":"integer","minimum":1},"required":true,"name":"number","in":"path"},{"schema":{"type":"string","enum":["csv","json","pdf"],"default":"csv"},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"El archivo.","content":{"text/csv":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"object","additionalProperties":{}}},"application/pdf":{"schema":{"type":"string"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/exports/data-subject-requests/{id}":{"get":{"tags":["Exportaciones"],"summary":"El expediente de una solicitud de derechos","description":"PDF o JSON, confrontado contra la bitácora antes de entregar.","parameters":[{"schema":{"type":"string","example":"dsr_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["pdf","json"],"default":"json"},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"El archivo.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}},"application/pdf":{"schema":{"type":"string"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/exports/incidents.csv":{"get":{"tags":["Exportaciones"],"summary":"El registro de incidentes del art. 14 sexies inc. 2, en CSV","responses":{"200":{"description":"El archivo.","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/dashboard":{"get":{"tags":["Panel"],"summary":"El Panel: avance por área, alertas y siguientes pasos","description":"Lo mismo que ve la consola, con la misma fuente. Cada área dice de dónde salió su número: del módulo, de sus tareas mientras el módulo esté vacío, o de nada.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dashboard"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/plan/usage":{"get":{"tags":["Plan"],"summary":"Los cupos del plan y el consumo del mes","description":"Cada cupo con su uso, su tope y su nivel: `ok` bajo 80 %, `warning` desde 80 %, `cap` al 100 %. `pct` puede pasar de 100.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanUsage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/tasks":{"get":{"tags":["Tareas"],"summary":"El plan de trabajo","description":"Las tareas del programa, con su fase. Los plazos son de gestión: el reloj legal vive en Derechos.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["pending","in_progress","done"]},"required":false,"name":"state","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":6},"required":false,"name":"phase","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Tareas"],"summary":"Agregar una tarea","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTask"}}}},"responses":{"201":{"description":"Tarea creada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/tasks/{id}":{"patch":{"tags":["Tareas"],"summary":"Cambiar el estado de una tarea","parameters":[{"schema":{"type":"string","example":"tsk_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTask"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-forms":{"get":{"tags":["Consentimiento"],"summary":"Listar los formularios alojados","description":"Con su token público y los alcances que ofrecen: es de acá de donde sacas lo que necesitas para registrar un consentimiento por API.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","example":"eyJvZmZzZXQiOjUwfQ"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","enum":["draft","published","closed"]},"required":false,"name":"state","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentFormPage"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Consentimiento"],"summary":"Crear un formulario alojado","description":"Nace en borrador, sin token: el enlace público se emite al publicar. Los tres campos legales pueden quedar pendientes mientras es borrador.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConsentForm"}}}},"responses":{"201":{"description":"Formulario creado, en borrador.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentForm"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-forms/{id}":{"get":{"tags":["Consentimiento"],"summary":"Ver un formulario","parameters":[{"schema":{"type":"string","example":"frm_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentForm"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"tags":["Consentimiento"],"summary":"Editar un formulario y publicar una versión del esquema","description":"La versión sellada anterior se queda: la pantalla que una persona leyó es evidencia y no se reescribe.","parameters":[{"schema":{"type":"string","example":"frm_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditConsentForm"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentForm"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-forms/{id}/versions":{"get":{"tags":["Consentimiento"],"summary":"Las versiones selladas del esquema","parameters":[{"schema":{"type":"string","example":"frm_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentFormVersion"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-forms/{id}/publish":{"post":{"tags":["Consentimiento"],"summary":"Publicar el formulario","description":"Emite el token público y deja la página en línea. Exige los tres campos que la ley pide junto al «sí»: dónde está la política, a quién se le reclama y cuánto duran los datos.","parameters":[{"schema":{"type":"string","example":"frm_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Publicado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentForm"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-forms/{id}/close":{"post":{"tags":["Consentimiento"],"summary":"Cerrar el formulario","description":"El enlace deja de recibir. Lo ya registrado por él no se toca: sigue siendo evidencia válida.","parameters":[{"schema":{"type":"string","example":"frm_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Cerrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentForm"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consent-forms/{id}/entries":{"get":{"tags":["Consentimiento"],"summary":"Quiénes pasaron por el formulario","description":"Cada apertura con en qué quedó. Nunca el identificador en claro: esta tabla no lo guarda, sólo su pista.","parameters":[{"schema":{"type":"string","example":"frm_0104f9ae5df240be8a3a57c1d2e3f4a5"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["started","completed","discarded","expired"]},"required":false,"name":"state","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConsentFormEntry"}}},"required":["data"]}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/consents":{"post":{"tags":["Consentimiento"],"summary":"Registrar un consentimiento o un retiro (registro directo)","description":"Registra lo que una persona decidió, desde tus propios sistemas, contra un formulario publicado. Pasa por el mismo motor y deja la misma evidencia sellada que el formulario alojado; lo que cambia es que la evidencia deja constancia de que la captura la hizo el responsable. Manda un `Idempotency-Key`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConsent"}}}},"responses":{"201":{"description":"Registrado, con su evidencia sellada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentCreated"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subjects/lookup":{"post":{"tags":["Titulares"],"summary":"Consultar qué autorizó una persona","description":"Todo lo que esa persona tiene autorizado hoy con tu empresa, alcance por alcance. Va por POST y no por GET a propósito: así el identificador viaja en el cuerpo y no queda escrito en ningún registro de URL. Se normaliza, se convierte en huella y se descarta; la respuesta no lo repite.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectIdentifier"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectCompliance"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/privacy-center/sessions":{"post":{"tags":["Centro de privacidad"],"summary":"Abrir el centro de privacidad de una persona conocida","description":"El modo autenticado del centro de privacidad: tu aplicación ya sabe quién es la persona, pide el enlace y lo abre, sin que ella tenga que solicitarlo. El acceso vence como cualquier enlace del portal y queda registrado con actor `api`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectIdentifier"}}}},"responses":{"201":{"description":"Acceso emitido: abre la `url` en el navegador de la persona.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacyCenterSession"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subjects/summary":{"put":{"tags":["Titulares"],"summary":"Declarar lo que tienes asociado a un identificador","description":"What your company holds for one identifier — categories, descriptions, systems, since when — so the person sees it when she enters the rights portal with that identifier, and so an access request \"about this identifier\" can be answered automatically (setting in ARCO rights › Settings). The identifier is normalised, fingerprinted and discarded; the summary is stored against the fingerprint. PUT replaces the whole summary for that identifier. Nothing here links one identifier to another.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectSummaryInput"}}}},"responses":{"200":{"description":"Stored (created or replaced).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectSummaryStored"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"tags":["Titulares"],"summary":"Retirar el resumen declarado para un identificador","description":"Removes the summary for that identifier. The person stops seeing it in the portal; access requests go back to the normal process. The identifier travels in the body.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalIdentifier"}}}},"responses":{"204":{"description":"Removed (or there was nothing to remove)."},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/data-subjects/summary/lookup":{"post":{"tags":["Titulares"],"summary":"Leer el resumen declarado para un identificador","description":"Reads back what you declared for that identifier. POST and not GET so the identifier travels in the body and never lands in a URL log.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalIdentifier"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectSummary"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/rights-portal/sessions":{"post":{"tags":["Derechos"],"summary":"Abrir el portal de derechos para una persona conocida","description":"The authenticated mode of the rights portal: your app already verified the person, so it opens her portal session for that identifier with the level you declare, and she does not have to request a code. The portal must be turned on (ARCO rights › Settings). The session lasts what the company configured and is recorded with provider `api:<key>`; requests opened from it inherit that level in their case file.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsPortalSessionInput"}}}},"responses":{"201":{"description":"Session opened: send the person to `url`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsPortalSession"}}}},"400":{"description":"Error de validación: uno o más campos no pasan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Falta la llave de API, o está revocada o vencida.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Falta el permiso, el módulo está apagado para tu empresa, o es una escritura con una llave de prueba.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No existe. También cuando el recurso es de otra empresa: nunca se responde 403, para no confirmar que existe.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Choca con el estado actual del recurso.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Reusaste un `Idempotency-Key` con un cuerpo distinto.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Te pasaste del límite de peticiones por minuto de la llave.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"webhooks":{}}