Emitir enlace
Crea un enlace de un solo uso a la página donde el cliente acepta el documento, y devuelve la URL a la que hay que redirigirlo.
/v1/tyc/issuetyc es un segmento fijo del path (términos y condiciones) que no significa nada para quien llama: tratalo como opaco.
El enlace se emite a nombre del client_id con el que se obtuvo el token, y sólo se acepta el client_id registrado para este flujo. Otras credenciales de la misma empresa responden 403, aunque funcionen en el resto de la API.
Request
Headers
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
Authorization | string | Sí | Access token en formato Bearer ACCESS_TOKEN |
Content-Type | string | Sí | Debe ser application/json |
No aplica: Path Parameters, Query Parameters.
Body
cuit es condicionalVINCULATION: obligatorio. Esa pantalla lista los comitentes que la persona ya tiene, y se buscan por CUIT.TYC: no se pide. No lo lee ninguna pantalla.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
kind | string | Sí | TYC o VINCULATION. Define a qué pantalla lleva el enlace — ver los dos tipos de enlace. No tiene default: un valor equivocado acá le muestra a la persona el consentimiento que no es. |
payload | object | Sí | La persona para la que es el enlace. |
payload.dni | string | Sí | 7 u 8 dígitos. Sólo dígitos — sin puntos. |
payload.first_name | string | Sí | No puede estar vacío. Se muestra en la página para saludar a la persona. |
payload.last_name | string | Sí | No puede estar vacío. |
payload.cuit | string | Condicional | Obligatorio cuando kind es VINCULATION. Exactamente 11 dígitos — sin guiones. |
Cualquier otro campo que pongas en payload se guarda con la constancia pero no se lee nunca ni se le muestra al cliente. Mandá sólo lo documentado acá: son datos personales, y quedan guardados mientras exista la constancia.
Response
2XX Éxito
Status: 201 Created
| Campo | Tipo | Descripción |
|---|---|---|
id | number | Identificador de la constancia. Citalo cuando nos consultes por un enlace puntual. |
url | string | A dónde redirigir al cliente. Usala tal cual viene; no la rearmes a partir del token. |
expires_at | string | Cuándo deja de funcionar el enlace. ISO 8601, UTC. |
expires_in_seconds | number | Cuánto tiempo sigue siendo válido, desde el momento en que se emitió. 30 minutos en producción, más en desarrollo — leé este campo en vez de hardcodear la ventana. |
Emitir un enlace retira cualquier enlace sin usar que ya tenga ese mismo DNI. Pedí de a uno: un lote emitido por adelantado deja a todos los clientes menos al último con un enlace que se reporta como reemplazado.
La llamada no es idempotente y no hay una clave de request para repetirla sin riesgo.
Un reintento después de un timeout emite un segundo enlace y retira el primero, así que un cliente que ya tenga el primero se queda con un enlace muerto.
Si una llamada te da timeout, asumí que puede haber funcionado:
- Reintentá una vez.
- Redirigí al cliente al enlace que devuelve ese reintento, nunca a uno anterior.
Códigos de error
| Status | Descripción |
|---|---|
401 | Unauthorized — {"error": "missing bearer token"} cuando falta el header Authorization o no es de tipo Bearer, y {"error": "invalid token"} cuando se rechazó su firma, su issuer o su expiración |
403 | Forbidden — {"error": "client not allowed to issue links"}. El token es válido, pero tu client_id no está autorizado para este endpoint |
422 | Unprocessable Entity — el body no validó |
500 | Internal Server Error |
Estructura del error (422):
{
"error": "invalid_payload",
"detail": "payload.dni must be 7 or 8 digits · payload.last_name is required and cannot be blank",
"problems": [
{ "field": "payload.dni", "message": "must be 7 or 8 digits" },
{ "field": "payload.last_name", "message": "is required and cannot be blank" }
]
}
problems trae todos los campos que fallaron, no sólo el primero, así un request te dice todo lo que hay para corregir. detail es la misma información en una sola oración.
Ejemplo de código
- cURL
- JavaScript
- Python
- Node.js
curl -X POST "https://b2b.allaria.cloud/v1/tyc/issue" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "TYC",
"payload": {
"dni": "37087294",
"first_name": "JUAN CARLOS",
"last_name": "PEREZ"
}
}'
const response = await fetch('https://b2b.allaria.cloud/v1/tyc/issue', {
method: 'POST',
headers: {
'Authorization': 'Bearer ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
kind: 'TYC',
payload: {
dni: '37087294',
first_name: 'JUAN CARLOS',
last_name: 'PEREZ'
}
})
});
const data = await response.json();
console.log(data);
import requests
response = requests.post(
'https://b2b.allaria.cloud/v1/tyc/issue',
headers={
'Authorization': 'Bearer ACCESS_TOKEN',
'Content-Type': 'application/json'
},
json={
'kind': 'TYC',
'payload': {
'dni': '37087294',
'first_name': 'JUAN CARLOS',
'last_name': 'PEREZ'
}
}
)
data = response.json()
print(data)
const axios = require('axios');
const response = await axios.post('https://b2b.allaria.cloud/v1/tyc/issue', {
kind: 'TYC',
payload: {
dni: '37087294',
first_name: 'JUAN CARLOS',
last_name: 'PEREZ'
}
}, {
headers: {
Authorization: 'Bearer ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
console.log(response.data);
{
"id": 481,
"url": "https://apertura-cuenta.allaria.com.ar/banco-del-sol/kJ3nQ7pXr2vB8sLmT4wYd6ZaE1cH0gNfUiOjRkPq5tM",
"expires_at": "2026-09-11T18:42:07.512034+00:00",
"expires_in_seconds": 1800
}