Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions changelog/2026/2026-01-15.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
title: 15 January 2026
type: release
---

## New features

📖 Subscribe to email notifications directly from the [Changelog](/changelog) to stay informed about API updates and breaking changes.

## Improvements

📄 The [`generateTransactionStatement` mutation](https://api-reference.swan.io/mutations/generate-transaction-statement/) now works for incoming and outgoing `Booked` [International Credit Transfers](/topics/payments/credit-transfers/international/). Use it to prove a transaction was executed by Swan.

## API updates

### Upcoming breaking changes

🌍 Starting January 19, a new `accountId` field is available as an optional parameter in [`internationalBeneficiaryDynamicForms`](https://api-reference.swan.io/queries/international-beneficiary-dynamic-forms/). It becomes mandatory on **March 31, 2026**. Update your integration during this period to ensure continued support for international credit transfer queries.

### Reminders

📆 On **April 1, 2026**, the following fields will be removed from the [`accountStatement`](https://api-reference.swan.io/queries/account-statement/) and [`Account.statements`](https://api-reference.swan.io/objects/account/) queries and from the [`generateAccountStatement`](https://api-reference.swan.io/mutations/generate-account-statement/) mutation response:

- `fees` will be replaced by `feeCredits` and `feeDebits`.
- `status` will be replaced by the `statusInfo` object.
- The statement download `url`, previously in the `type` object, will only be available in `statusInfo`.
3 changes: 3 additions & 0 deletions changelog/2026/2026-01-29.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@


📅 Set card spending limits based on calendar periods (resetting monthly on the 1st, weekly on Monday, or daily at midnight) instead of rolling periods. Calendar-based limits make it easier for finance teams to control budgets by calendar month, week, or day. Configure calendar limits using the new `mode` field in [`SpendingLimitInput`](https://api-reference.swan.io/inputs/spending-limit-input/) with options for `daily`, `weekly`, or `monthly` calendar recurrence.
4 changes: 4 additions & 0 deletions docs/topics/accounts/documents/guide-upload-onboarding.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ curl --location --request POST '$UPLOAD_URL' \
When you upload a document with the HTTP POST cURL command, Amazon sends a *204: No content error*, **but the document was successfully uploaded**.
:::

:::info Programmatic uploads
When uploading via code (not cURL), send the file as a readable stream and ensure your HTTP client sets the `Content-Length` header correctly. Some libraries require this explicitly for multipart form uploads.
:::

## Dashboard: Onboarding {#dashboard-onboarding}

Use the Dashboard to upload required documents.
Expand Down
6 changes: 2 additions & 4 deletions docs/topics/onboarding/company/guide-create.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Create a unique company onboarding link for each user with the API.
1. Start with general company information (lines 4-21).
1. Next, add details about your ultimate beneficial owner (UBO).
1. Finally, add details about your legal representative (if needed; not shown).
1. Include optional fields as needed for your use case (such as `accountName` or `redirectUrl`).
1. Include optional fields as needed for your use case (such as `accountName` or `oAuthRedirectParameters`).
1. Add optional messages to the success payload, either for validation or in case of rejection.

### Mutation {#mutation}
Expand Down Expand Up @@ -74,7 +74,6 @@ mutation CreateCompanyOnboarding {
__typename
onboarding {
id
onboardingState
statusInfo {
status
}
Expand Down Expand Up @@ -103,14 +102,13 @@ mutation CreateCompanyOnboarding {

If you added validation or rejection messages, you'll see information such as the `onboardingId` as well as the current status `Valid` in the success payload.

```json {6,8} showLineNumbers
```json {6,7} showLineNumbers
{
"data": {
"onboardCompanyAccountHolder": {
"__typename": "OnboardCompanyAccountHolderSuccessPayload",
"onboarding": {
"id": "eda0ceec-0e20-4d1b-bbee-b3e3a4227c99",
"onboardingState": "Ongoing",
"statusInfo": {
"status": "Valid"
}
Expand Down
4 changes: 2 additions & 2 deletions docs/topics/onboarding/company/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ For company onboarding, the following levels are recommended based on the accoun
| Account country | Recommended level<br/>for account admin | Other supported levels |
|---|---|---|
| 🇫🇷 France | **<Yes /> Expert** | QES<br/>PVID |
| 🇧🇪 Belgium | **<Yes /> Expert** | *none* |
| 🇧🇪 Belgium | **<Yes /> Expert** | QES<br/>PVID |
| 🇩🇪 Germany | **<Yes /> QES** | *none* |
| 🇮🇹 Italy | **<Yes /> Expert** | QES<br/>PVID |
| 🇳🇱 Netherlands | **<Yes /> Expert** | QES<br/>PVID |
Expand Down Expand Up @@ -177,7 +177,7 @@ This section covers four types of information:
|`language`| <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
|`monthlyPaymentVolume`| <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
|`name` *(company name)* | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
|`redirectUrl`| <Opt /> | <Opt /> | <Opt /> | <Opt /> | <Opt /> | <Opt /> |
|`oAuthRedirectParameters`| <Opt /> | <Opt /> | <Opt /> | <Opt /> | <Opt /> | <Opt /> |
|`registrationNumber` | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
|`residencyAddress.addressLine1`| <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
|`residencyAddress.addressLine2`| <Opt /> | <Opt /> | <Opt /> | <Opt /> | <Opt /> | <Opt /> |
Expand Down
5 changes: 2 additions & 3 deletions docs/topics/onboarding/individual/guide-create.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Create a unique individual onboarding link for each user with the API.

1. Call the `onboardIndividualAccountHolder` mutation.
1. Enter information for all required API fields for the account country, as noted in [country requirements for individual accounts](./index.mdx#country-reqs).
1. Include optional fields as needed for your use case (such as `accountName` or `redirectUrl`).
1. Include optional fields as needed for your use case (such as `accountName` or `oAuthRedirectParameters`).
1. Add optional messages to the success payload, either for validation or in case of rejection.

### Mutation {#mutation}
Expand Down Expand Up @@ -67,14 +67,13 @@ mutation CreateIndividualOnboarding {

If you added validation or rejection messages, you'll see information such as the `onboardingId` as well as the current status `Ongoing (Valid)` in the success payload.

```json {6-7,9} showLineNumbers
```json {6,8} showLineNumbers
{
"data": {
"onboardIndividualAccountHolder": {
"__typename": "OnboardIndividualAccountHolderSuccessPayload",
"onboarding": {
"id": "ae06faf6-13b2-4e9e-891b-e78ecd5ca0e4",
"onboardingState": "Ongoing",
"statusInfo": {
"status": "Valid"
}
Expand Down
7 changes: 2 additions & 5 deletions docs/topics/onboarding/individual/guide-update.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,12 @@ To test updating an individual onboarding, **add an account name**.
1. Enter the onboarding ID retrieved in step 1.
1. Check the box for `accountName`, then add an account name (example: MyBrand).
1. Add desired messages to the success payload, either for validation or in case of rejection.
* **Recommendation**: Inside the `UpdateIndividualOnboardingSuccessPayload` option, add `onboardingState` and `statusInfo` > `status` to confirm the onboarding is still ongoing and valid after making the update.

## Mutation {#mutation}

<a href="https://explorer.swan.io?query=bXV0YXRpb24gVXBkYXRlSW5kaXZpZHVhbE9uYm9hcmRpbmcgewogIHVwZGF0ZUluZGl2aWR1YWxPbmJvYXJkaW5nKAogICAgaW5wdXQ6IHsKICAgICAgb25ib2FyZGluZ0lkOiAiJE9OQk9BUkRJTkdfSUQiLAogICAgICBhY2NvdW50TmFtZTogIlBlcnNvbmFsIGFjY291bnQiIH0KICApIHsKICAgIC4uLiBvbiBGb3JiaWRkZW5SZWplY3Rpb24gewogICAgICBfX3R5cGVuYW1lCiAgICAgIG1lc3NhZ2UKICAgIH0KICAgIC4uLiBvbiBJbnRlcm5hbEVycm9yUmVqZWN0aW9uIHsKICAgICAgX190eXBlbmFtZQogICAgICBtZXNzYWdlCiAgICB9CiAgICAuLi4gb24gVXBkYXRlSW5kaXZpZHVhbE9uYm9hcmRpbmdTdWNjZXNzUGF5bG9hZCB7CiAgICAgIF9fdHlwZW5hbWUKICAgICAgb25ib2FyZGluZyB7CiAgICAgICAgYWNjb3VudE5hbWUKICAgICAgICBvbmJvYXJkaW5nU3RhdGUKICAgICAgICBzdGF0dXNJbmZvIHsKICAgICAgICAgIHN0YXR1cwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLi4uIG9uIFZhbGlkYXRpb25SZWplY3Rpb24gewogICAgICBfX3R5cGVuYW1lCiAgICAgIG1lc3NhZ2UKICAgICAgZmllbGRzIHsKICAgICAgICBtZXNzYWdlCiAgICAgIH0KICAgIH0KICB9Cn0K&tab=api" className="explorer-badge">Open in API Explorer</a>

```graphql {4-5,19-22} showLineNumbers
```graphql {4-5,18-21} showLineNumbers
mutation UpdateIndividualOnboarding {
updateIndividualOnboarding(
input: {
Expand All @@ -45,7 +44,6 @@ mutation UpdateIndividualOnboarding {
__typename
onboarding {
accountName
onboardingState
statusInfo {
status
}
Expand All @@ -65,14 +63,13 @@ mutation UpdateIndividualOnboarding {

## Payload {#payload}

```json {6-9} showLineNumbers
```json {6-8} showLineNumbers
{
"data": {
"updateIndividualOnboarding": {
"__typename": "UpdateIndividualOnboardingSuccessPayload",
"onboarding": {
"accountName": "MyBrand",
"onboardingState": "Ongoing",
"statusInfo": {
"status": "Valid"
}
Expand Down
4 changes: 2 additions & 2 deletions docs/topics/onboarding/individual/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ For individual onboarding, the following levels are recommended based on the acc
| Account country | Recommended level<br/>for individuals | Other supported levels |
|---|---|---|
| 🇫🇷 France | **<Yes /> PVID** | *Expert + first transfer<br/>QES* |
| 🇧🇪 Belgium | **<Yes /> Expert + first transfer** | *none* |
| 🇧🇪 Belgium | **<Yes /> QES** | *Expert + first transfer* |
| 🇩🇪 Germany | **<Yes /> QES + first transfer** | *none* |
| 🇮🇹 Italy | **<Yes /> QES** | *Expert + first transfer* |
| 🇳🇱 Netherlands | **<Yes /> Expert** | *QES<br/>PVID* |
Expand All @@ -58,7 +58,7 @@ For individual accounts, use the `onboardIndividualAccountHolder` mutation to co
|`employmentStatus`| <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
|`language`| <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
|`monthlyIncome`| <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
|`redirectUrl`|<Opt />|<Opt />|<Opt />|<Opt />|<Opt />|<Opt />|
|`oAuthRedirectParameters`|<Opt />|<Opt />|<Opt />|<Opt />|<Opt />|<Opt />|
|`residencyAddress.addressLine1`| <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
|`residencyAddress.addressLine2`|<Opt />|<Opt />|<Opt />|<Opt />|<Opt />|<Opt />|
|`residencyAddress.city`| <Req /> | <Req /> | <Req /> | <Req /> | <Req /> | <Req /> |
Expand Down
6 changes: 1 addition & 5 deletions docs/topics/onboarding/overview/guide-get-info.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ The onboarding can have [any status](../index.mdx#statuses).

1. Call the `onboardings` query.
1. Add all the query options you'd like to monitor.
* For this exercise, add: `createdAt`, `email`, `info` > `type`, `onboardingUrl`, `onboardingState`, `statusInfo` > `status`, `id`, and `totalCount`.
* For this exercise, add: `createdAt`, `email`, `info` > `type`, `onboardingUrl`, `statusInfo` > `status`, `id`, and `totalCount`.
* To `statusInfo` > `status`, add a **rejection** as well: `OnboardingInvalidStatusInfo` with `errors`, `field`, and `status`.
1. You can only get information for up to **100 onboardings** at a time. Add [pagination](../../../developers/using-api/pagination.mdx) to tailor your response to the information you need.

Expand All @@ -40,7 +40,6 @@ query MonitorOnboarding {
type
}
onboardingUrl
onboardingState
statusInfo {
status
... on OnboardingInvalidStatusInfo {
Expand Down Expand Up @@ -77,7 +76,6 @@ Review the sample payload with two `Ongoing` onboardings, one `Invalid` and one
"type": "Company"
},
"onboardingUrl": "https://api.banking.swan.io/projects/$PROJECT_ID/onboardings/$ONBOARDING_ID?lang=es",
"onboardingState": "Ongoing",
"statusInfo": {
"status": "Invalid",
"__typename": "OnboardingInvalidStatusInfo",
Expand All @@ -101,7 +99,6 @@ Review the sample payload with two `Ongoing` onboardings, one `Invalid` and one
"type": "Individual"
},
"onboardingUrl": "https://api.banking.swan.io/projects/$PROJECT_ID/onboardings/$ONBOARDING_ID?lang=en",
"onboardingState": "Ongoing",
"statusInfo": {
"status": "Valid"
},
Expand All @@ -116,7 +113,6 @@ Review the sample payload with two `Ongoing` onboardings, one `Invalid` and one
"type": "Individual"
},
"onboardingUrl": "https://api.banking.swan.io/projects/$PROJECT_ID/onboardings/$ONBOARDING_ID?lang=fr",
"onboardingState": "Completed",
"statusInfo": {
"status": "Finalized"
},
Expand Down
2 changes: 1 addition & 1 deletion docs/topics/partials/_self-employed-id-recs.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
| Account country | Recommended level<br/>for self-employed | Other supported levels |
|---|---|---|
| 🇫🇷 France | **<Yes /> PVID** | *none* |
| 🇧🇪 Belgium | **<Yes /> Expert + first transfer** | *none* |
| 🇧🇪 Belgium | **<Yes /> QES** | *Expert + first transfer* |
| 🇩🇪 Germany | **<Yes /> QES + first transfer** | *none* |
2 changes: 1 addition & 1 deletion docs/topics/users/identifications/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ Sometimes, a [first transfer](../../onboarding/account-holders/index.mdx#first-t
| Account country | Individual accounts | Company accounts |
| --- | --- | --- |
| 🇫🇷 France | **<Yes /> PVID**<br />Expert + first transfer<br />QES | **<Yes /> Expert**<br />QES<br />PVID |
| 🇧🇪 Belgium | **<Yes /> Expert + first transfer** ∗<br />PVID | **<Yes /> Expert**<br />PVID |
| 🇧🇪 Belgium | **<Yes /> QES**<br />Expert + first transfer | **<Yes /> Expert**<br />QES<br />PVID |
| 🇩🇪 Germany | **<Yes /> QES + first transfer** | **<Yes /> QES** |
| 🇮🇹 Italy | **<Yes /> QES**<br />Expert + first transfer | **<Yes /> Expert**<br /> QES<br />PVID |
| 🇳🇱 Netherlands | **<Yes /> Expert**<br />QES<br />PVID | **<Yes /> Expert**<br />QES<br />PVID |
Expand Down