Defacto Onboarding API
The Onboarding API from Defacto — 9 operation(s) for onboarding.
The Onboarding API from Defacto — 9 operation(s) for onboarding.
openapi: 3.0.0
info:
title: Defacto Accounting Onboarding API
version: v1.0.0
description: Defacto provides instant, embedded financing for SMBs across Europe. This REST API lets partners onboard borrowers, test eligibility and credit limits, upload business/bank data, create invoices, request and manage loans, handle repayments and recollection, issue and manage credit cards, bill fees, and subscribe to webhooks. Reconstructed by API Evangelist from the per-operation OpenAPI fragments published on Defacto's ReadMe developer portal (developers.getdefacto.com/llms.txt). operationId values are the provider's ReadMe reference slugs; summaries are the reference page titles.
contact:
email: contact@getdefacto.com
url: https://developers.getdefacto.com/
servers:
- url: https://api.getdefacto.com
description: Production
- url: https://api-sandbox.getdefacto.com
description: Sandbox
security:
- Bearer: []
tags:
- name: Onboarding
paths:
/borrower/{borrower_id}/repayment-methods:
get:
description: '
<div>
<h3>List available repayment methods for borrower.</h3>
</div>
'
parameters:
- in: path
name: borrower_id
required: true
schema:
type: string
responses:
'200':
description: ''
content:
'*/*':
schema:
$ref: '#/components/schemas/TypedApiPage13'
security:
- Bearer: []
tags:
- Onboarding
operationId: get_borrower-borrower-id-repayment-methods
summary: /borrower/{borrower_id}/repayment-methods
post:
description: '
<div>
<h3>Add and/or choose the repayment method for borrower.</h3>
<p>If payment method is "DIRECT_DEBIT" then the `account` parameter must not be null.</p>
<p>
If `is_default_repayment_method` is true, then the repayment method becomes the borrower''s default
repayment method so that upcmoing loan requests will use this payment method and account as a default.
<br/>
<br/>
<i>
Please note: that the account defined in the `loan_to` attribute of created loans is left
unchanged. If you want to change the destination account of a loan, you must cancel it and
request a new loan.
</i>
</p>
<p>
If `apply_to_all_active_loans` is true, then the repayment method is used for upcoming payments of
all loans that are in TO_REPAY or TO_REPAY_FEES statuses.
</p>
</div>
'
parameters:
- in: path
name: borrower_id
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ApiPostRepaymentMethod'
responses:
'200':
description: ''
content:
'*/*':
schema:
$ref: '#/components/schemas/APIRepaymentMethodDetails'
security:
- Bearer: []
tags:
- Onboarding
operationId: post_borrower-borrower-id-repayment-methods
summary: /borrower/{borrower_id}/repayment-methods
/borrower/{borrower_id}:
get:
description: Retrieve the full profile of a borrower by ID. Returns the borrower's status, business information, accounts, compliance checks, and next actions required.
parameters:
- in: path
name: borrower_id
required: true
schema:
type: string
responses:
'200':
description: ''
content:
'*/*':
schema:
$ref: '#/components/schemas/APIBorrower'
security:
- Bearer: []
tags:
- Onboarding
operationId: get_borrower-borrower-id
summary: /borrower/{borrower_id}
/borrowers:
get:
description: List all borrowers enrolled on Defacto for your account. Borrowers are companies that have been registered and can request loans through the Defacto platform. Returns a paginated list with their status, business info, accounts, and compliance data.
parameters:
- description: UUID(s) of the borrower(s) in Defacto API.
in: query
name: borrower_id
required: false
explode: true
schema:
type: array
items:
format: uuid
type: string
- description: Legal identifier of the business, such as its SIREN in France.
in: query
name: borrower_identifier
required: false
x-nullable: true
schema:
type: string
default: null
- description: Pagination cursor from the previous response's next_page field. Omit to get the first page.
in: query
name: cursor
required: false
x-nullable: true
schema:
type: string
default: null
- description: Filter borrowers who signed their contract on or after this datetime.
in: query
name: from_signed_at
required: false
x-nullable: true
schema:
type: string
format: date-time
default: null
- description: Maximum number of items to return per page.
in: query
name: page_size
required: false
schema:
type: integer
default: 100
- description: Filter borrowers who signed their contract on or before this datetime.
in: query
name: to_signed_at
required: false
x-nullable: true
schema:
type: string
format: date-time
default: null
responses:
'200':
description: ''
content:
'*/*':
schema:
$ref: '#/components/schemas/TypedApiPage12'
security:
- Bearer: []
tags:
- Onboarding
operationId: get_borrowers
summary: /borrowers
post:
description: "\n<div>\n<h3>Enroll a new borrower on Defacto.</h3>\n<p>\nThis API will create a borrower and a credit line for this borrower. More information\nin the <b>behavior</b> section below.\n</p>\n<p>\n<strong>Timeout:</strong> 30 seconds (status code will be 504 in such a case)\n</p>\n<br/>\n<h4>Required data</h4>\n<p>\nBorrower must be a commercial company -> eg. in France needs to be registered at an RCS.\n</p>\n<p>\n<b>If the borrower repays by direct debit, the following information are mandatory:</b>\n</p>\n<ul>\n<li> the director’s personal information: Name, birth date, nationality, email address and country of\nresidence of the managing director</li>\n<li>The IBAN of the borrower (please make sure that the borrower is aware\nthat direct debit is used as the repayment method).</li>\n</ul>\n<p>\nWe strongly recommend that you fill up all the information when you can, even on the sandbox.\nFor French borrowers, we manage to pull most of the director information automatically,\nhowever for other countries, this might not be the case.\nFor the borrowers that Defacto is not able to fetch the mandatory data, you need to provide them\nto ensure borrower creation. Otherwise the API will return a 400 error and list the values that it could\nnot obtain.\n</p>\n<h4>Behavior</h4>\n<p>\nThis API endpoint creates a borrower in our system,\nconfigures our system to get the repayment of the loan,\nevaluates the maximum amount of money we can lend to this company and creates a credit line for this\nborrower.\nAfter the credit line is created for this borrower, you can get it with\n<code>GET /credit-lines?borrower=<THE_COMPANY_NUMBER_OF_THE_BORROWER></code>. <br/>\n<b>Synchronous and asynchronous behaviors are offered.</b> </br>\n</p>\n<p>Synchronous behavior:</br></p>\n<ul>\n<li>Set <code>'wait_for_ready': true</code> to activate it</li>\n<li>\n<b>You can <code>GET /credit-lines?borrower=<THE_COMPANY_NUMBER_OF_THE_BORROWER></code>\nand request a loan right after you received the answer from this API endpoint</b>\n</li>\n<li>Response takes from 4 to 8 seconds</li>\n<li>\nThe API answers after the solvency of the company is evaluated and the credit line is created,\nor returns an error.\n</li>\n</ul>\n<br/>\n<p>Asynchronous behavior (default one):</p>\n<ul>\n<li>Set <code>'wait_for_ready': false</code> to activate it</li>\n</li>\n<li>\nOur system will evaluate the solvency of the company and create its credit line after answering\nthe API call.\n<li>\nSo, a loan cannot be requested right after this endpoint answers. You must wait for the creation\nof the credit line. To discover it, you can either subscribe to the CreditLine.CREATED webhook or\nregularly fetch <code>GET /credit-lines?borrower=<THE_COMPANY_NUMBER_OF_THE_BORROWER></code>.\n</li>\n <li>Response takes between 0.3 and 1.5 second.</li>\n</ul>\n<blockquote class=\"callout callout_warn\" theme=\"\U0001F6A7\">\n<h3 class=\"callout-heading\">\n<span class=\"callout-icon\">\U0001F6A7</span>\n<p>Careful if you subscribe to the CreditLine.CREATED webhook!</p>\n</h3>\n<p>\nIf you subscribe to the webhook, please note that there is an inconsistency in the API at the\nmoment. The webhook sends a <code>borrower_id</code> that does not correspond to the borrower id that\nyou received with this endpoint (it's rather a business_id in our DB, that you cannot fetch).\n</p>\n<p>\nSo at the moment we recommend you to\n<code>GET /credit-lines?borrower=<THE_COMPANY_NUMBER_OF_THE_BORROWER></code> for all borrowers waiting\nfor a credit line when you receive the webhook event.\n</p>\n</blockquote>\n</div>\n"
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/APIPostBorrower'
responses:
'201':
description: ''
content:
'*/*':
schema:
$ref: '#/components/schemas/APIBorrower'
security:
- Bearer: []
tags:
- Onboarding
operationId: post_borrowers
summary: /borrowers
/business/public-data:
get:
description: Search for borrower business information from various sources. This endpoint lets you find the right business identifier to use when onboarding a borrower or counterparty.
parameters:
- in: query
name: city
required: false
x-nullable: true
schema:
type: string
default: null
- in: query
name: country
required: false
x-nullable: true
schema:
type: string
default: null
- in: query
name: identifier
required: true
schema:
type: string
- in: query
name: identifier_type
required: false
schema:
type: string
enum:
- hr_nummer
default: hr_nummer
- in: query
name: name
required: false
x-nullable: true
schema:
type: string
default: null
- in: query
name: postal_code
required: false
x-nullable: true
schema:
type: string
default: null
- in: query
name: street
required: false
x-nullable: true
schema:
type: string
default: null
responses:
'200':
description: ''
content:
'*/*':
schema:
items:
$ref: '#/components/schemas/ApiBusinessDataSearchOutput'
type: array
security:
- Bearer: []
tags:
- Onboarding
operationId: get_business-public-data
summary: /business/public-data
/onboarding/{onboarding_id}:
get:
description: '
## [Partners] Follow the onboarding of a business
If you haven''t visited the guide: [how to make your first loan?](https://developers.getdefacto.com/reference/make-your-first-loan) we recommend you to visit it first.
When your borrower is on our web app, sharing his financial data, you might want to keep track of his onboarding.
This endpoints will let you get access to the onboarding status and details.
You''ll be able to know if the borrower has shared his financial data and is ready to request loans;
how much does defacto proposes to lend him; and more.
'
parameters:
- in: path
name: onboarding_id
required: true
schema:
type: string
responses:
'200':
description: ''
content:
'*/*':
schema:
$ref: '#/components/schemas/APIOnboarding'
security:
- Bearer: []
tags:
- Onboarding
operationId: get_onboarding-onboarding-id
summary: /onboarding/{onboarding_id}
/borrower/{borrower_id}/deactivate:
post:
parameters:
- in: path
name: borrower_id
required: true
schema:
type: string
responses:
'204':
description: ''
content:
'*/*':
schema: {}
security:
- Bearer: []
tags:
- Onboarding
operationId: post_borrower-borrower-id-deactivate
summary: /borrower/{borrower_id}/deactivate
/borrower/{borrower_id}/owner:
post:
description: Create a borrower owner with identity documents
parameters:
- in: path
name: borrower_id
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/APICreateOwner'
responses:
'201':
description: ''
content:
'*/*':
schema:
$ref: '#/components/schemas/APIOwnerCreatedResponse'
security:
- Bearer: []
tags:
- Onboarding
operationId: post_borrower-borrower-id-owner
summary: /borrower/{borrower_id}/owner
/borrower/{borrower_id}/sign:
post:
description: Register the date a new borrower accepted our T&Cs
parameters:
- in: path
name: borrower_id
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/SignedInput'
responses:
'200':
description: ''
content:
'*/*':
schema:
$ref: '#/components/schemas/APIBorrower'
security:
- Bearer: []
tags:
- Onboarding
operationId: post_borrower-borrower-id-sign
summary: /borrower/{borrower_id}/sign
/onboardings:
post:
description: "\n## [Partners] Start onboarding a new business\n\nIf you haven't visited the guide: [how to make your first loan?](https://developers.getdefacto.com/reference/make-your-first-loan) we recommend you to visit it first.\n\n**Timeout after**: 30 seconds (status code will be 504 in such a case)\n\nIn order to request loans you will need to have borrowers. In order to test borrower's eligibility, we'll need\nto have access to borrower business' financial data.\n\nThis can be achieved in two ways:\nEither you have this piece of information and you may use the\n[sharing business data](https://developers.getdefacto.com/reference/post_business-data-account-transactions)\nAPI documentation to do so, or you might want to rely on defacto's onboarding process to get this information.\n\nIn the later, you will need to create an onboarding for the business you want to request loans for.\n\n### Behavior\nWhen you send this API request providing business information, your referral and callback url:\nThe system will start an onboarding for you and you will get its id in the response.\n\nThen you must redirect the borrower to the onboarding tunnel so that he can select his financial\ntools and share as much data as he wants to max-out his eligible amount:\n\n- **In the normal case**, redirect him to\n `https://app.getdefacto.com/onboarding/continue/{onboarding_id}`.\n- **When the response contains a `secure_resume_link`**, redirect him to that link *instead* of the\n bare continue URL above. This happens when the business already has a bank-connected onboarding:\n to avoid exposing another party's financial data, that tunnel is gated and can only be reopened by\n a link carrying a short-lived secure token. The `secure_resume_link` is exactly that\n pre-authenticated continue URL. It is valid for **2 hours** — if it expires, POST /onboarding again\n to obtain a fresh one.\n\nOnce borrower has accepted defacto's T&Cs and created his account, he'll be redirected back to the redirect_url\nyou provided and if you subscribed to `CREDIT_LINE.Created` webhook you will receive it shortly.\nRead [webhook](https://developers.getdefacto.com/reference/webhooks-at-defacto) for details.\n\n### Frequently Asked Questions\n\n**How do I get onboarding results?**\nYou can use the GET /onboarding/{onboarding_id} endpoint to retrieve the onboarding results.\n\n**What should I do if the status of the onboarding is expired?**\nOnboardings last for 168 hours;\nafter what you'll have to repeat the POST /onboarding request you just made.\n\n**How do I get the borrower's ID once onboarding is `COMPLETED`?**\nYou can use the GET /onboarding/{onboarding_id} endpoint to retrieve the borrower's ID under the `borrower_id`\nattribute; or you can GET /borrowers/?identifier={business_identifier} to directly get the borrower object.\n"
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/APIOnboardingCreationRequest'
responses:
'200':
description: ''
content:
'*/*':
schema:
$ref: '#/components/schemas/APIOnboarding'
security:
- Bearer: []
tags:
- Onboarding
operationId: post_onboardings
summary: /onboardings
components:
schemas:
PublicApiAccountNumber:
properties:
account_number:
description: The account identifier. Only IBANs are supported at the moment.
type: string
account_number_type:
default: iban
description: The type of account number (e.g. IBAN).
enum:
- iban
type: string
bank_identifier:
default: null
description: The identifier of the bank.
type: string
nullable: true
bank_identifier_type:
default: bic
description: The type of bank identifier (e.g. BIC).
enum:
- bic
type: string
required:
- account_number
type: object
APILightAccount:
properties:
account_name:
default: null
description: A name given to this account. Any name can be given.
type: string
nullable: true
account_number:
description: The account identifier. Only IBANs are supported at the moment.
type: string
account_number_type:
description: The type of account number (e.g. IBAN).
enum:
- account_number
- iban
- internal_id
type: string
bank_identifier:
description: The identifier of the bank.
type: string
bank_identifier_type:
description: The type of bank identifier (e.g. BIC).
enum:
- bic
- name
- routing_number
- undefined
type: string
required:
- account_number
- account_number_type
- bank_identifier
- bank_identifier_type
type: object
APIOnboardingBusiness:
properties:
defacto_segment:
default: null
enum:
- CAT1
- CAT2
- CAT3
- CAT4
- null
type: string
nullable: true
identifier:
type: string
identifier_type:
enum:
- belgium_registration_number
- bsn
- cif
- hr_nummer
- kvk
- name
- nif
- siren
- siret
- steuernummer
- vat_number
type: string
name:
type: string
required:
- identifier
- identifier_type
- name
type: object
UserInput:
properties:
desired_amount_euros:
default: null
type: integer
nullable: true
desired_timeline:
default: null
type: string
nullable: true
frequency:
default: null
enum:
- permanent
- temporary
- null
type: string
nullable: true
immediate_need:
default: null
type: string
nullable: true
integrations_need:
default: null
items:
type: string
type: array
nullable: true
no_enrollment_category:
default: null
type: string
nullable: true
no_enrollment_detail:
default: null
type: string
nullable: true
reason_for_not_connecting_bank_account:
allOf:
- $ref: '#/components/schemas/ReasonForNotConnectingBankAccount'
default: null
nullable: true
user_need:
default: null
type: string
nullable: true
type: object
APIAddress:
properties:
address_line_1:
default: null
type: string
nullable: true
address_line_2:
default: null
type: string
nullable: true
city:
default: null
type: string
nullable: true
country:
default: null
type: string
nullable: true
postal_code:
default: null
maxLength: 10
type: string
nullable: true
state:
default: null
type: string
nullable: true
type: object
BorrowerComplianceChecks:
properties:
status:
enum:
- APPROVED
- PENDING_USER_ACTION
- REJECTED
- REVIEWING
- UNKNOWN
type: string
required:
- status
type: object
APIDirector:
properties:
address:
allOf:
- $ref: '#/components/schemas/APIAddress'
default: null
description: Address of the person.
nullable: true
birth_date:
default: null
description: Birth date of the person. (YYYY-MM-DD)
format: date
type: string
nullable: true
birth_place:
allOf:
- $ref: '#/components/schemas/BirthPlace'
default: null
description: Birth place of the person.
nullable: true
business_email:
default: null
format: email
type: string
nullable: true
business_phone_number:
default: null
description: PhoneNumber
type: string
nullable: true
entity_type:
default: people
enum:
- account
- account_detail_verification
- bill
- borrower
- borrower_financial_product
- business
- business_exposure
- business_financial_product
- contract
- counterparty
- country
- credit_card
- credit_line
- data_request
- deposit
- due_interest
- eligibility_request
- enrollment
- entity_eligibility
- financial_product
- flag
- installment
- invoice
- loan
- loan_log
- mandate
- max_exposure_deployment
- onboarding
- onboarding_financial_product
- payment
- people
- rac
- raw_data
- recollection_document
- revenue_share
- sandbox_invoice
- underwriting_check
type: string
first_name:
default: null
description: The first name of the person.
type: string
nullable: true
id:
default: null
nullable: true
identifier:
default: null
description: Legal identifier of the business, such as its SIRET or SIREN in France. Must not contain spaces.
type: string
nullable: true
identifier_type:
default: null
description: Type of legal business identifier of the business, such as the SIRET in France.
enum:
- belgium_registration_number
- bsn
- cif
- hr_nummer
- kvk
- name
- nif
- siren
- siret
- steuernummer
- vat_number
- null
type: string
nullable: true
last_name:
default: null
description: The first name of the person.
type: string
nullable: true
legal_name:
default: null
description: Legal name of the business.
type: string
nullable: true
nationality:
default: null
description: Nationality of the person. Must be a ISO 3166 alpha-3 country code (e.g. FRA).
type: string
nullable: true
role:
default: DIRECTOR
enum:
- DIRECTOR
- NON_DIRECTOR
type: string
siege_address:
allOf:
- $ref: '#/components/schemas/APIAddress'
default: null
description: Address of the business head quarters.
nullable: true
title:
default: null
description: Title of the person (e.g. M., Dr., etc.)
type: string
nullable: true
type: object
APIPostBorrower:
properties:
account_number:
default: null
description: The account identifier. Only IBANs are supported at the moment.
type: string
nullable: true
address:
allOf:
- $ref: '#/components/schemas/BusinessAddress'
default: null
nullable: true
directors:
default: null
items:
$ref: '#/components/schemas/APICreateDirector'
minItems: 1
type: array
nullable: true
identifier:
description: Legal identifier of the business, such as its SIRET or SIREN in France. Must not contain spaces.
type: string
identifier_type:
default: null
description: Type of legal business identifier of the business, such as the SIRET in France.
enum:
- belgium_registration_number
- bsn
- cif
- hr_nummer
- kvk
- nif
- siren
- siret
- steuernummer
- vat_number
- null
type: string
nullable: true
legal_form:
default: null
description: Legal form of the business.
type: string
nullable: true
metadata:
additionalProperties:
nullable: true
default: null
description: This object is yours, it enables you to add custom data.
type: object
nullable: true
name:
default: null
description: Legal name of the business.
type: string
nullable: true
owner:
allOf:
- $ref: '#/components/schemas/APICreateOwner'
default: null
description: The person requesting subscribing to Defacto on behalf of the borrowers. Must be added as a director too
nullable: true
preferred_language:
default: null
description: 'Preferred language of the borrower in format ISO 639-1 (examples: [fr, en, es, de, nl]).'
type: string
nullable: true
signed_at:
default: null
description: datetime of the borrower's signature. Usually time the borrower clicked on our T&Cs checkbox
format: date-time
type: string
nullable: true
vat_number:
default: null
description: VatNumber
type: string
nullable: true
wait_for_ready:
default: false
description: Wait for the borrower to be ready to request a first loan.Many actions have to run in the background (KYC, scoring, contract generation and so on).We recommend you to subscribe to the CreditLine.CREATED webhook in order to be notified in real time when the credit line is available.
type: boolean
required:
- identifier
type: object
TypedApiPage12:
properties:
count:
type: integer
data:
items:
$ref: '#/components/schemas/APIBorrower'
type: array
next_page:
default: null
type: string
nullable: true
page_size:
type: integer
previous_page:
default: null
type: string
nullable: true
total:
default: null
type: integer
nullable: true
required:
- count
- page_size
type: object
CreateAddress:
properties:
address_line_1:
default: null
type: string
nullable: true
address_line_2:
default: null
type: string
nullable: true
city:
default: null
type: string
nullable: true
country:
default: null
type: string
nullable: true
postal_code:
default: null
maxLength: 10
type: string
nullable: true
state:
default: null
type: string
nullable: true
type: object
APIEnrollment:
properties:
agent_feedback:
default: null
type: string
nullable: true
enrollment_campaign:
type: string
enrollment_name:
type: string
entity_id:
format: uuid
type: string
entity_type:
enum:
- BORROWER
- ONBOARDING
type: string
id:
format: uuid
type: string
recommendations:
default: null
items:
nullable: true
type: array
nullable: true
status:
type: string
submitted_at:
default: null
format: date-time
type: string
nullable: true
required:
- enrollment_campaign
- enrollment_name
- entity_id
- entity_type
- id
- status
type: object
APIBorrower:
properties:
accounts:
description: Bank accounts of the business.
items:
$ref: '#/components/schemas/APILightAccount'
type: array
active_enrollments:
items:
$ref: '#/components/schemas/APIEnrollment'
type: array
address:
allOf:
- $ref: '#/components/schemas/Address'
default: null
nullable: true
can_reonboard:
default: false
type: boolean
nullable: true
compliance_checks:
allOf:
- $ref: '#/components/schemas/BorrowerComplianceChecks'
default: null
description: '[deprecated] Compliance checks state of the borrower. Tells about KYB and KYC procedure progression.'
nullable: true
contract_id:
default: null
format: uuid
type: string
nullable: true
contract_s3_url:
default: null
description: Pre-signed url to download the contract
type: string
nullable: true
directors:
default: null
description: Directors of the business.
items:
$ref: '#/components/schemas/APIDirector'
minItems: 1
type:
# --- truncated at 32 KB (70 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/defacto/refs/heads/main/openapi/defacto-onboarding-api-openapi.yml