Skip to main content

Create a capital deposit case

Create a capital deposit case for a new company. One API call starts onboarding for the main company and all shareholders.

Multi-step process

This page covers the first part of a multi-step process: creating the case, completing onboarding, and uploading documents. Refer to the France guide for the whole process.

Overviewโ€‹

The createCapitalDeposit mutation is the new entry point for the capital deposit product, replacing the deprecated createCapitalDepositCase mutation.

A single call creates:

  • One onboarding for the main company being formed.
  • One onboarding for each company shareholder, if any.
  • One onboarding for each individual shareholder, if any.

Provide all shareholder data in the initial request. This mutation is designed for one complete submission. You can update a company or individual onboarding to make corrections, but updates aren't the intended path for building a case incrementally.

What's newโ€‹

createCapitalDeposit replaces the monolithic onboardingInfo block from createCapitalDepositCase with structured, per-entity inputs aligned with the standard Swan onboarding format.

Deprecated (createCapitalDepositCase)New (createCapitalDeposit)
companyShareholders[].onboardingInfoshareholders[].company with accountInfo, accountAdmin, company, and oAuthRedirectParameters
individualShareholders[].onboardingInfoshareholders[].individual with accountInfo, accountAdmin, and oAuthRedirectParameters
onboardingInfo.accountNameaccountInfo.name
representativescompany.relatedIndividuals[] with the type LegalRepresentative
individualUltimateBeneficialOwnerscompany.relatedIndividuals[] with the type UltimateBeneficialOwner
direct and indirect booleansownership.type (Direct or Indirect) and ownership.totalPercentage
languageaccountAdmin.preferredLanguage

The mutation accepts three top-level fields:

createCapitalDeposit(input: {
acquisitionChannel: ... # How you acquired the end user
mainCompany: { ... } # The company being incorporated
shareholders: [ ... ] # One entry per shareholder
})

Each entry in shareholders must contain exactly one of company or individual:

{ company: { ... } }      # Company shareholder
{ individual: { ... } } # Individual shareholder

Step 1: Prepare your dataโ€‹

Collect the following information for each entity before calling the mutation.

Field Requirements Legend

โ— REQ Required:Must be completed.
โ— CND Conditional:Required only in specific situations.
โ—‹ OPT Optional:Isn't required; may have a default value.

On this page, โ— REQ means the mutation rejects the call without the field. โ— CND means the mutation accepts the call without the field, but Swan sets the onboarding status to Invalid until you provide it. Query statusInfo.errors on each onboarding before finalizing it, then update the onboarding with the missing values.

For every account, the account name is optional. If you don't provide one, Swan uses dรฉpรดt de capital โ€” <holder name> by default.

Main company

Data to prepareRequirementAPI field
Company nameโ— REQmainCompany.company.name
Trade nameโ—‹ OPTmainCompany.company.tradeName
Legal form codeโ— CNDmainCompany.company.legalFormCode
Registration numberโ—‹ OPTmainCompany.company.registrationNumber
Registered addressโ— CNDmainCompany.company.address
Business activityโ— CNDmainCompany.company.businessActivity, mainCompany.company.businessActivityCode, mainCompany.company.businessActivityDescription
Account adminโ— REQmainCompany.accountAdmin
UBOs and legal representativesโ— CNDmainCompany.company.relatedIndividuals
Account nameโ—‹ OPTmainCompany.accountInfo.name
Redirect URLโ— REQmainCompany.oAuthRedirectParameters.redirectUrl

The main company isn't incorporated yet, so its registration number is optional.

Each company shareholder

Data to prepareRequirementAPI field
Capital contributionโ— REQshareholders[].company.capitalDepositAmount
Company nameโ— REQshareholders[].company.company.name
Trade nameโ—‹ OPTshareholders[].company.company.tradeName
Legal form codeโ— CNDshareholders[].company.company.legalFormCode
Registration numberโ— CNDshareholders[].company.company.registrationNumber
Registered addressโ— CNDshareholders[].company.company.address
Business activityโ— CNDshareholders[].company.company.businessActivity, shareholders[].company.company.businessActivityCode, shareholders[].company.company.businessActivityDescription
Account adminโ— REQshareholders[].company.accountAdmin
UBOs and legal representativesโ— CNDshareholders[].company.company.relatedIndividuals
Account nameโ—‹ OPTshareholders[].company.accountInfo.name
Redirect URLโ— REQshareholders[].company.oAuthRedirectParameters.redirectUrl

