Categorías de transacciones
Cada transacción tiene untransaction_category que determina cómo la tratan las reglas y la analítica:
Detalles de la transacción
El objetotransaction_details contiene los datos financieros:
Sujeto y contraparte
Cada transacción tiene un sujeto (obligatorio) y una contraparte opcional. Ambos usan el mismo modelo de parte:
Didit deriva el
country_code de la parte a partir de address.country cuando address es un objeto. Cuando address es un string, country_code se devuelve como null en esa parte.
Cuando vendor_data coincide con un usuario o una empresa existentes, Didit vincula automáticamente la transacción al perfil de esa entidad, lo que permite evaluar reglas entre sesiones y realizar comprobaciones de frecuencia.
En la respuesta, ambas partes se devuelven en el array parties con los roles APPLICANT y COUNTERPARTY.
Métodos de pago
Adjunta unpayment_method a cada parte para describir el instrumento de ese lado:
En las transacciones
travelRule, un método de pago de la contraparte con method_type: "unhosted_wallet" (alias type) declara la wallet de la contraparte como wallet sin custodia.
Cuando la Travel Rule está activada y el importe, en la divisa predeterminada de tu aplicación, no es inferior a threshold_amount, la transferencia pasa directamente a UNCONFIRMED_OWNERSHIP y al flujo de prueba de propiedad; consulta Wallets sin custodia declaradas.
En las transacciones cripto, incluye las direcciones de wallet en account_id y establece currency_kind en crypto para que el análisis en la blockchain se ejecute automáticamente. El sentido de la transacción determina qué wallet se analiza: el análisis entrante previo a la transferencia usa la wallet del remitente en counterparty.payment_method.account_id; el análisis saliente usa la wallet de destino en counterparty.payment_method.account_id. Si envías un hash de la blockchain en transaction_details.payment_reference_id, el análisis de transacciones entrantes requiere la dirección de depósito de tu servicio en subject.payment_method.account_id, mientras que el análisis de transacciones salientes requiere la wallet de destino en counterparty.payment_method.account_id.
Sobrescribir el análisis cripto
Usainclude_crypto_screening en el nivel superior de la solicitud para sobrescribir el valor predeterminado configurado en Transactions > Settings en la Console:
Contexto del dispositivo
Incluye información del dispositivo del sujeto (y, opcionalmente, de la contraparte) para activar las reglas de inteligencia de dispositivos. El campo de la solicitud esdevice_context en cada parte; también se acepta el alias en camelCase device, que es el que usa el formato de transmisión del SDK. La respuesta lo devuelve como device en cada parte del array parties.
browser_family y platform no se derivan de user_agent. Deben enviarse como claves explícitas de primer nivel dentro de device_context para que se activen las reglas de inteligencia de dispositivos. Si usas el SDK de Didit, estos campos se recopilan automáticamente.userAgent, browserFamily, browserVersion, osFamily, osVersion, acceptLang, sessionId, sessionAgeMs. El subobjeto network_context acepta los alias ip / countryCode3 / lat / lon, y un bloque ipInfo de primer nivel también se incorpora a network_context.
El contexto del dispositivo permite reglas como la detección de multicuenta (la misma huella digital en sujetos distintos), la detección de la combinación de navegador nuevo e IP nueva, las transferencias de alto valor con una sesión de poca antigüedad y la puntuación de riesgo basada en la ubicación.
Propiedades personalizadas
Añade cualquier par clave-valor adicional en el objetocustom_properties. Las reglas pueden hacer referencia a estos campos en sus condiciones, lo que resulta útil para pasar contexto específico de tu negocio, como la categoría de producto, el ID del comercio o el canal.
custom_values.<key>: por ejemplo, el payload anterior coincide con custom_values.product_category eq "electronics". En el editor de reglas de la consola, las claves detectadas en las transacciones ingeridas recientemente aparecen en el selector de campos de la condición, en Custom Properties, y la opción Enter custom property del mismo grupo te permite escribir cualquier clave manualmente (distingue entre mayúsculas y minúsculas). Consulta Reglas y puntuación para más detalles.
Ejemplo de solicitud
Respuesta
La API devuelve la transacción creada con los resultados de su evaluación inicial:
Consulta la referencia de la API para ver el esquema completo de la solicitud y la respuesta, y la referencia del esquema de respuesta para una guía comentada del payload.
Asignar una transacción a un revisor
Asigna una transacción retenida a un miembro de tu aplicación, o retira la asignación, con una clave de API que tenga el privilegiowrite:transactions.
Cada cambio queda registrado en la línea de tiempo de la transacción como TRANSACTION_ASSIGNED.
Ambas llamadas reciben
assignee_email, el correo electrónico de un miembro de la aplicación que haya iniciado sesión en Didit.
Envía null o una cadena vacía para retirar la asignación.
La llamada masiva también recibe transaction_ids, una lista de entre 1 y 500 UUID de transacciones.
uuid, transaction_number, assignee y changed (false cuando la transacción ya tenía ese responsable asignado), o 404 cuando la transacción no existe en la aplicación.
La llamada masiva devuelve transactions (una entrada como la anterior por transacción), updated_count y not_found_transaction_ids.
Filtra la lista de transacciones con assignee, una lista separada por comas en la que basta con que coincida cualquier valor: me, unassigned, rules (transacciones decididas solo por las reglas, sin intervención de un revisor) o el correo electrónico de un miembro.
Idempotencia
txn_id (el transaction_id que envías) es único por aplicación.
Si vuelves a enviar un transaction_id que ya existe, recibes un 400 con A transaction with this transaction_id already exists. en el campo transaction_id, y si dos solicitudes idénticas compiten entre sí, la segunda recibe un 409.
Ninguna de las dos respuestas devuelve la transacción existente.
Para reintentar de forma segura, trata un 400 o un 409 por un transaction_id duplicado como una indicación de que la transacción ya se creó y consulta la transacción existente en lugar de volver a enviarla: léela con GET /v3/transactions/{uuid}/ usando el uuid de la primera respuesta, o usa el transaction_id (el uuid de Didit) que el webhook transaction.created incluye junto a tu txn_id.
Genera siempre el txn_id en tu sistema (por ejemplo, el ID de la transacción en tu propia base de datos, un UUID o un hash determinista).
Carga de datos históricos
Envía untxn_date con una fecha pasada para ingerir transacciones históricas. Las reglas se siguen evaluando de forma predeterminada; usa la importación CSV de la consola con el modo de ingesta de prueba (dry-ingest) si quieres omitir la evaluación de reglas durante cargas masivas de datos históricos. Consulta la guía de integración.
Próximos pasos
Reglas y puntuación
Cómo se evalúan las transacciones enviadas en función de las reglas.
Esquema de respuesta
Payload de respuesta completo y comentado.
Análisis cripto
Análisis automático de wallets y transacciones de criptomonedas.
Travel Rule
Adjunta datos de cumplimiento de la Travel Rule a las transferencias de activos virtuales.
Enriquecimiento de IP
Contexto derivado de la IP disponible para las reglas.
Referencia de la API
Esquema completo de la solicitud para el endpoint Create Transaction.