Skip to content

Commit 1c03e93

Browse files
Doc 1456/wip onboarding v2 preview complete list of changes (#502)
* First draft * Accuracy updates * Update index.mdx * Draft v2 * Update index.mdx * Dravt v4 * Update sidebars.js * Apply suggestions from code review Co-authored-by: racene-swan <[email protected]> * Apply suggestions from code review * Update index.mdx --------- Co-authored-by: racene-swan <[email protected]>
1 parent cb58d3f commit 1c03e93

File tree

5 files changed

+421
-10
lines changed

5 files changed

+421
-10
lines changed

docs/preview/index.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ These features are in active development and will be available soon. Some may be
1414

1515
| Feature | Description | ETA |
1616
|---------|-------------|-----|
17-
| <span style={{whiteSpace: 'nowrap'}}>-</span> | - | <span style={{whiteSpace: 'nowrap'}}>-</span> |
17+
| <span style={{whiteSpace: 'nowrap'}}>[Account onboarding enhancements](/preview/new-onboarding)</span> | Redesigned onboarding mutations and queries with cleaner naming, typed responses, and improved data collection for compliance. | <span style={{whiteSpace: 'nowrap'}}>Q1, 2026</span> |
1818

1919
</div>
2020

@@ -26,6 +26,6 @@ These features are in beta and available for testing. We use feedback to refine
2626

2727
| Feature | Description | ETA |
2828
|---------|-------------|-----|
29-
| <span style={{whiteSpace: 'nowrap'}}>[Card insurance](card-insurance)</span> | Comprehensive insurance coverage for Swan-issued cards including theft, fraud, and travel protection | <span style={{whiteSpace: 'nowrap'}}>In private beta</span> |
29+
| <span style={{whiteSpace: 'nowrap'}}>[Card insurance](/preview/card-insurance)</span> | Comprehensive insurance coverage for Swan-issued cards including theft, fraud, and travel protection. | <span style={{whiteSpace: 'nowrap'}}>In private beta</span> |
3030

3131
</div>
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
---
2+
title: Company onboarding fields
3+
---
4+
5+
# Company onboarding fields
6+
7+
Field reference for company account holder onboarding.
8+
9+
:::warning Work in progress
10+
Field requirements and validations are being finalized. This section will be updated before release.
11+
:::
12+
13+
## Account
14+
15+
| API v1 | API v2 |
16+
|---|---|
17+
| `accountCountry` | `accountInfo.country` |
18+
| `accountName` | `accountInfo.name` |
19+
| - | `accountInfo.intendedUsages` <sup>(new)</sup> |
20+
21+
## Account administrator
22+
23+
| API v1 | API v2 |
24+
|---|---|
25+
| `legalRepresentativePersonalAddress.addressLine1` | `accountAdmin.address.addressLine1` |
26+
| `legalRepresentativePersonalAddress.addressLine2` | `accountAdmin.address.addressLine2` |
27+
| `legalRepresentativePersonalAddress.city` | `accountAdmin.address.city` |
28+
| `legalRepresentativePersonalAddress.country` | `accountAdmin.address.country` |
29+
| `legalRepresentativePersonalAddress.postalCode` | `accountAdmin.address.postalCode` |
30+
| `legalRepresentativePersonalAddress.state` | `accountAdmin.address.state` |
31+
| - | `accountAdmin.birthInfo.birthDate` <sup>(new)</sup> |
32+
| - | `accountAdmin.birthInfo.city` <sup>(new)</sup> |
33+
| - | `accountAdmin.birthInfo.country` <sup>(new)</sup> |
34+
| - | `accountAdmin.birthInfo.postalCode` <sup>(new)</sup> |
35+
| `email` | `accountAdmin.email` |
36+
| - | `accountAdmin.firstName` |
37+
| - | `accountAdmin.lastName` <sup>(new)</sup> |
38+
| - | `accountAdmin.nationality` <sup>(new)</sup> |
39+
| `language` | `accountAdmin.preferredLanguage` |
40+
| - | `accountAdmin.taxIdentificationNumber` <sup>(new)</sup> |
41+
| `typeOfRepresentation` | `accountAdmin.typeOfRepresentation` |
42+
| - | `accountAdmin.unitedStatesTaxInfo.isUnitedStatesPerson` <sup>(new)</sup> |
43+
| - | `accountAdmin.unitedStatesTaxInfo.unitedStatesTaxIdentificationNumber` <sup>(new)</sup> |
44+
| - | `accountAdmin.userDeviceInfo.geoloc.lat` <sup>(new)</sup> |
45+
| - | `accountAdmin.userDeviceInfo.geoloc.lng` <sup>(new)</sup> |
46+
| - | `accountAdmin.userDeviceInfo.ip` <sup>(new)</sup> |
47+
| - | `accountAdmin.userDeviceInfo.userAgent` <sup>(new)</sup> |
48+
49+
## Company
50+
51+
| API v1 | API v2 |
52+
|---|---|
53+
| `residencyAddress.addressLine1` | `company.address.addressLine1` |
54+
| `residencyAddress.addressLine2` | `company.address.addressLine2` |
55+
| `residencyAddress.city` | `company.address.city` |
56+
| `residencyAddress.country` | `company.address.country` |
57+
| `residencyAddress.postalCode` | `company.address.postalCode` |
58+
| `residencyAddress.state` | `company.address.state` |
59+
| `acquisitionChannel` | `company.acquisitionChannel` |
60+
| `businessActivityDescription` | `company.businessActivityDescription` |
61+
| - | `company.businessActivityCode` <sup>(new)</sup> |
62+
| `companyType` | `company.companyType` |
63+
| - | `company.forecastYearlyIncome` <sup>(new)</sup> |
64+
| - | `company.headcount` <sup>(new)</sup> |
65+
| - | `company.legalFormCode` <sup>(new)</sup> |
66+
| `monthlyPaymentVolume` | `company.monthlyPaymentVolume` |
67+
| `name` | `company.name` |
68+
| - | `company.registrationDate` <sup>(new)</sup> |
69+
| `registrationNumber` | `company.registrationNumber` |
70+
| - | `company.regulatoryClassification` <sup>(new)</sup> |
71+
| - | `company.signupDate` <sup>(new)</sup> |
72+
| `taxIdentificationNumber` | `company.taxIdentificationNumber` |
73+
| `tradeName` | `company.tradeName` |
74+
| `vatNumber` | `company.vatNumber` |
75+
| - | `company.websites` <sup>(new)</sup> |
76+
77+
### Legal representative information
78+
79+
| API v1 | API v2 |
80+
|---|---|
81+
| `representatives[i].residencyAddress.addressLine1` | `company.representatives[i].address.addressLine1` |
82+
| `representatives[i].residencyAddress.addressLine2` | `company.representatives[i].address.addressLine2` |
83+
| `representatives[i].residencyAddress.city` | `company.representatives[i].address.city` |
84+
| `representatives[i].residencyAddress.country` | `company.representatives[i].address.country` |
85+
| `representatives[i].residencyAddress.postalCode` | `company.representatives[i].address.postalCode` |
86+
| `representatives[i].residencyAddress.state` | `company.representatives[i].address.state` |
87+
| `representatives[i].birthDate` | `company.representatives[i].birthInfo.birthDate` |
88+
| `representatives[i].birthCity` | `company.representatives[i].birthInfo.city` |
89+
| `representatives[i].birthCountryCode` | `company.representatives[i].birthInfo.country` |
90+
| `representatives[i].birthCityPostalCode` | `company.representatives[i].birthInfo.postalCode` |
91+
| `representatives[i].entityName` | `company.representatives[i].entityName` |
92+
| `representatives[i].firstName` | `company.representatives[i].firstName` |
93+
| `representatives[i].lastName` | `company.representatives[i].lastName` |
94+
| `representatives[i].legalForm` | `company.representatives[i].legalForm` |
95+
| `representatives[i].nationality` | `company.representatives[i].nationality` |
96+
| `representatives[i].preferredFirstName` | `company.representatives[i].preferredFirstName` |
97+
| `representatives[i].registrationNumber` | `company.representatives[i].registrationNumber` |
98+
| `representatives[i].roles` | `company.representatives[i].roles` |
99+
| `representatives[i].gender` | `company.representatives[i].sex` |
100+
| `representatives[i].type` | `company.representatives[i].type` |
101+
| - | `company.representatives[i].email` <sup>(new)</sup> |
102+
103+
### Ultimate Beneficial Owners
104+
105+
| API v1 | API v2 |
106+
|---|---|
107+
| `individualUltimateBeneficialOwners[i].residencyAddress.addressLine1` | `company.ultimateBeneficialOwners[i].address.addressLine1` |
108+
| `individualUltimateBeneficialOwners[i].residencyAddress.addressLine2` | `company.ultimateBeneficialOwners[i].address.addressLine2` |
109+
| `individualUltimateBeneficialOwners[i].residencyAddress.city` | `company.ultimateBeneficialOwners[i].address.city` |
110+
| `individualUltimateBeneficialOwners[i].residencyAddress.country` | `company.ultimateBeneficialOwners[i].address.country` |
111+
| `individualUltimateBeneficialOwners[i].residencyAddress.postalCode` | `company.ultimateBeneficialOwners[i].address.postalCode` |
112+
| `individualUltimateBeneficialOwners[i].residencyAddress.state` | `company.ultimateBeneficialOwners[i].address.state` |
113+
| `individualUltimateBeneficialOwners[i].birthDate` | `company.ultimateBeneficialOwners[i].birthInfo.birthDate` |
114+
| `individualUltimateBeneficialOwners[i].birthCity` | `company.ultimateBeneficialOwners[i].birthInfo.city` |
115+
| `individualUltimateBeneficialOwners[i].birthCountryCode` | `company.ultimateBeneficialOwners[i].birthInfo.country` |
116+
| `individualUltimateBeneficialOwners[i].birthCityPostalCode` | `company.ultimateBeneficialOwners[i].birthInfo.postalCode` |
117+
| - | `company.ultimateBeneficialOwners[i].controlTypes` <sup>(new)</sup> |
118+
| `individualUltimateBeneficialOwners[i].firstName` | `company.ultimateBeneficialOwners[i].firstName` |
119+
| `individualUltimateBeneficialOwners[i].identityDocumentDetails.expiryDate` | `company.ultimateBeneficialOwners[i].identityDocumentDetails.expiryDate` |
120+
| `individualUltimateBeneficialOwners[i].identityDocumentDetails.issueDate` | `company.ultimateBeneficialOwners[i].identityDocumentDetails.issueDate` |
121+
| `individualUltimateBeneficialOwners[i].identityDocumentDetails.issuingAuthority` | `company.ultimateBeneficialOwners[i].identityDocumentDetails.issuingAuthority` |
122+
| `individualUltimateBeneficialOwners[i].identityDocumentDetails.number` | `company.ultimateBeneficialOwners[i].identityDocumentDetails.number` |
123+
| `individualUltimateBeneficialOwners[i].identityDocumentDetails.type` | `company.ultimateBeneficialOwners[i].identityDocumentDetails.type` |
124+
| `individualUltimateBeneficialOwners[i].lastName` | `company.ultimateBeneficialOwners[i].lastName` |
125+
| `individualUltimateBeneficialOwners[i].direct` | `company.ultimateBeneficialOwners[i].ownership.direct` |
126+
| `individualUltimateBeneficialOwners[i].indirect` | `company.ultimateBeneficialOwners[i].ownership.indirect` |
127+
| `individualUltimateBeneficialOwners[i].totalCapitalPercentage` | `company.ultimateBeneficialOwners[i].ownership.percentage` |
128+
| - | `company.ultimateBeneficialOwners[i].qualificationType` <sup>(new)</sup> |
129+
| `individualUltimateBeneficialOwners[i].gender` | `company.ultimateBeneficialOwners[i].sex` |
130+
| `individualUltimateBeneficialOwners[i].taxIdentificationNumber` | `company.ultimateBeneficialOwners[i].taxIdentificationNumber` |
131+
| - | `company.ultimateBeneficialOwners[i].unitedStatesTaxInfo.isUnitedStatesPerson` <sup>(new)</sup> |
132+
| - | `company.ultimateBeneficialOwners[i].unitedStatesTaxInfo.unitedStatesTaxIdentificationNumber` <sup>(new)</sup> |
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
---
2+
title: Account onboarding enhancements
3+
---
4+
5+
# Account onboarding enhancements
6+
7+
Redesigned onboarding mutations and queries with cleaner naming, typed responses, and improved data collection for enhanced risk assessment and regulatory compliance.
8+
9+
:::info Target availability
10+
This API is in active development and will be available by the end of Q1 2026.
11+
:::
12+
13+
## Overview
14+
15+
We are introducing a redesigned onboarding API that replaces the existing mutations and queries. The new API provides improved developer experience through consistent naming conventions, structured input types, and typed responses.
16+
17+
### What's changing
18+
19+
| Aspect | Current API | New API |
20+
|---|---|---|
21+
| **Naming** | Mixed patterns (`onboardIndividualAccountHolder`, `unauthenticatedOnboardPublic...`). | Consistent pattern (`createIndividualAccountHolderOnboarding`, `createPublicIndividualAccountHolderOnboarding`). |
22+
| **Input structure** | Flat input with all fields at root level. | Nested structure with `accountInfo`, `accountAdmin`, and `company` objects. |
23+
| **Data requirements** | Limited data collection. | New fields to strengthen risk assessment and compliance. |
24+
| **Response types** | Generic `Onboarding` type for all responses. | Typed `IndividualAccountHolderOnboarding` and `CompanyAccountHolderOnboarding`. |
25+
| **Registry data** | Automatically populates empty onboarding fields. | Dedicated query; no auto-population. |
26+
27+
### Authentication patterns
28+
29+
The new API uses a consistent pattern across all endpoints.
30+
31+
| Endpoint type | Token required | Use case |
32+
|---|---|---|
33+
| `Public` mutations and queries | None | Public onboarding links. |
34+
| Standard mutations and queries | Project access token | Backend integrations, partner-initiated onboarding. |
35+
| `finalize` mutation | User access token | Completing onboarding after user identification. |
36+
37+
## Individual onboarding
38+
39+
### Create an individual onboarding
40+
41+
Call the `createIndividualAccountHolderOnboarding` mutation with a project access token.
42+
43+
| New mutation | Replaces |
44+
|---|---|
45+
| `createIndividualAccountHolderOnboarding` | `onboardIndividualAccountHolder` |
46+
| `createPublicIndividualAccountHolderOnboarding` | `unauthenticatedOnboardPublicIndividualAccountHolder` |
47+
48+
The input uses a nested structure with two required objects:
49+
50+
- `accountInfo`: Account-level details (`country`, `name`, `intendedUsages` <sup>(new)</sup>).
51+
- `accountAdmin`: Individual's personal information (`email`, `employmentStatus`, `monthlyIncome`, `address`, `sourcesOfFunds` <sup>(new)</sup>, etc.).
52+
53+
```graphql
54+
input CreateIndividualAccountHolderOnboardingInput {
55+
accountInfo: IndividualAccountHolderOnboardingAccountInput!
56+
accountAdmin: IndividualAccountHolderOnboardingAccountAdminInput!
57+
oAuthRedirectParameters: OAuthRedirectParametersInput
58+
}
59+
```
60+
61+
### Update an individual onboarding
62+
63+
Call the `updateIndividualAccountHolderOnboarding` mutation with a project access token.
64+
65+
| New mutation | Replaces |
66+
|---|---|
67+
| `updateIndividualAccountHolderOnboarding` | `updateIndividualOnboarding` |
68+
| `updatePublicIndividualAccountHolderOnboarding` | `unauthenticatedUpdateIndividualOnboarding` |
69+
70+
## Company onboarding
71+
72+
### Create a company onboarding
73+
74+
Call the `createCompanyAccountHolderOnboarding` mutation with a project access token.
75+
76+
| New mutation | Replaces |
77+
|---|---|
78+
| `createCompanyAccountHolderOnboarding` | `onboardCompanyAccountHolder` |
79+
| `createPublicCompanyAccountHolderOnboarding` | `unauthenticatedOnboardPublicCompanyAccountHolder` |
80+
81+
The input uses a nested structure with three required objects:
82+
83+
- `accountInfo`: Account-level details (`country`, `name`, `intendedUsages` <sup>(new)</sup>).
84+
- `accountAdmin`: Legal representative's personal information (`email`, `firstName`, `lastName`, `typeOfRepresentation`, etc.).
85+
- `company`: Company details (`registrationNumber`, `name`, `legalForm`, `ultimateBeneficialOwners`, `representatives`, etc.).
86+
87+
```graphql
88+
input CreateCompanyAccountHolderOnboardingInput {
89+
accountInfo: CompanyAccountHolderOnboardingAccountInput!
90+
accountAdmin: CompanyAccountHolderOnboardingAccountAdminInput!
91+
oAuthRedirectParameters: OAuthRedirectParametersInput
92+
company: CompanyInfoInput!
93+
}
94+
```
95+
96+
### Update a company onboarding
97+
98+
Call the `updateCompanyAccountHolderOnboarding` mutation with a project access token.
99+
100+
| New mutation | Replaces |
101+
|---|---|
102+
| `updateCompanyAccountHolderOnboarding` | `updateCompanyOnboarding` |
103+
| `updatePublicCompanyAccountHolderOnboarding` | `unauthenticatedUpdateCompanyOnboarding` |
104+
105+
## Finalize onboarding
106+
107+
The `finalizeAccountHolderOnboarding` mutation replaces `finalizeOnboarding`. It requires a **user access token** and returns an `AccountHolderOnboarding` union type.
108+
109+
| New mutation | Replaces |
110+
|---|---|
111+
| `finalizeAccountHolderOnboarding` | `finalizeOnboarding` |
112+
113+
## Queries
114+
115+
### Retrieve onboarding information
116+
117+
| New query | Authentication | Replaces |
118+
|---|---|---|
119+
| `publicAccountHolderOnboarding` | None | `onboardingInfo` |
120+
| `accountHolderOnboarding` | Project access token | `onboarding` |
121+
| `accountHolderOnboardings` | Project access token | `onboardings` |
122+
123+
Single-onboarding queries return a payload union that includes the `AccountHolderOnboarding` on success. The `accountHolderOnboardings` query returns an `AccountHolderOnboardingConnection` for [paginated results](/developers/using-api/pagination).
124+
125+
### Company registry data
126+
127+
A new dedicated query retrieves company information from official registries, enabling pre-fill capabilities for smoother onboarding. Currently available for companies registered in **France (`FRA`) only**. This replaces the previous behavior where empty onboarding fields were automatically populated with registry data.
128+
129+
| New query | Authentication |
130+
|---|---|
131+
| `companyInfoRegistryData` | Project access token |
132+
133+
The query requires a `registrationNumber` and `residencyAddressCountry`.
134+
135+
:::caution Behavior change
136+
The new API **does not** automatically populate onboarding fields with registry data. You must explicitly query the registry, then use that data when creating or updating the onboarding.
137+
:::
138+
139+
#### Query
140+
141+
```graphql
142+
query GetCompanyRegistryData {
143+
companyInfoRegistryData(
144+
input: {
145+
registrationNumber: "123456789"
146+
residencyAddressCountry: FRA
147+
}
148+
) {
149+
... on CompanyInfoRegistryDataSuccessPayload {
150+
companyInfo {
151+
name
152+
legalForm
153+
registrationDate
154+
address {
155+
addressLine1
156+
city
157+
postalCode
158+
country
159+
}
160+
ultimateBeneficialOwners {
161+
firstName
162+
lastName
163+
}
164+
representatives {
165+
... on OnboardingIndividualRepresentative {
166+
firstName
167+
lastName
168+
roles
169+
}
170+
}
171+
}
172+
}
173+
... on CompanyRegistryNotFoundRejection {
174+
message
175+
registrationNumber
176+
country
177+
}
178+
}
179+
}
180+
```
181+
182+
## Field reference
183+
184+
:::warning Work in progress
185+
Field requirements and validations are being finalized. This section will be updated before release.
186+
:::
187+
188+
The following pages provide complete field mappings from the deprecated API to the new API:
189+
190+
- [Individual onboarding fields](./individual)
191+
- [Company onboarding fields](./company)
192+
193+
Field requirements vary by country. French company onboardings support pre-fill via the `companyInfoRegistryData` query for company, representative, and UBO fields.
194+
195+
## Response types
196+
197+
### IndividualAccountHolderOnboarding
198+
199+
```graphql
200+
type IndividualAccountHolderOnboarding implements AccountHolderOnboardingBase {
201+
id: ID!
202+
statusInfo: OnboardingStatusInfo!
203+
supportingDocumentCollection: SupportingDocumentCollection
204+
createdAt: DateTime!
205+
updatedAt: DateTime!
206+
accountInfo: IndividualAccountHolderOnboardingAccount
207+
accountAdmin: IndividualAccountHolderOnboardingAccountAdmin
208+
}
209+
```
210+
211+
### CompanyAccountHolderOnboarding
212+
213+
```graphql
214+
type CompanyAccountHolderOnboarding implements AccountHolderOnboardingBase {
215+
id: ID!
216+
statusInfo: OnboardingStatusInfo!
217+
supportingDocumentCollection: SupportingDocumentCollection
218+
createdAt: DateTime!
219+
updatedAt: DateTime!
220+
accountInfo: CompanyAccountHolderOnboardingAccount
221+
accountAdmin: CompanyAccountHolderOnboardingAccountAdmin
222+
company: CompanyInfo
223+
}
224+
```
225+
226+
### AccountHolderOnboarding union
227+
228+
```graphql
229+
union AccountHolderOnboarding = IndividualAccountHolderOnboarding | CompanyAccountHolderOnboarding
230+
```

0 commit comments

Comments
 (0)