Company shareholders are registered legal entities, so provide their registration number.

Pre-fill for French companies

For company shareholders registered in France, use the companyInfoRegistryData query with the company's registration number to retrieve data from the National Business Register (RNE). Pass the results to the mutation to pre-fill company fields.

For complete field-level requirements and required-document rules, refer to company onboarding fields.

Each individual shareholder

Data to prepareRequirementAPI field
Capital contributionโ— REQshareholders[].individual.capitalDepositAmount
First and last nameโ— REQshareholders[].individual.accountAdmin.firstName and lastName
Date and place of birthโ— REQshareholders[].individual.accountAdmin.birthInfo
Nationalityโ— REQshareholders[].individual.accountAdmin.nationality
Addressโ— CNDshareholders[].individual.accountAdmin.address
Employment status and incomeโ— CNDshareholders[].individual.accountAdmin.employmentStatus and monthlyIncome
FATCA informationโ— CNDshareholders[].individual.accountAdmin.unitedStatesTaxInfo
Account nameโ—‹ OPTshareholders[].individual.accountInfo.name
Redirect URLโ— REQshareholders[].individual.oAuthRedirectParameters.redirectUrl

For complete field-level requirements and required-document rules, refer to individual onboarding fields.

Use the legalForms query to get all valid legal form codes for a country, with localized names and abbreviations.

Open in API Explorer
query GetLegalForms {
legalForms(country: "FRA") {
code
country
localName
localAbbreviation
}
}

Model UBOs across the ownership structureโ€‹

When a company is a shareholder of the company being incorporated, declare UBOs at both company levels:

  1. Declare the UBOs of the company shareholder in shareholders[].company.company.relatedIndividuals.
  2. Declare the individuals who ultimately own the main company, directly or through a company shareholder, in mainCompany.company.relatedIndividuals.

The same individual can appear in both places, but calculate the ownership percentage relative to the entity being described.

MyBrand
โ”œโ”€โ”€ 50% owned directly by Henri Dupont
โ””โ”€โ”€ 50% owned by MyBrand Company Shareholder
โ””โ”€โ”€ 100% owned by Jules Fleury
IndividualEntityRelationshipPercentage
Henri DupontMyBrandDirect UBO50%
Jules FleuryMyBrandIndirect UBO through the company shareholder50%
Jules FleuryMyBrand Company ShareholderDirect UBO100%

The percentage in the main company UBO entry is the person's effective ownership of the main company. It's not necessarily the percentage they hold in the intermediate company. For example, if an intermediate company owns 50% of the main company and an individual owns 60% of that intermediate company, the individual's indirect ownership of the main company is 30%.

A legal representative isn't automatically a UBO. Choose the type that matches the individual's roles:

  • UltimateBeneficialOwner for a UBO only.
  • LegalRepresentative for a legal representative only.
  • LegalRepresentativeAndUltimateBeneficialOwner when the same individual has both roles.
relatedCompanies doesn't model ownership

Only use relatedCompanies when a legal entity acts as the legal representative of another company. Represent shareholder ownership through the shareholder company and its relatedIndividuals.

Step 2: Call the mutationโ€‹

The following example shows a case with one company shareholder and one individual shareholder.

Mutationโ€‹

