curl --request PUT \
--url https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file'import requests
url = "https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}"
files = { "file": ("example-file", open("example-file", "rb")) }
headers = {"Authorization": "<api-key>"}
response = requests.put(url, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
const options = {method: 'PUT', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}")
.header("Authorization", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "onbprc_0ujsswThIGTUYm2K8FjOOfXtY1K",
"object": "onboarding",
"entity_id": "ent_8anBwgZktbZH6ydyHa6Tm0eM",
"status": "in_progress",
"source": "api",
"submitted_at": null,
"reviewed_at": null,
"submittable": false,
"data": {
"company_information": {
"incorporation_date": "2020-01-15T00:00:00.000Z",
"business_activity": "Servicios financieros",
"fiscal_address": "Av. Reforma 123, CDMX",
"business_address": "Av. Insurgentes 456, CDMX",
"settlement_account": "000000000000000000",
"phone": "+521111111111"
},
"transactional_profile": {
"resource_origins": [
"trusts",
"investments"
],
"monthly_amount_range": "1_500000",
"monthly_operations_range": "1_15000",
"declaration_accepted": true
}
},
"legal_representatives": [
{
"id": "onblr_0ujsswThIGTUYm2K8FjOOfXtY1K",
"object": "onboarding_legal_representative",
"first_name": "Test Customer 1",
"last_name": "Customer",
"email": "rep@example.com",
"nationality": "mx",
"identification_number": "AAAA010101HDFAAA01",
"position": "Director General",
"documents": [
{
"slot_key": "identification",
"status": "uploaded",
"filename": "id.pdf",
"uploaded_at": "2026-01-15T14:30:00Z"
},
{
"slot_key": "power_of_attorney",
"status": "missing"
}
]
}
],
"shareholders": [
{
"id": "onbsh_0ujsswThIGTUYm2K8FjOOfXtY1K",
"object": "onboarding_shareholder",
"type": "natural_person",
"name": "Test Customer 2",
"last_name": "Customer",
"percentage": 60,
"holder_id": "AAAA010101AAA",
"parent_id": null,
"document": {
"slot_key": "identification",
"status": "missing"
}
},
{
"id": "onbsh_8anBwgZktbZH6ydyHa6Tm0eM",
"object": "onboarding_shareholder",
"type": "legal_entity",
"name": "Acme SA",
"percentage": 40,
"holder_id": "AAA010101AAA",
"parent_id": null,
"document": {
"slot_key": "articles_of_incorporation",
"status": "missing"
}
},
{
"id": "onbsh_9bnCxhAlucAI7zezIb7Un1fN",
"object": "onboarding_shareholder",
"type": "natural_person",
"name": "Test Customer 3",
"last_name": "Customer",
"percentage": 80,
"holder_id": "AAAA010101AAA",
"parent_id": "onbsh_8anBwgZktbZH6ydyHa6Tm0eM",
"document": {
"slot_key": "identification",
"status": "missing"
}
}
],
"documents": [
{
"slot_key": "tax_registration_certificate",
"status": "missing"
},
{
"slot_key": "settlement_bank_statement",
"status": "missing"
},
{
"slot_key": "proof_of_address",
"status": "missing"
},
{
"slot_key": "shareholder_structure",
"status": "missing"
},
{
"slot_key": "articles_of_incorporation",
"status": "missing"
}
]
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid API Key: invalid-*oken"
}
}{
"error": {
"type": "invalid_request_error",
"code": "missing_resource",
"param": "legal_representative_id",
"message": "No such legal representative: onblr_0ujsswThIGTUYm2K8FjOOfXtY1K",
"doc_url": "https://docs.fintoc.com/reference/errors"
}
}{
"error": {
"type": "invalid_request_error",
"code": "unknown_document_slot",
"param": "slot_key",
"message": "No such document slot: passport",
"doc_url": "https://docs.fintoc.com/reference/errors"
}
}Upload a legal representative document
Uploads one document to an onboarding legal representative’s document slot and returns the updated onboarding. Send the file as multipart/form-data. Each slot holds a single file: uploading to a slot that already has a file replaces the previous file. You can upload documents only while the onboarding is in progress.
curl --request PUT \
--url https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file'import requests
url = "https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}"
files = { "file": ("example-file", open("example-file", "rb")) }
headers = {"Authorization": "<api-key>"}
response = requests.put(url, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
const options = {method: 'PUT', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}")
.header("Authorization", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/legal_representatives/{legal_representative_id}/documents/{slot_key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "onbprc_0ujsswThIGTUYm2K8FjOOfXtY1K",
"object": "onboarding",
"entity_id": "ent_8anBwgZktbZH6ydyHa6Tm0eM",
"status": "in_progress",
"source": "api",
"submitted_at": null,
"reviewed_at": null,
"submittable": false,
"data": {
"company_information": {
"incorporation_date": "2020-01-15T00:00:00.000Z",
"business_activity": "Servicios financieros",
"fiscal_address": "Av. Reforma 123, CDMX",
"business_address": "Av. Insurgentes 456, CDMX",
"settlement_account": "000000000000000000",
"phone": "+521111111111"
},
"transactional_profile": {
"resource_origins": [
"trusts",
"investments"
],
"monthly_amount_range": "1_500000",
"monthly_operations_range": "1_15000",
"declaration_accepted": true
}
},
"legal_representatives": [
{
"id": "onblr_0ujsswThIGTUYm2K8FjOOfXtY1K",
"object": "onboarding_legal_representative",
"first_name": "Test Customer 1",
"last_name": "Customer",
"email": "rep@example.com",
"nationality": "mx",
"identification_number": "AAAA010101HDFAAA01",
"position": "Director General",
"documents": [
{
"slot_key": "identification",
"status": "uploaded",
"filename": "id.pdf",
"uploaded_at": "2026-01-15T14:30:00Z"
},
{
"slot_key": "power_of_attorney",
"status": "missing"
}
]
}
],
"shareholders": [
{
"id": "onbsh_0ujsswThIGTUYm2K8FjOOfXtY1K",
"object": "onboarding_shareholder",
"type": "natural_person",
"name": "Test Customer 2",
"last_name": "Customer",
"percentage": 60,
"holder_id": "AAAA010101AAA",
"parent_id": null,
"document": {
"slot_key": "identification",
"status": "missing"
}
},
{
"id": "onbsh_8anBwgZktbZH6ydyHa6Tm0eM",
"object": "onboarding_shareholder",
"type": "legal_entity",
"name": "Acme SA",
"percentage": 40,
"holder_id": "AAA010101AAA",
"parent_id": null,
"document": {
"slot_key": "articles_of_incorporation",
"status": "missing"
}
},
{
"id": "onbsh_9bnCxhAlucAI7zezIb7Un1fN",
"object": "onboarding_shareholder",
"type": "natural_person",
"name": "Test Customer 3",
"last_name": "Customer",
"percentage": 80,
"holder_id": "AAAA010101AAA",
"parent_id": "onbsh_8anBwgZktbZH6ydyHa6Tm0eM",
"document": {
"slot_key": "identification",
"status": "missing"
}
}
],
"documents": [
{
"slot_key": "tax_registration_certificate",
"status": "missing"
},
{
"slot_key": "settlement_bank_statement",
"status": "missing"
},
{
"slot_key": "proof_of_address",
"status": "missing"
},
{
"slot_key": "shareholder_structure",
"status": "missing"
},
{
"slot_key": "articles_of_incorporation",
"status": "missing"
}
]
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid API Key: invalid-*oken"
}
}{
"error": {
"type": "invalid_request_error",
"code": "missing_resource",
"param": "legal_representative_id",
"message": "No such legal representative: onblr_0ujsswThIGTUYm2K8FjOOfXtY1K",
"doc_url": "https://docs.fintoc.com/reference/errors"
}
}{
"error": {
"type": "invalid_request_error",
"code": "unknown_document_slot",
"param": "slot_key",
"message": "No such document slot: passport",
"doc_url": "https://docs.fintoc.com/reference/errors"
}
}Autorizaciones
Parámetros de ruta
The unique identifier of the entity (for example ent_8anBwgZktbZH6ydyHa6Tm0eM).
The unique identifier of the onboarding (for example onbprc_0ujsswThIGTUYm2K8FjOOfXtY1K).
The unique identifier of the legal representative (for example onblr_0ujsswThIGTUYm2K8FjOOfXtY1K).
The key of the document slot to upload to. identification accepts PDF, JPEG, or PNG files; power_of_attorney accepts PDF files only.
identification, power_of_attorney Cuerpo
The document to upload. The accepted formats depend on slot_key, and the file cannot exceed 30 MB.
Respuesta
Returns the onboarding after Fintoc uploads the document. The legal representative document status is uploaded.
Unique identifier of the onboarding.
"onbprc_0ujsswThIGTUYm2K8FjOOfXtY1K"
Type of the object. Always onboarding.
Reviewed data for the onboarding, grouped by type. Onboardings created through the API include company_information and transactional_profile. Fintoc sets declaration_accepted to true on creation and returns incorporation_date as an ISO 8601 datetime in UTC.
{
"company_information": {
"incorporation_date": "2020-01-15T00:00:00.000Z",
"business_activity": "Servicios financieros",
"fiscal_address": "Av. Reforma 123, CDMX",
"business_address": "Av. Insurgentes 456, CDMX",
"settlement_account": "000000000000000000",
"phone": "+521111111111"
},
"transactional_profile": {
"resource_origins": ["trusts", "investments"],
"monthly_amount_range": "1_500000",
"monthly_operations_range": "1_15000",
"declaration_accepted": true
}
}
Document slots for the onboarding, with their upload status.
Show child attributes
Show child attributes
Identifier of the entity this onboarding belongs to. null if not associated with an entity.
"ent_8anBwgZktbZH6ydyHa6Tm0eM"
Legal representatives declared for the entity.
Show child attributes
Show child attributes
ISO 8601 datetime, in UTC, of when the onboarding was reviewed. null until it is reviewed.
"2026-01-16T09:00:00Z"
Shareholders declared for the entity.
Show child attributes
Show child attributes
Channel the onboarding is being completed through. One of api or dashboard.
api, dashboard "api"
Current status of the onboarding. One of pending, in_progress, submitted, approved, rejected or cancelled.
pending, in_progress, submitted, approved, rejected, cancelled "pending"
Whether the onboarding has every required field and document completed and can be submitted for review.
false
ISO 8601 datetime, in UTC, of when the onboarding was submitted for review. null until it is submitted.
"2026-01-15T14:30:00Z"
Type of the onboarding: account_holder or settlement_recipient.
account_holder, settlement_recipient "account_holder"
¿Esta página le ayudó?