curl --request PUT \
--url https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{id}/documents/{slot_key} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: multipart/form-data' \
--form file=@example-fileimport requests
url = "https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{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}/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}/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}/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}/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}/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": {
"legal_name": "Acme SA de CV"
}
},
"legal_representatives": [],
"shareholders": [],
"documents": [
{
"slot_key": "proof_of_address",
"status": "uploaded"
}
]
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid API Key: invalid-*oken"
}
}{
"error": {
"type": "invalid_request_error",
"code": "missing_resource",
"param": "id",
"message": "No such onboarding: onbprc_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: nonexistent_slot",
"doc_url": "https://docs.fintoc.com/reference/errors"
}
}Upload an onboarding document
Use this endpoint to upload a document to an onboarding document slot, identified by slot_key. Send the file as multipart/form-data. The file cannot exceed 30 MB and must be a PDF. The proof_of_address slot also accepts JPEG and PNG files. Uploading a document to a slot that already has one replaces the existing document. 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}/documents/{slot_key} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: multipart/form-data' \
--form file=@example-fileimport requests
url = "https://api.fintoc.com/v2/entities/{entity_id}/onboardings/{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}/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}/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}/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}/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}/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": {
"legal_name": "Acme SA de CV"
}
},
"legal_representatives": [],
"shareholders": [],
"documents": [
{
"slot_key": "proof_of_address",
"status": "uploaded"
}
]
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid API Key: invalid-*oken"
}
}{
"error": {
"type": "invalid_request_error",
"code": "missing_resource",
"param": "id",
"message": "No such onboarding: onbprc_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: nonexistent_slot",
"doc_url": "https://docs.fintoc.com/reference/errors"
}
}Authorizations
Path Parameters
The unique identifier of the entity (for example ent_8anBwgZktbZH6ydyHa6Tm0eM).
The unique identifier of the onboarding (for example onbprc_0ujsswThIGTUYm2K8FjOOfXtY1K).
Key of a document slot listed in the onboarding's documents (for example proof_of_address or uaf_registration_certificate).
Body
Document to upload, up to 30 MB. Must be a PDF. The proof_of_address slot also accepts JPEG and PNG files.
Response
Returns the onboarding after Fintoc uploads the document. The slot status is uploaded.
Unique identifier of the onboarding.
"onbprc_0ujsswThIGTUYm2K8FjOOfXtY1K"
Type of the object. Always onboarding.
Reviewed answers, grouped by step. The fields depend on the onboarding type and the entity's country. Chilean account holders include company_basics, company_information, senior_management, transactional_profile, and plaft. Mexican account holders include company_information and transactional_profile, with declaration_accepted set to true and incorporation_date returned as an ISO 8601 datetime in UTC.
{
"company_information": {
"incorporation_date": "2020-01-15T00:00:00.000Z",
"business_activity": "Servicios financieros",
"sector": "ecommerce",
"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_2000000",
"monthly_operations_range": "1_15000",
"account_purpose": "own_sales_collection",
"declaration_accepted": true
}
}
Document slots for the onboarding, with their upload status. A slot that accepts more than one file appears once per uploaded file, repeating its slot_key. A slot with no files appears once, with status set to missing. Chilean account holders always list uaf_registration_certificate and plaft_manual_and_policies, but you upload them only if plaft.uaf_obligated is true.
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"
Was this page helpful?