Open in API Explorer
mutation CreateCapitalDeposit {
createCapitalDeposit(
input: {
acquisitionChannel: OutboundAccountingFirm

mainCompany: {
accountInfo: {
name: "dรฉpรดt de capital โ€” MyBrand"
}

accountAdmin: {
firstName: "Jules"
lastName: "Fleury"
email: "bonjour@mybrand.fr"
preferredLanguage: fr
nationality: "FRA"
typeOfRepresentation: LegalRepresentative
birthInfo: {
birthDate: "1990-06-01"
city: "Paris"
country: "FRA"
postalCode: "75007"
}
address: {
addressLine1: "10 rue Duris"
addressLine2: "Bรขtiment A"
country: "FRA"
city: "Paris"
postalCode: "75020"
state: "Ile de France"
}
}

company: {
name: "MyBrand"
legalFormCode: "6CHY"
tradeName: "MB"
address: {
addressLine1: "168 Rue Saint-Maur"
addressLine2: "Bรขtiment A"
country: "FRA"
city: "Paris"
postalCode: "75011"
state: "Ile de France"
}
businessActivity: AccommodationAndFoodService
businessActivityDescription: "Establishment that serves traditional French cuisine."
monthlyPaymentVolume: Between50000And100000
regulatoryClassification: NonFinancialActive
relatedIndividuals: [
{
# Henri Dupont - direct UBO holding 50%
type: UltimateBeneficialOwner
firstName: "Henri"
lastName: "Dupont"
sex: Male
nationality: "FRA"
birthInfo: {
birthDate: "1988-02-25"
city: "Paris"
country: "FRA"
postalCode: "75008"
}
address: {
addressLine1: "24 Rue Saint-Ambroise"
addressLine2: "Bรขtiment A"
country: "FRA"
city: "Paris"
postalCode: "75011"
state: "Ile de France"
}
unitedStatesTaxInfo: {
isUnitedStatesPerson: false
}
ultimateBeneficialOwner: {
qualificationType: Ownership
ownership: {
type: Direct
totalPercentage: 50
}
}
}
{
# Jules Fleury - indirect UBO holding 50% and legal representative
type: LegalRepresentativeAndUltimateBeneficialOwner
firstName: "Jules"
lastName: "Fleury"
sex: Male
nationality: "FRA"
birthInfo: {
birthDate: "1990-06-01"
city: "Paris"
country: "FRA"
postalCode: "75007"
}
address: {
addressLine1: "10 rue Duris"
addressLine2: "Bรขtiment A"
country: "FRA"
city: "Paris"
postalCode: "75020"
state: "Ile de France"
}
unitedStatesTaxInfo: {
isUnitedStatesPerson: false
}
ultimateBeneficialOwner: {
qualificationType: Ownership
ownership: {
type: Indirect
totalPercentage: 50
}
}
legalRepresentative: {
roles: ["President"]
}
}
]
}

oAuthRedirectParameters: {
redirectUrl: "https://www.mybrand.fr"
}
}

shareholders: [
{
company: {
capitalDepositAmount: {
value: "500"
currency: "EUR"
}

accountInfo: {
name: "dรฉpรดt de capital โ€” MyBrand Company Shareholder"
}

accountAdmin: {
firstName: "Jules"
lastName: "Fleury"
email: "companyshareholder@mybrand.fr"
preferredLanguage: fr
nationality: "FRA"
typeOfRepresentation: LegalRepresentative
birthInfo: {
birthDate: "1990-06-01"
city: "Paris"
country: "FRA"
postalCode: "75007"
}
address: {
addressLine1: "10 rue Duris"
addressLine2: "Bรขtiment A"
country: "FRA"
city: "Paris"
postalCode: "75020"
state: "Ile de France"
}
}

company: {
name: "MyBrand Company Shareholder"
legalFormCode: "6CHY"
tradeName: "MyBrand CS"
address: {
addressLine1: "91 rue du Faubourg Saint-Honorรฉ"
addressLine2: "Bรขtiment A"
country: "FRA"
city: "Paris"
postalCode: "75008"
state: "Ile de France"
}
businessActivity: AccommodationAndFoodService
businessActivityDescription: "Establishment that serves traditional French cuisine."
monthlyPaymentVolume: Between50000And100000
regulatoryClassification: NonFinancialActive
registrationNumber: "853827103"
taxIdentificationNumber: "853827103"
vatNumber: "FR90853827103"
relatedIndividuals: [
{
# Jules Fleury - 100% direct UBO and legal representative
type: LegalRepresentativeAndUltimateBeneficialOwner
firstName: "Jules"
lastName: "Fleury"
sex: Male
nationality: "FRA"
birthInfo: {
birthDate: "1990-06-01"
city: "Paris"
country: "FRA"
postalCode: "75007"
}
address: {
addressLine1: "10 rue Duris"
addressLine2: "Bรขtiment A"
country: "FRA"
city: "Paris"
postalCode: "75020"
state: "Ile de France"
}
unitedStatesTaxInfo: {
isUnitedStatesPerson: false
}
ultimateBeneficialOwner: {
qualificationType: Ownership
ownership: {
type: Direct
totalPercentage: 100
}
}
legalRepresentative: {
roles: ["President"]
}
}
]
}

oAuthRedirectParameters: {
redirectUrl: "https://www.mybrand.fr"
}
}
}

{
individual: {
capitalDepositAmount: {
value: "500"
currency: "EUR"
}

accountInfo: {
name: "dรฉpรดt de capital โ€” Henri Dupont"
}

accountAdmin: {
firstName: "Henri"
lastName: "Dupont"
email: "henri.dupont@mybrand.fr"
preferredLanguage: fr
nationality: "FRA"
employmentStatus: Entrepreneur
monthlyIncome: MoreThan4500
birthInfo: {
birthDate: "1988-02-25"
city: "Paris"
country: "FRA"
postalCode: "75008"
}
address: {
addressLine1: "24 Rue Saint-Ambroise"
addressLine2: "Bรขtiment A"
country: "FRA"
city: "Paris"
postalCode: "75011"
state: "Ile de France"
}
# Required to finalize an individual onboarding
unitedStatesTaxInfo: {
isUnitedStatesPerson: false
}
}

oAuthRedirectParameters: {
redirectUrl: "https://www.mybrand.fr"
}
}
}
]
}
) {
__typename

... on CreateCapitalDepositSuccessPayload {
capitalDepositCase {
id

statusInfo {
status
}

totalCapitalDepositAmount {
currency
value
}

companyOnboarding {
id
onboardingUrl
statusInfo {
status
validationVersion
... on OnboardingInvalidStatusInfo {
errors {
details
errors
field
}
}
}
}

shareholders {
id
status
onboarding {
id
onboardingUrl
statusInfo {
status
validationVersion
... on OnboardingInvalidStatusInfo {
errors {
details
errors
field
}
}
}
}
}
}
}

... on CapitalDepositShareholdersEmptyRejection {
message
}

... on CapitalDepositMainCompanyOnboardingRejection {
message
fields {
message
path
}
}

... on CapitalDepositShareholderOnboardingRejection {
message
fields {
message
path
}
}
}
}

