{"openapi":"3.0.3","info":{"title":"NomiCheck — verifiable Colombian payroll engine","version":"1.0.0","description":"Colombian labor law as a dated, verifiable catalog — plus the engine that applies it.\n\n**The catalog is the substrate.** Any statutory parameter resolvable at any date since 2020 — minimum wage, transport allowance, UVT, surcharges, workday divisor, caps — each with the norm that set it and the window in which it applied. The numbers are public; the dated, sourced, maintained and signed history is not.\n\nOn top of it, five deterministic calculations: every line cites its norm, every response carries the hash of the catalog that produced it and ships Ed25519-signed.\n\n**Stateless.** JSON in, JSON out: the input is processed in memory and discarded, never written to a database (Colombian Law 1581 of 2012, habeas data).\n\nLegal catalog verified as of 2026-07-30. The human spec of every rule lives in the repository's `sdd/vault/`, and the map of which file backs each line is in `07_Trazabilidad_Codigo.md`.","contact":{"name":"Ynt-labs","url":"https://ynt.codes","email":"ynt.val@gmail.com"},"license":{"name":"Proprietary — use permitted under the listing terms"}},"servers":[{"url":"https://nomicheck.ynt.codes/api/batch"}],"components":{"schemas":{"BatchLiquidarInput":{"type":"object","properties":{"version":{"type":"string","enum":["1"]},"pais":{"type":"string","enum":["CO"],"default":"CO"},"locale":{"type":"string","enum":["es","en"],"default":"es"},"buyer":{"type":"object","properties":{"executorId":{"type":"string","minLength":1},"wallet":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"noExternalLlm":{"type":"boolean","default":true}},"additionalProperties":false},"empresa":{"type":"object","properties":{"nombre":{"type":"string","minLength":1},"nit":{"type":"string","minLength":1},"sector":{"type":"string","minLength":1}},"required":["nombre","nit","sector"],"additionalProperties":false},"periodo":{"type":"object","properties":{"fechaInicio":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"fechaFin":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["fechaInicio","fechaFin"],"additionalProperties":false},"empleados":{"type":"array","items":{"type":"object","properties":{"externalId":{"type":"string","minLength":1},"nombre":{"type":"string","minLength":1},"documento":{"type":"string","minLength":1},"salarioBase":{"type":"number","exclusiveMinimum":true,"minimum":0},"tipoNomina":{"type":"string","enum":["turnos","fijo"]},"tipoContrato":{"type":"string","enum":["indefinido","fijo","obra_labor","tiempo_parcial","aprendizaje_sena_lectiva","aprendizaje_sena_practica"],"default":"indefinido"},"auxilioTransporte":{"type":"boolean","default":false},"fechaIngreso":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"claseRiesgoArl":{"type":"integer","minimum":1,"maximum":5,"default":1}},"required":["externalId","nombre","documento","salarioBase","tipoNomina"],"additionalProperties":false},"maxItems":500,"default":[]},"contratistas":{"type":"array","items":{"type":"object","properties":{"externalId":{"type":"string","minLength":1},"nombre":{"type":"string","minLength":1},"documento":{"type":"string","minLength":1},"honorariosMensuales":{"type":"number","exclusiveMinimum":true,"minimum":0},"walletAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"}},"required":["externalId","nombre","documento","honorariosMensuales"],"additionalProperties":false},"maxItems":500,"default":[]},"turnos":{"type":"array","items":{"type":"object","properties":{"empleadoExternalId":{"type":"string","minLength":1},"fecha":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"horaInicio":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"horaFin":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["empleadoExternalId","fecha","horaInicio","horaFin"],"additionalProperties":false},"maxItems":20000,"default":[]}},"required":["version","buyer","empresa","periodo"],"additionalProperties":false},"BatchRetencionInput":{"type":"object","properties":{"version":{"type":"string","enum":["1"]},"buyer":{"type":"object","properties":{"executorId":{"type":"string","minLength":1},"wallet":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"noExternalLlm":{"type":"boolean","default":true}},"additionalProperties":false},"personas":{"type":"array","items":{"type":"object","properties":{"externalId":{"type":"string","minLength":1},"ingresoLaboralMensual":{"type":"number","exclusiveMinimum":true,"minimum":0},"declaraRenta":{"type":"boolean","default":false},"aportesVoluntariosAfc":{"type":"number","minimum":0},"aportesVoluntariosPensionObligatoria":{"type":"number","minimum":0},"tieneDependientes":{"type":"boolean","default":false},"medicinaPrepagadaMensual":{"type":"number","minimum":0}},"required":["externalId","ingresoLaboralMensual"],"additionalProperties":false},"minItems":1,"maxItems":500}},"required":["version","buyer","personas"],"additionalProperties":false},"BatchVerificacionInput":{"type":"object","properties":{"version":{"type":"string","enum":["1"]},"buyer":{"type":"object","properties":{"executorId":{"type":"string","minLength":1},"wallet":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"noExternalLlm":{"type":"boolean","default":true}},"additionalProperties":false},"comprobantes":{"type":"array","items":{"type":"object","properties":{"externalId":{"type":"string","minLength":1},"salarioBasicoMensual":{"type":"number","exclusiveMinimum":true,"minimum":0},"recibeAuxilioTransporte":{"type":"boolean","default":false},"periodoDesde":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"periodoHasta":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"tipoContrato":{"type":"string","enum":["indefinido","fijo","obra_labor","tiempo_parcial","aprendizaje_sena_lectiva","aprendizaje_sena_practica"]},"declarado":{"type":"array","items":{"type":"object","properties":{"nombre":{"type":"string","minLength":1},"valor":{"type":"number"}},"required":["nombre","valor"],"additionalProperties":false},"minItems":1,"maxItems":50}},"required":["externalId","salarioBasicoMensual","periodoDesde","periodoHasta","declarado"],"additionalProperties":false},"minItems":1,"maxItems":500}},"required":["version","buyer","comprobantes"],"additionalProperties":false},"BatchLiquidacionFinalInput":{"type":"object","properties":{"version":{"type":"string","enum":["1"]},"buyer":{"type":"object","properties":{"executorId":{"type":"string","minLength":1},"wallet":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"noExternalLlm":{"type":"boolean","default":true}},"additionalProperties":false},"empresa":{"type":"object","properties":{"nombre":{"type":"string","minLength":1},"nit":{"type":"string","minLength":1},"sector":{"type":"string","minLength":1}},"required":["nombre","nit"],"additionalProperties":false},"empleados":{"type":"array","items":{"type":"object","properties":{"externalId":{"type":"string","minLength":1},"nombre":{"type":"string","minLength":1},"documento":{"type":"string","minLength":1},"salarioBase":{"type":"number","exclusiveMinimum":true,"minimum":0},"auxilioTransporte":{"type":"boolean","default":false,"description":"Se manda el DERECHO, no el monto: si es true, el servidor resuelve el valor que estaba vigente en la fecha de retiro contra el catálogo firmado. Una liquidación retroactiva de 2024 usa el auxilio de 2024. No enviar cifras propias acá — el número que sale queda cubierto por la firma del emisor."},"fechaIngreso":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"fechaRetiro":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"devengosVariables":{"type":"array","items":{"type":"object","properties":{"mes":{"type":"string","minLength":1},"valor":{"type":"number","minimum":0}},"required":["mes","valor"],"additionalProperties":false}},"devengosSuplementarios":{"type":"array","items":{"type":"object","properties":{"mes":{"type":"string","minLength":1},"valor":{"type":"number","minimum":0}},"required":["mes","valor"],"additionalProperties":false}},"cortePrima":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Hasta cuándo YA se pagó la prima. AUSENTE = se liquida desde la fecha de ingreso, y el supuesto sale declarado en `supuestos`. Si ya se pagó algún semestre y no se informa acá, la respuesta lo paga otra vez."},"corteCesantias":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Hasta cuándo YA se consignaron las cesantías al fondo. AUSENTE = se liquidan desde la fecha de ingreso, y el supuesto sale declarado en `supuestos`."},"diasVacacionesTomados":{"type":"number","minimum":0,"description":"Días de vacaciones ya disfrutados. AUSENTE = se asume que no tomó ninguno y se liquidan todas las causadas; el supuesto sale declarado en `supuestos`."},"diasSuspension":{"type":"array","items":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"indemnizacion":{"type":"object","properties":{"tipoContrato":{"type":"string","enum":["indefinido","fijo","obra_labor","tiempo_parcial"]},"conJustaCausa":{"type":"boolean","default":false},"enPeriodoPrueba":{"type":"boolean","default":false},"fechaVencimientoPactada":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["tipoContrato"],"additionalProperties":false,"description":"Opcional. AUSENTE = no se calcula indemnización, y eso NO equivale a cero: significa que no se pidió. Si se envía y el resultado es cero (período de prueba, justa causa), la línea INDEMNIZACION_DESPIDO se emite igual con su motivo legal. Cuando se omite, el resultado lo dice explícitamente en `noSolicitado`."}},"required":["externalId","salarioBase","fechaIngreso","fechaRetiro"],"additionalProperties":false},"minItems":1,"maxItems":500}},"required":["version","buyer","empleados"],"additionalProperties":false},"BatchPagoOnchainInput":{"type":"object","properties":{"version":{"type":"string","enum":["1"]},"buyer":{"type":"object","properties":{"executorId":{"type":"string","minLength":1},"wallet":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"noExternalLlm":{"type":"boolean","default":true}},"additionalProperties":false},"red":{"type":"string","default":"base"},"token":{"type":"string","default":"USDC"},"pagos":{"type":"array","items":{"type":"object","properties":{"externalId":{"type":"string","minLength":1},"montoCop":{"type":"number","exclusiveMinimum":true,"minimum":0},"walletAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"}},"required":["externalId","montoCop"],"additionalProperties":false},"minItems":1,"maxItems":500}},"required":["version","buyer","pagos"],"additionalProperties":false}},"securitySchemes":{"x402":{"type":"http","scheme":"bearer","bearerFormat":"x402-payment","description":"Pay per call over HTTP 402 (x402). The server answers 402 with `accepts` — network, token, amount and the token's EIP-712 domain in `extra` —, the client signs an EIP-3009 authorization and retries attaching it. The payment is immediate and final: no escrow, no dispute — which is why every output ships signed.\n\n**Before signing, cross-check the `payTo` of every `accepts` entry against the `walletAddress` in `https://ynt.codes/.well-known/agent-card.json`.** An x402 payment is final; an intercepted 402 gives itself away exactly there.\n\nPaywall **on** at `eip155:8453` (token `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`) and `eip155:43114` (token `0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E`). The operations marked with this scheme charge; everything else stays free."}}},"security":[],"tags":[{"name":"catalog","description":"The dated, signed legal parameters, and everything needed to verify any response without calling the server again."},{"name":"listings","description":"The five calculations built on that catalog."}],"paths":{"/liquidar":{"post":{"operationId":"payroll-settlement","summary":"Settle a full payroll period","description":"Settles a period for N employees and contractors: accruals, surcharges, overtime, statutory deductions and provisions. Every line cites its norm. Surcharges and the ordinary-hour divisor resolve BY THE PERIOD'S DATE, not today's, so a retroactive period is settled with the values that were in force back then.\n\nEvery response travels in the same verifiable envelope: `reglasHash` (sha256 of the legal catalog that produced the result), `reglasVerificadasAl`, `disclaimer`, a habeas data notice and an Ed25519 signature over the payload. The public key is at `/publickey`, so a third party can verify the result without calling the server again and without trusting it.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchLiquidarInput"}}}},"responses":{"200":{"description":"Signed result."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402): USD 0.02 per call on `eip155:8453` or `eip155:43114`. The 402 carries `accepts` with one entry per network — the token, the amount and the EIP-712 domain to sign with; the buyer picks one. See `securitySchemes.x402`."},"500":{"description":"`internal_error`."}},"security":[{"x402":[]}],"x-x402":{"cobra":true,"precioUsd":0.02,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/liquidar/csv":{"post":{"operationId":"payroll-settlement-csv","summary":"Settle a full payroll period (CSV output)","description":"Same input and same calculation as the JSON operation; returns `text/csv` with the hash, the signature and the disclaimer as leading `#` comments, so traceability is not lost when pasted into an email or attached to a settlement.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchLiquidarInput"}}}},"responses":{"200":{"description":"CSV."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402): USD 0.02 per call on `eip155:8453` or `eip155:43114`. The 402 carries `accepts` with one entry per network — the token, the amount and the EIP-712 domain to sign with; the buyer picks one. See `securitySchemes.x402`."}},"security":[{"x402":[]}],"x-x402":{"cobra":true,"precioUsd":0.02,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/retencion":{"post":{"operationId":"withholding-tax","summary":"Compute withholding tax on salaries (retención en la fuente)","description":"The art. 383/388 (Estatuto Tributario) base adjustment from numeric parameters only. The input is anonymous by design: no name, no national ID. Floor at 2023 — before that date it throws instead of returning a plausible, wrong number, because Law 2277 of 2022 changed the caps and unified the bracket table.\n\nEvery response travels in the same verifiable envelope: `reglasHash` (sha256 of the legal catalog that produced the result), `reglasVerificadasAl`, `disclaimer`, a habeas data notice and an Ed25519 signature over the payload. The public key is at `/publickey`, so a third party can verify the result without calling the server again and without trusting it.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRetencionInput"}}}},"responses":{"200":{"description":"Signed result."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402): USD 0.02 per call on `eip155:8453` or `eip155:43114`. The 402 carries `accepts` with one entry per network — the token, the amount and the EIP-712 domain to sign with; the buyer picks one. See `securitySchemes.x402`."},"500":{"description":"`internal_error`."}},"security":[{"x402":[]}],"x-x402":{"cobra":true,"precioUsd":0.02,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/retencion/csv":{"post":{"operationId":"withholding-tax-csv","summary":"Compute withholding tax on salaries (retención en la fuente) (CSV output)","description":"Same input and same calculation as the JSON operation; returns `text/csv` with the hash, the signature and the disclaimer as leading `#` comments, so traceability is not lost when pasted into an email or attached to a settlement.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRetencionInput"}}}},"responses":{"200":{"description":"CSV."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402): USD 0.02 per call on `eip155:8453` or `eip155:43114`. The 402 carries `accepts` with one entry per network — the token, the amount and the EIP-712 domain to sign with; the buyer picks one. See `securitySchemes.x402`."}},"security":[{"x402":[]}],"x-x402":{"cobra":true,"precioUsd":0.02,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/verificar":{"post":{"operationId":"payslip-verification","summary":"Verify whether a payslip is correctly settled","description":"Independently recomputes the statutory lines of a transcribed payslip and compares them against what it declares, flagging missing lines and discrepancies with their norm.\n\nEvery response travels in the same verifiable envelope: `reglasHash` (sha256 of the legal catalog that produced the result), `reglasVerificadasAl`, `disclaimer`, a habeas data notice and an Ed25519 signature over the payload. The public key is at `/publickey`, so a third party can verify the result without calling the server again and without trusting it.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerificacionInput"}}}},"responses":{"200":{"description":"Signed result."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402): USD 0.02 per call on `eip155:8453` or `eip155:43114`. The 402 carries `accepts` with one entry per network — the token, the amount and the EIP-712 domain to sign with; the buyer picks one. See `securitySchemes.x402`."},"500":{"description":"`internal_error`."}},"security":[{"x402":[]}],"x-x402":{"cobra":true,"precioUsd":0.02,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/verificar/csv":{"post":{"operationId":"payslip-verification-csv","summary":"Verify whether a payslip is correctly settled (CSV output)","description":"Same input and same calculation as the JSON operation; returns `text/csv` with the hash, the signature and the disclaimer as leading `#` comments, so traceability is not lost when pasted into an email or attached to a settlement.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerificacionInput"}}}},"responses":{"200":{"description":"CSV."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402): USD 0.02 per call on `eip155:8453` or `eip155:43114`. The 402 carries `accepts` with one entry per network — the token, the amount and the EIP-712 domain to sign with; the buyer picks one. See `securitySchemes.x402`."}},"security":[{"x402":[]}],"x-x402":{"cobra":true,"precioUsd":0.02,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/liquidacion-final":{"post":{"operationId":"final-settlement","summary":"Settle a terminated contract (final settlement)","description":"Severance (cesantías), its interest, prima and pending vacation at termination, plus the indemnity if requested. Each concept settles from ITS own cutoff, because they are not paid on the same cycle: settling them all from the hire date pays again what was already paid. The caller declares the history; whatever it omits is assumed as the simple case and the assumption comes back explicit in `supuestos`. Mind two absences that are NOT zeros: omitting `indemnizacion` means it was not requested (and the response says so in `noSolicitado`), and `auxilioTransporte` is a boolean — the amount is resolved by the server against the signed catalog at the termination date.\n\nEvery response travels in the same verifiable envelope: `reglasHash` (sha256 of the legal catalog that produced the result), `reglasVerificadasAl`, `disclaimer`, a habeas data notice and an Ed25519 signature over the payload. The public key is at `/publickey`, so a third party can verify the result without calling the server again and without trusting it.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchLiquidacionFinalInput"}}}},"responses":{"200":{"description":"Signed result."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402). Only while the paywall is on; it is currently off and these operations answer without payment. The 402 body carries `accepts` with the network, token and amount — see `securitySchemes.x402`."},"500":{"description":"`internal_error`."}},"x-x402":{"cobra":false,"precioUsd":null,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/liquidacion-final/csv":{"post":{"operationId":"final-settlement-csv","summary":"Settle a terminated contract (final settlement) (CSV output)","description":"Same input and same calculation as the JSON operation; returns `text/csv` with the hash, the signature and the disclaimer as leading `#` comments, so traceability is not lost when pasted into an email or attached to a settlement.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchLiquidacionFinalInput"}}}},"responses":{"200":{"description":"CSV."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402). Only while the paywall is on; it is currently off and these operations answer without payment. The 402 body carries `accepts` with the network, token and amount — see `securitySchemes.x402`."}},"x-x402":{"cobra":false,"precioUsd":null,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/pago-onchain":{"post":{"operationId":"usdc-contractor-payout","summary":"Build a USDC payout batch on Base","description":"Converts COP amounts to USDC with a frozen rate and builds the payment links. It does NOT custody or sign: the server never moves funds — it only produces the batch the payer signs with their own wallet.\n\nEvery response travels in the same verifiable envelope: `reglasHash` (sha256 of the legal catalog that produced the result), `reglasVerificadasAl`, `disclaimer`, a habeas data notice and an Ed25519 signature over the payload. The public key is at `/publickey`, so a third party can verify the result without calling the server again and without trusting it.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchPagoOnchainInput"}}}},"responses":{"200":{"description":"Signed result."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402): USD 0.02 per call on `eip155:8453` or `eip155:43114`. The 402 carries `accepts` with one entry per network — the token, the amount and the EIP-712 domain to sign with; the buyer picks one. See `securitySchemes.x402`."},"500":{"description":"`internal_error`."}},"security":[{"x402":[]}],"x-x402":{"cobra":true,"precioUsd":0.02,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/pago-onchain/csv":{"post":{"operationId":"usdc-contractor-payout-csv","summary":"Build a USDC payout batch on Base (CSV output)","description":"Same input and same calculation as the JSON operation; returns `text/csv` with the hash, the signature and the disclaimer as leading `#` comments, so traceability is not lost when pasted into an email or attached to a settlement.","tags":["listings"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchPagoOnchainInput"}}}},"responses":{"200":{"description":"CSV."},"400":{"description":"`invalid_input` — the body does not meet the v1 contract."},"402":{"description":"Payment required (x402): USD 0.02 per call on `eip155:8453` or `eip155:43114`. The 402 carries `accepts` with one entry per network — the token, the amount and the EIP-712 domain to sign with; the buyer picks one. See `securitySchemes.x402`."}},"security":[{"x402":[]}],"x-x402":{"cobra":true,"precioUsd":0.02,"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","redes":[{"red":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","nombre":"base"},{"red":"eip155:43114","asset":"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E","nombre":"avalanche"}]}}},"/parametros":{"get":{"operationId":"legal-parameters","summary":"Signed snapshot of the statutory parameters in force","description":"The 25 parameters the engine resolves, each with its unit, its description and its legal reference, signed and carrying the catalog hash.\n\nWith `?fecha=YYYY-MM-DD` it resolves against the **validity history**, seeded from 2020: asking for `2024-03-15` returns the minimum wage and allowance that governed that day, not today's. It is what a retroactive settlement needs — and above all whoever AUDITS a retroactive settlement someone else computed. Without the parameter, today.\n\nKeys with no value on the requested date are not silently omitted: they come back in `noVigentes` with the reason. Asking for 2021 returns 22 parameters and not 25, because the withholding caps start in 2023 (Law 2277 of 2022), and a shorter list goes unnoticed if nobody names it.\n\nEvery response travels in the same verifiable envelope: `reglasHash` (sha256 of the legal catalog that produced the result), `reglasVerificadasAl`, `disclaimer`, a habeas data notice and an Ed25519 signature over the payload. The public key is at `/publickey`, so a third party can verify the result without calling the server again and without trusting it.","tags":["catalog"],"parameters":[{"name":"fecha","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Day to resolve the values at (YYYY-MM-DD). Omitted = today. The date travels signed in `vigenteDesde`, so a 2024 snapshot cannot pass itself off as today's."}],"responses":{"200":{"description":"Signed snapshot, resolved to `vigenteDesde`."},"400":{"description":"`invalid_input` — `fecha` is not YYYY-MM-DD."},"500":{"description":"`parametros_no_disponibles`."}}}},"/publickey":{"get":{"operationId":"public-key","summary":"Ed25519 public key that verifies every response","description":"Returns the public key PEM and its `publicKeyId` (first 16 bytes of the DER's sha256, hex). With it any third party verifies offline the signature of everything this wrapper emits — without calling the server again and without trusting it. The same key is declared in the agent card at `https://ynt.codes/.well-known/agent-card.json`, which is the out-of-band cross-check: if this route and the card do not match, verify nothing.","tags":["catalog"],"responses":{"200":{"description":"PEM and `publicKeyId`."},"404":{"description":"Nonexistent route."}}}},"/health":{"get":{"operationId":"health","summary":"Wrapper status, rules ledger and active guards","description":"Actually queries the rules ledger — not a ping: it answers the current `reglasHash`, `reglasVerificadasAl` and which guards are active. It is the free GET a buyer makes before paying, because it hands the hash the response will later be audited against; if this route answers 503, the legal catalog could not be read and paying for a call makes no sense.","tags":["catalog"],"responses":{"200":{"description":"Status."},"503":{"description":"`unavailable` — the legal catalog could not be read."}}}}}}