Tipo 1 y Tipo 2: Transferencias P2P (SEND)
Para iniciar una nueva transferencia P2P del tipo Tipo 1 o Tipo 2, se debe realizar una solicitud POST al endpoint: POST /v1/transfer
Este método orquesta la ejecución completa del flujo de transferencia P2P en TIN Cloud.
- Tipo 1: Transferencia con aceptación (sin relación de confianza).
- Tipo 2: Transferencia inmediata (con relación de confianza).
La ejecución de este endpoint permite iniciar la acción SEND, que a su vez gestionará las acciones necesarias como UPLOAD (débito), SEND (transferencia) y DOWNLOAD (crédito), dependiendo del tipo de flujo que se aplique.
Antes de iniciar una transferencia, debes agregar los detalles del dispositivo (Device Fingerprint) en el objeto labels.deviceFingerPrint.
Ejemplo de solicitud cURL
curl -X POST -H "API_KEY: 5b481fc2ae177010e197026ba5b51227c44243cd9a18e41be536566e" -H "Authorization: Bearer asdfwXTdDQFimVQOMdn9bOGHJh8KrqnFi34sugYqgrULRCb" -H "Content-Type: application/json" -d '{
"source": "wsource_user_bridge_address",
"target": "$target_user_phone_number",
"symbol": "$tin",
"amount": "AMOUNT",
"labels": {
"type": "SEND",
"description": "Description of a transfer",
"sourceCreated": "ISO_TIMESTAMP",
"transactionPurpose": "TRANSFER",
"numberOfTransactions": "1",
"sourceChannel": "APP",
"deviceFingerprint": {
"hash": "26fff5af6441f8e15a71e8d62c361714484b1b308c99e8eb68ca85e2a7e0dc58",
"ipAddress": "190.242.46.190",
"geolocation": " ",
"country": "Colombia",
"city": "Bogota",
"mobileDevice": "a",
"SIMCardId": "a",
"model": "a",
"operator": "D"
}
}
}' "https://ach-minka-tst.transferenciasinmediatas.com/v1/transfer"
Response 200 OK
{
"source": "wsource_user_bridge_address",
"target": "$target_user_phone_number",
"symbol": "$tin",
"amount": "AMOUNT",
"labels": {
"tx_ref": "15368665012276089",
"type": "SEND",
"status": "PENDING",
"description": "Description of a transfer",
"transactionPurpose": "TRANSFER",
"sourceCreated": "2018-08-03T09:58:01.906Z",
"created": "2018-08-03T09:58:01.906Z",
"numberOfTransactions": "1",
"deviceFingerprint": {
"hash": "26fff5af6441f8e15a71e8d62c361714484b1b308c99e8eb68ca85e2a7e0dc58",
"ipAddress": "190.242.46.190",
"geolocation": " ",
"country": "Colombia",
"city": "Bogota",
"mobileDevice": "a",
"SIMCardId": "a",
"model": "a",
"operator": "D"
}
},
"error": {
"code": 0,
"message": "Success"
}
}
Response 400 Bad Request
{
"source": "wsource_user_bridge_address",
"target": "$target_user_phone_number",
"symbol": "$tin",
"amount": "AMOUNT",
"labels": {
"tx_ref": "15368665012276089",
"type": "SEND",
"status": "REJECTED",
"description": "Description of a transfer",
"transactionPurpose": "TRANSFER",
"sourceCreated": "2018-08-03T09:58:01.906Z",
"created": "2018-08-03T09:58:01.906Z",
"numberOfTransactions": "1",
"deviceFingerprint": {
"hash": "26fff5af6441f8e15a71e8d62c361714484b1b308c99e8eb68ca85e2a7e0dc58",
"ipAddress": "190.242.46.190",
"geolocation": " ",
"country": "Colombia",
"city": "Bogota",
"mobileDevice": "a",
"SIMCardId": "a",
"model": "a",
"operator": "D"
}
},
"error": {
"code": 123,
"message": "Number of transactions exceeded."
}
}
C# Example Code
Java Example Code
NodeJS Example Code
CreateTransferRequest createTransferRequest = new CreateTransferRequest();
createTransferRequest.Source = "wsource_user_bridge_address";
createTransferRequest.Target = "$target_user_phone_number";
Dictionary<String, object> labels = new Dictionary<String, Object>();
createTransferRequest.Labels = labels;
labels["type"] = "SEND";
labels["description"] = "Description of a transfer";
createTransferRequest.Amount = "AMOUNT";
createTransferRequest.Symbol = "$tin";
instance.Configuration.AddApiKey("x-api-key","5b481fc2ae177010e197026b39c58cdb000f4c3897e841714e82c84c");
var response = instance.CreateTinTransfer(createTransferRequest);
CreateTransferRequest tinTranfer = new CreateTransferRequest();
CreateTransferRequestLabels labels = new CreateTransferRequestLabels();
DeviceFingerPrint deviceFingerPrint = new DeviceFingerPrint();
deviceFingerPrint.setCity("Bogota");
deviceFingerPrint.setCountry("Colombia");
deviceFingerPrint.setGeolocation(" ");
deviceFingerPrint.setHash("26fff5af6441f8e15a71e8d62c361714484b1b308c99e8eb68ca85e2a7e0dc58");
deviceFingerPrint.setIpAddress("190.242.46.190");
deviceFingerPrint.setMobileDevice("a");
deviceFingerPrint.setSiMCardId("a");
deviceFingerPrint.setModel("a");
deviceFingerPrint.setOperator("a");
labels.setTxId("34242342sdfe3432r23");
labels.setType("SEND");
labels.setDescription("Description of a transfer");
labels.setTransactionPurpose("transactionPurpose");
labels.setSourceCreated("2018-08-03T09:58:01.906Z");
labels.setNumberOfTransactions("1");
labels.setDeviceFingerPrint(deviceFingerPrint);
tinTranfer.setSource("wsource_user_bridge_address");
tinTranfer.setTarget("$target_user_phone_number");
tinTranfer.setAmount("10000");
tinTranfer.setSymbol("$tin");
tinTranfer.setLabels(labels);
CreateTransferResponse tinTransfer = sdkApiClient.createTinTransfer(tinTranfer);
System.out.println(tinTransfer);
var Tinapi = require('tinapi_');
var defaultClient = Tinapi.ApiClient.instance;
// Configure API key authorization: ApiKeyAuth
var ApiKeyAuth = defaultClient.authentications['ApiKeyAuth'];
ApiKeyAuth.apiKey = '5b481fc2ae177010e197026b39c58cdb000f4c3897e841714e82c84c';
var apiInstance = new Tinapi.TransferApi();
var createTransferRequest = new Tinapi.CreateTransferRequest(); // CreateTransferRequest |
createTransferRequest.source = "wsource_user_bridge_address";
createTransferRequest.target = "$target_user_phone_number";
var labels = {};
createTransferRequest.Labels = labels;
labels.type = "SEND";
labels.description. = "Description of a transfer";
createTransferRequest.amount = "AMOUNT";
createTransferRequest.symbol = "$tin";
apiInstance.createTinTransfer(createTransferRequest).then(function(data) {
console.log(data);
console.log('API called successfully. Returned data: ' + data);
}, function(error) {
console.error(error);
});
Crear Relación de Confianza
Para realizar una transferencia de tipo TYPE2, se requiere crear un vínculo de confianza (trust link) antes de ejecutar la solicitud de transferencia.
Cuando existe una relación de confianza, cualquier transacción generada desde un signer dentro del wallet origen será transferida inmediatamente al signer de destino definido en el vínculo de confianza, sin necesidad de aceptación manual por parte del usuario receptor.
Las relaciones de confianza permiten ejecutar flujos de transferencia inmediatos sin enviar notificaciones ni requerir aceptación por parte del receptor.
cURL Example Code
C# Example Code
Java Example Code
Node Example Code
curl -X PUT -H "x-api-key: 5b481fc2ae177010e197026ba5b51227c44243cd9a18e41be536566e" -H "Authorization: Bearer asdfwXTdDQFimVQOMdn9bOGHJh8KrqnFi34sugYqgrULRCb" -H "Content-Type: application/json" -d '{
"source": "$USER1_PHONE_NUMBER",
"target": "USER2_SIGNER",
"type": "TRUST"
}' "https://ach-minka-stg.transferenciasinmediatas.com/v1/link/"
CreateLinkRequest createLinkRequest = new CreateLinkRequest();
createLinkRequest.Source = "$USER1_PHONE_NUMBER";
createLinkRequest.Target = "USER2_SIGNER";
createLinkRequest.Type = CreateLinkRequest.TypeEnum.TRUST;
string X_API_KEY = "5b481fc2ae177010e197026ba5b51227c44243cd9a18e41be536566e";
instance.Configuration.AddApiKey("X_API_KEY", X_API_KEY);
var response = instance.CreateLink(createLinkRequest);
Console.WriteLine(response);
LinkItem link = sdkApiClient.createLink("$USER1_PHONE_NUMBER", "USER2_SIGNER", io.minka.api.model.CreateLinkRequest.TypeEnum.TRUST);
System.out.println(link);
var Tinapi = require('tin_api')
var defaultClient = Tinapi.ApiClient.instance
// Configure API key authorization: ApiKeyAuth
var ApiKeyAuth = defaultClient.authentications['ApiKeyAuth']
ApiKeyAuth.xApiKey = '5b481fc2ae177010e197026ba5b51227c44243cd9a18e41be536566e'
var apiInstance = new Tinapi.LinksApi()
var createLinkRequest = new Tinapi.CreateLinkRequest() //
createLinkRequest.source = '$USER1_PHONE_NUMBER'
createLinkRequest.target = 'USER2_SIGNER'
createLinkRequest.type = 'TRUST'
apiInstance.createLink(createLinkRequest).then(
function (data) {
console.log('API called successfully. Returned data: ' + data)
},
function (error) {
console.error(error)
},
)
Buscar transferencia en el Dashboard
Para consultar una transferencia, ve a la sección Transferencias en el Dashboard, donde encontrarás el listado completo de todas las transferencias realizadas.
Haz clic en “detalles” para ver la información detallada de una transferencia específica.