Payloadโ€‹

The success payload returns the case, the main company onboarding, and one entry per shareholder, in the order you sent them. The highlighted lines are the IDs to store: the case (line 6), the main company onboarding (line 15), and each shareholder with its onboarding (lines 24, 27, 36, and 39). Every onboarding in this example is Valid, so no errors array is returned.

{
"data": {
"createCapitalDeposit": {
"__typename": "CreateCapitalDepositSuccessPayload",
"capitalDepositCase": {
"id": "a4c9da36-56e1-4ed8-b0a1-2c9f3d7e8b12",
"statusInfo": {
"status": "WaitingForInitialRequirements"
},
"totalCapitalDepositAmount": {
"currency": "EUR",
"value": "1000"
},
"companyOnboarding": {
"id": "3f9c2b1e-7d4a-4e8f-9a6b-1c2d3e4f5a60",
"onboardingUrl": "https://api.banking.swan.io/projects/$PROJECT_ID/onboardings/3f9c2b1e-7d4a-4e8f-9a6b-1c2d3e4f5a60?lang=fr",
"statusInfo": {
"status": "Valid",
"validationVersion": "V2"
}
},
"shareholders": [
{
"id": "8b1e6f2a-0c3d-4a5b-8e9f-6a7b8c9d0e11",
"status": "PendingOnboarding",
"onboarding": {
"id": "c7d2e9f0-1a2b-4c3d-9e8f-7a6b5c4d3e22",
"onboardingUrl": "https://api.banking.swan.io/projects/$PROJECT_ID/onboardings/c7d2e9f0-1a2b-4c3d-9e8f-7a6b5c4d3e22?lang=fr",
"statusInfo": {
"status": "Valid",
"validationVersion": "V2"
}
}
},
{
"id": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f33",
"status": "PendingOnboarding",
"onboarding": {
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a44",
"onboardingUrl": "https://api.banking.swan.io/projects/$PROJECT_ID/onboardings/e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a44?lang=fr",
"statusInfo": {
"status": "Valid",
"validationVersion": "V2"
}
}
}
]
}
}
}
}

Step 3: Store IDs and check onboarding statusโ€‹

