Entity that can own Account objects after approval, without using the dashboard.
This flow is for platforms that create an Entity for each client, such as marketplaces or wallets that hold balances under each client’s legal name. To create Account objects under your own root Entity, see Create more accounts instead.
AvailabilityOnboarding by API supports client
Entity objects in Chile and Mexico. This guide covers the account_holder type, which opens a company as an account holder. An Entity that only receives its share of split payments uses the settlement_recipient type instead. See Accept split payments.data fields, the document slots, and the account number format. Chilean onboardings have no shareholder documents, so they skip Step 5.
Before you start
You need a secret key from the dashboard, under Developers → API Keys. The key you send selects the mode:sk_test_... runs in test, and sk_live_... runs in live.
Use test mode to build and verify your integration. Use live mode to onboard each real client. These are separate activities, not two phases of one flow. A test onboarding is a different object from a live onboarding and never becomes a live onboarding. Onboarding a client in test does not advance that client’s live onboarding. The examples below use a test key.
Your organization also needs its own root Entity (is_root set to true) in the same mode as the API key you send. Fintoc checks this requirement when you create a client Entity. To onboard clients in live, your organization needs a live root Entity. To build in test, your organization needs a test root Entity.
Step 1: Create the entity
AnEntity is the legal account holder. Create one for your client with their legal name and tax ID. The account_holder type onboards companies only, so holder_id must identify a company.
- Chile
- Mexico
Set Fintoc stores the RUT without dots or hyphen. A RUT that belongs to an individual creates the
country_code to cl, and set holder_id to the company’s Chilean tax ID (RUT). holder_id is required and must be a valid RUT, with or without dots and hyphen. An invalid RUT returns 400 Bad Request with the code invalid_holder_id.Entity, but creating its account_holder onboarding returns 422 Unprocessable Entity with the code holder_type_not_supported.Entity ID (ent_...); every onboarding call uses this value. See The Entity object for the full attribute list.
If your organization has no root Entity in the mode of your API key, Fintoc rejects the request with 422 Unprocessable Entity, type set to invalid_request_error, and code set to organization_without_operational_root_entity:
Error response
Entity in that mode, contact Fintoc support before you create client Entity objects.
Step 2: Create the onboarding
TheOnboarding holds the Know Your Customer review for one Entity. The review covers the company, its legal representatives, its transactional profile, and its shareholders. Create one onboarding per Entity.
The request body has two top-level fields, both required. Set type to account_holder, the type this guide covers. The other accepted value, settlement_recipient, has its own flow in Accept split payments. Send the review data in data. The keys of data depend on the Entity’s country, and every key is required. See Account holder onboarding for every field, enum value, and validation rule.
Omitting type or data returns 400 Bad Request with the code missing_parameter. A type outside the accepted values returns 400 Bad Request with the code invalid_enum. The error message names the accepted values.
An Entity holds at most one onboarding per mode, so the same Entity can hold one live onboarding and one test onboarding at the same time. A second onboarding in the same mode returns 409 Conflict, even when the first one is already rejected.
- Chile
- Mexico
A Chilean onboarding sends seven keys in Four details to note in the Chilean response:
data: company_basics, company_information, senior_management, legal_representatives, shareholders, transactional_profile, and plaft.documentsdepends oncompany_basics.incorporation_type. Atraditionalcompany opens the slots above. Aone_day_company(Empresa en un Día) openscurrent_shareholders_certificateinstead ofactivities_start_certificateandgood_standing_certificate.documentsalways listsuaf_registration_certificateandplaft_manual_and_policies. You upload them only whenplaft.uaf_obligatedistrue.- Each legal representative has its own
documentsarray with two slots: the front and the back of the identity document. - Each shareholder has
documentset tonull, because Chile requires no document per shareholder.
identification_number and each shareholder’s holder_id take a Chilean tax ID (RUT) when nationality is cl. A foreign legal representative uses a passport number.Response (abridged) shows only the fields that the step changes, not the whole object. The full response also returns data, which echoes the step data you sent, except legal_representatives and shareholders. Each legal representative and shareholder also carries the identity fields from the request. See The Onboarding object for the full shape.
Three details apply in both countries:
submittableisfalseuntil every required field and document is in place.documentslists each company document slot and itsstatus, eithermissingoruploaded. Read this array to identify outstanding documents.- A
legal_entityshareholder can include nestedchildren.
Step 3: Upload the company documents
Upload one file to each company document slot in thedocuments array with PUT .../documents/{slot_key}. Send the file as multipart/form-data in the file field. The maximum file size is 20 MB.
A slot accepts either one file or multiple files. On a single-file slot, PUT replaces the existing file. On a multi-file slot, PUT adds a file and keeps the files already uploaded. See Manage files in a slot.
- Chile
- Mexico
Every Chilean company slot accepts Repeat for each remaining required slot. Add the files for
application/pdf only. The slots you must fill depend on the data you sent in Step 2:A
PUT to a slot the onboarding does not open, such as current_shareholders_certificate on a traditional company, returns 422 Unprocessable Entity with the code unknown_document_slot.incorporation_amendments and plaft_manual_and_policies one at a time, as Manage files in a slot shows.422 Unprocessable Entity with the code unsupported_content_type. The error message lists the content types the slot accepts.
Manage files in a slot
Thedocuments array returns one entry per uploaded file. Each uploaded entry carries its own id. A multi-file slot with three files appears three times in documents, once per file, with the same slot_key. A slot with no files appears once, with status set to missing and no id.
To add a file to a multi-file slot, call POST .../documents/{slot_key} with the same multipart/form-data body as PUT. The example below uses incorporation_amendments, a multi-file slot of a Chilean onboarding that accepts application/pdf only. A Mexican account_holder onboarding has no multi-file slot:
POST on a single-file slot returns 422 Unprocessable Entity with the code single_file_document_slot. Use PUT to replace the file in a single-file slot.
To remove one file, call DELETE .../documents/{slot_key}/{document_id} with the file’s id from the documents array:
POST and DELETE calls return the updated onboarding. An id that does not belong to that slot returns 404 Not Found with the code missing_resource. Once you submit the onboarding, you can no longer add or remove files.
To replace one file in a multi-file slot, call DELETE for that file and then POST the new file.
Step 4: Upload each legal representative’s documents
Each legal representative needs two documents. Use the legal representativeid (onblr_...) from the Step 2 response, and pass the slot as the last path segment. The two slots depend on the country:
- Chile
- Mexico
Upload the front and the back of the identity document as two files. The certificate of authority (personería) is not a legal representative slot in Chile. Upload it to the company slot
power_of_attorney in Step 3.422 Unprocessable Entity with the code unknown_document_slot. The example uploads the Mexican identification slot. A Chilean onboarding uses the same path with identification_front or identification_back.
Step 5: Upload each shareholder’s document
Only Mexican onboardings require a document per shareholder. A Chilean onboarding skips this step: each Chilean shareholder hasdocument set to null, and uploading to that shareholder returns 422 Unprocessable Entity with the code shareholder_document_not_required.
In Mexico, each declared shareholder needs one document. Use the shareholder id (onbsh_...) from the Step 2 response. This path carries no slot, because Fintoc derives the slot from the shareholder’s type: identification for a natural_person, and articles_of_incorporation for a legal_entity. The slot accepts application/pdf, image/jpeg, and image/png.
Step 6: Submit for review
Oncesubmittable is true, submit the onboarding for Fintoc to review. The onboarding must be in_progress and include every required field and document. After submission, the onboarding moves to submitted and you can no longer modify it.
submittable turns false once the onboarding is submitted, because a submitted onboarding can no longer accept changes.
If a required field or document is missing, or the onboarding is no longer in_progress, the call returns a 422 Unprocessable Entity error. The param field names the slot or field that blocks the submission:
Error response
- Empresa en un Día status. When
incorporation_typeisone_day_company, Fintoc verifies that the company’s RUT is registered as an Empresa en un Día company. If the company is not, or Fintoc cannot confirm it, the call returns the codenot_one_day_companywithparamset toincorporation_type. If the registry rejects theEntity’s RUT as invalid, the call returns the codeinvalid_rutwithparamset torut. - Effective controller. At least one shareholder must have
effective_controllerset totrue. Otherwise, the call returns the codeeffective_controller_requiredwithparamset toshareholders.
Step 7: Track the review
An onboarding moves throughpending, in_progress, submitted, and then approved, rejected, or cancelled. Fintoc sends one of these webhook events when it approves or rejects the onboarding:
Subscribe to these events in the dashboard under Developers → Webhooks. Each event carries the full reviewed onboarding, including the step data in
data, the documents, and the declared legal_representatives and shareholders, so you do not need to call the API to read what Fintoc reviewed. See the Entity onboarding payload.
You cannot retry a rejected onboarding through the API. Creating a new onboarding for the same Entity returns 409 Conflict, as Step 2 explains. Fintoc can review a rejected onboarding again and approve it, so your handler may receive entity.onboarding.approved after entity.onboarding.rejected for the same onboarding. See Retry after a rejection.
If you don’t use webhooks, poll the onboarding directly:
status to track the onboarding. Once status is approved, the Entity is ready to transact.
Step 8: Get the main account
When the onboarding reachesapproved, Fintoc creates the Entity’s main Account with active status, together with its root account number. You do not need to create the main Account. Before approval, the Entity owns no Account, so no Account is ever pending.
Both modes behave the same: an approved test onboarding creates a test main Account, and an approved live onboarding creates a live one.
List the entity’s accounts to retrieve the main Account, then store the id (acc_...) and the root_account_number for that client. The account number format and the currency depend on the country:
- Chile
- Mexico
A Chilean main
Account holds CLP, and its root_account_number is a Chilean bank account number.Create additional accounts
The mainAccount is enough to send and receive money. Create more Account objects under the same Entity when the client needs separate balances, one per cost center. Pass the Entity ID as entity_id. Each Account has its own balance and root account number. Outbound transfer receipts show the client’s legal name. See Create more accounts for account creation details.
Test the integration
Intest mode, run the full sequence above with your sk_test_... key. Create the Entity and onboarding, upload a sample file to every required slot, and submit the onboarding. Confirm that submittable turns true only after every required slot reports uploaded.
Fintoc selects the mode from the API key you send, not from a request parameter. Onboarding request and response bodies do not carry a mode field. Onboardings are isolated per mode. A test key cannot read or act on a live onboarding, and a live key cannot read or act on a test onboarding. Both cases return 404 Not Found with the code missing_resource. Fintoc resolves entity_id in the API key’s mode, so a test key must reference an Entity that exists in test mode.
Force a review outcome
Inlive mode, submitting starts a real Know Your Customer review that Fintoc’s compliance team decides. In test mode, submitting triggers a simulated review. Use the simulated review to exercise the approved and rejected paths without waiting.
Fintoc decides the simulated review from a magic value in the step data you sent. This mechanism works like a test card number: a magic value forces a specific outcome. The field that carries the value depends on the country:
- Chile
- Mexico
suspicious case leaves reviewed_at set to null. Use it to model an onboarding that is still under review, and check how your integration behaves while it waits for a decision.
A test onboarding follows the same one-per-mode rule, so after a simulated rejection the Entity cannot start a new test onboarding. To run the flow again, create another Entity.
Read the simulated result
POST .../submit returns 200 OK with status set to submitted and reviewed_at set to null, in both modes. The simulated review runs after the response, so do not treat the submit response as the review outcome. Poll the onboarding as shown in Step 7, or listen for the webhook event.
Fintoc delivers entity.onboarding.approved and entity.onboarding.rejected to the webhook endpoints registered in test mode, and the event carries "mode": "test".
Webhook event (abridged)
data carries the reviewed onboarding with the same fields as The Onboarding object, except submittable. It also keeps object_name and entity for backward compatibility. The example shows a Mexican onboarding and trims data, legal_representatives, shareholders, and documents. See the Entity onboarding payload for the full payload. The rejected event carries the same payload, with the event type set to entity.onboarding.rejected and data.status set to rejected.
What test mode does not simulate
Intest mode, Fintoc reproduces the review outcome and the webhook, and nothing else in the compliance flow:
- No rejection reason. A rejected onboarding exposes no field that explains the decision, in the API or in the webhook payload.
- No emails. Fintoc sends no submission notification to the legal representatives in
testmode.
What’s next
- Account holder onboarding for the
dataschema and the document slots of theaccount_holdertype, in Chile and Mexico. - Know Your Customer (KYC) requirements in Chile and KYC requirements in Mexico for the documents Fintoc’s compliance team reviews.
- Create more accounts for an approved
Entity. - Review The Onboarding object and the onboarding endpoints in the API reference.