From a successful response, store:

  • capitalDepositCase.id: your reference for the full case.
  • capitalDepositCase.companyOnboarding.id: to track the main company onboarding. Also store onboardingUrl to redirect your user, unless your integration is API-only.
  • shareholders[].onboarding.id: to track each shareholder onboarding. Also store each onboardingUrl, unless your integration is API-only.

A successful mutation doesn't mean every onboarding is ready to be finalized.

Check every onboarding status

Always check statusInfo.status on companyOnboarding and on each shareholders[].onboarding. Swan can create an onboarding with the status Invalid when a required field is missing. Get information about the onboarding, read the errors array, and fix the issue before finalization.

Example of a case created with an invalid onboarding:

{
"capitalDepositCase": {
"statusInfo": { "status": "WaitingForInitialRequirements" },
"companyOnboarding": {
"statusInfo": {
"status": "Invalid",
"validationVersion": "V2",
"errors": [
{
"field": "company.legalFormCode",
"details": "Invalid input: expected string, received null"
}
]
}
}
}
}
Required documents per onboarding

The documents needed to complete an onboarding depend on the entity and context. Before asking your user to complete the flow, get a list of required onboarding documents.

Step 4: Complete onboarding and KYCโ€‹

After your users finalize their onboardings, the KYC process for each entity begins with the identification of each account admin (the first account membership, with legalRepresentative: true).

Step 5: Upload required documentsโ€‹

For the list of required documents by stakeholder, who provides each one, and where it's attached, refer to the capital deposits overview.

After you create the case, the capital deposit case status is WaitingForInitialRequirements. The case stays in this status until all of the following are complete:

  • All required capital deposit documents are Uploaded.
  • All shareholders passed KYC verification and reached the status CapitalTransferred.
  • The main company onboarding is completed.

Document upload and KYC happen in parallel, so you don't need to wait for shareholders to finish their onboarding. Start uploading as soon as the documents are available.

When all conditions are met, the case transitions to PendingInternalReview. For the full lifecycle and status transitions, refer to the capital deposits overview.

The case and each shareholder have a documents array with pre-assigned document IDs and types. Query the case for the document IDs. Then upload each document using the two-step signed URL flow.

Queryโ€‹

Open in API Explorer
query GetCapitalDepositDocuments {
capitalDepositCase(id: "$YOUR_CAPITALDEPOSITCASE_ID") {
documents {
id
type
statusInfo {
status
}
}
shareholders {
id
documents {
id
type
statusInfo {
status
}
}
}
}
}

Payloadโ€‹

Each document placeholder is created with the status Pending. The highlighted lines are the document IDs to store: case documents (lines 6, 13, and 20) and the individual shareholder's proof of address (line 36). The company shareholder has an empty documents array because Swan collects its registry extract during onboarding.

{
"data": {
"capitalDepositCase": {
"documents": [
{
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c01",
"type": "ArticlesOfIncorporation",
"statusInfo": {
"status": "Pending"
}
},
{
"id": "1b2c3d4e-5f6a-4b7c-9d8e-0f1a2b3c4d02",
"type": "CompanyLeaseAgreement",
"statusInfo": {
"status": "Pending"
}
},
{
"id": "2c3d4e5f-6a7b-4c8d-8e9f-1a2b3c4d5e03",
"type": "PowerOfAttorney",
"statusInfo": {
"status": "Pending"
}
}
],
"shareholders": [
{
"id": "8b1e6f2a-0c3d-4a5b-8e9f-6a7b8c9d0e11",
"documents": []
},
{
"id": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f33",
"documents": [
{
"id": "3d4e5f6a-7b8c-4d9e-9f0a-2b3c4d5e6f04",
"type": "ProofOfIndividualAddress",
"statusInfo": {
"status": "Pending"
}
}
]
}
]
}
}
}

Rejectionsโ€‹

Rejection typeMeaning
CapitalDepositShareholdersEmptyRejectionNo shareholder was provided.
CapitalDepositMainCompanyOnboardingRejectionThe main company onboarding data is invalid.
CapitalDepositShareholderOnboardingRejectionA shareholder onboarding entry is invalid.

The fields array in each rejection identifies the exact field and path causing the error:

{
"__typename": "CapitalDepositShareholderOnboardingRejection",
"fields": [
{
"message": "Legal form code is invalid.",
"path": ["shareholders", "0", "company", "company", "legalFormCode"]
}
]
}