diff --git a/changelog/2026/2026-01-15.mdx b/changelog/2026/2026-01-15.mdx
new file mode 100644
index 0000000000..d04282839e
--- /dev/null
+++ b/changelog/2026/2026-01-15.mdx
@@ -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`.
\ No newline at end of file
diff --git a/changelog/2026/2026-01-29.mdx b/changelog/2026/2026-01-29.mdx
new file mode 100644
index 0000000000..81d12e4eb3
--- /dev/null
+++ b/changelog/2026/2026-01-29.mdx
@@ -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.
\ No newline at end of file
diff --git a/docs/topics/accounts/documents/guide-upload-onboarding.mdx b/docs/topics/accounts/documents/guide-upload-onboarding.mdx
index 24867d5d95..3eab00959d 100644
--- a/docs/topics/accounts/documents/guide-upload-onboarding.mdx
+++ b/docs/topics/accounts/documents/guide-upload-onboarding.mdx
@@ -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.
diff --git a/docs/topics/onboarding/company/guide-create.mdx b/docs/topics/onboarding/company/guide-create.mdx
index 8cda1b74e3..545840834c 100644
--- a/docs/topics/onboarding/company/guide-create.mdx
+++ b/docs/topics/onboarding/company/guide-create.mdx
@@ -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}
@@ -74,7 +74,6 @@ mutation CreateCompanyOnboarding {
__typename
onboarding {
id
- onboardingState
statusInfo {
status
}
@@ -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"
}
diff --git a/docs/topics/onboarding/company/index.mdx b/docs/topics/onboarding/company/index.mdx
index 9f44cada6a..c4af968bc6 100644
--- a/docs/topics/onboarding/company/index.mdx
+++ b/docs/topics/onboarding/company/index.mdx
@@ -135,7 +135,7 @@ For company onboarding, the following levels are recommended based on the accoun
| Account country | Recommended level
for account admin | Other supported levels |
|---|---|---|
| 🇫🇷 France | ** Expert** | QES
PVID |
-| 🇧🇪 Belgium | ** Expert** | *none* |
+| 🇧🇪 Belgium | ** Expert** | QES
PVID |
| 🇩🇪 Germany | ** QES** | *none* |
| 🇮🇹 Italy | ** Expert** | QES
PVID |
| 🇳🇱 Netherlands | ** Expert** | QES
PVID |
@@ -177,7 +177,7 @@ This section covers four types of information:
|`language`| | | | | | |
|`monthlyPaymentVolume`| | | | | | |
|`name` *(company name)* | | | | | | |
-|`redirectUrl`| | | | | | |
+|`oAuthRedirectParameters`| | | | | | |
|`registrationNumber` | | | | | | |
|`residencyAddress.addressLine1`| | | | | | |
|`residencyAddress.addressLine2`| | | | | | |
diff --git a/docs/topics/onboarding/individual/guide-create.mdx b/docs/topics/onboarding/individual/guide-create.mdx
index 6e25e1456c..176833f2f9 100644
--- a/docs/topics/onboarding/individual/guide-create.mdx
+++ b/docs/topics/onboarding/individual/guide-create.mdx
@@ -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}
@@ -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"
}
diff --git a/docs/topics/onboarding/individual/guide-update.mdx b/docs/topics/onboarding/individual/guide-update.mdx
index d8d50064c7..ab97db9121 100644
--- a/docs/topics/onboarding/individual/guide-update.mdx
+++ b/docs/topics/onboarding/individual/guide-update.mdx
@@ -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}
Open in API Explorer
-```graphql {4-5,19-22} showLineNumbers
+```graphql {4-5,18-21} showLineNumbers
mutation UpdateIndividualOnboarding {
updateIndividualOnboarding(
input: {
@@ -45,7 +44,6 @@ mutation UpdateIndividualOnboarding {
__typename
onboarding {
accountName
- onboardingState
statusInfo {
status
}
@@ -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"
}
diff --git a/docs/topics/onboarding/individual/index.mdx b/docs/topics/onboarding/individual/index.mdx
index 1a4750e7ea..94d8046aca 100644
--- a/docs/topics/onboarding/individual/index.mdx
+++ b/docs/topics/onboarding/individual/index.mdx
@@ -34,7 +34,7 @@ For individual onboarding, the following levels are recommended based on the acc
| Account country | Recommended level
for individuals | Other supported levels |
|---|---|---|
| 🇫🇷 France | ** PVID** | *Expert + first transfer
QES* |
-| 🇧🇪 Belgium | ** Expert + first transfer** | *none* |
+| 🇧🇪 Belgium | ** QES** | *Expert + first transfer* |
| 🇩🇪 Germany | ** QES + first transfer** | *none* |
| 🇮🇹 Italy | ** QES** | *Expert + first transfer* |
| 🇳🇱 Netherlands | ** Expert** | *QES
PVID* |
@@ -58,7 +58,7 @@ For individual accounts, use the `onboardIndividualAccountHolder` mutation to co
|`employmentStatus`| | | | | | |
|`language`| | | | | | |
|`monthlyIncome`| | | | | | |
-|`redirectUrl`|||||||
+|`oAuthRedirectParameters`|||||||
|`residencyAddress.addressLine1`| | | | | | |
|`residencyAddress.addressLine2`|||||||
|`residencyAddress.city`| | | | | | |
diff --git a/docs/topics/onboarding/overview/guide-get-info.mdx b/docs/topics/onboarding/overview/guide-get-info.mdx
index 2819f1f63f..314dbe94f9 100644
--- a/docs/topics/onboarding/overview/guide-get-info.mdx
+++ b/docs/topics/onboarding/overview/guide-get-info.mdx
@@ -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.
@@ -40,7 +40,6 @@ query MonitorOnboarding {
type
}
onboardingUrl
- onboardingState
statusInfo {
status
... on OnboardingInvalidStatusInfo {
@@ -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",
@@ -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"
},
@@ -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"
},
diff --git a/docs/topics/partials/_self-employed-id-recs.mdx b/docs/topics/partials/_self-employed-id-recs.mdx
index 4569efbd4e..0f5e0823dd 100644
--- a/docs/topics/partials/_self-employed-id-recs.mdx
+++ b/docs/topics/partials/_self-employed-id-recs.mdx
@@ -1,5 +1,5 @@
| Account country | Recommended level
for self-employed | Other supported levels |
|---|---|---|
| 🇫🇷 France | ** PVID** | *none* |
-| 🇧🇪 Belgium | ** Expert + first transfer** | *none* |
+| 🇧🇪 Belgium | ** QES** | *Expert + first transfer* |
| 🇩🇪 Germany | ** QES + first transfer** | *none* |
\ No newline at end of file
diff --git a/docs/topics/users/identifications/index.mdx b/docs/topics/users/identifications/index.mdx
index 9c1ec34c66..71374a736f 100644
--- a/docs/topics/users/identifications/index.mdx
+++ b/docs/topics/users/identifications/index.mdx
@@ -87,7 +87,7 @@ Sometimes, a [first transfer](../../onboarding/account-holders/index.mdx#first-t
| Account country | Individual accounts | Company accounts |
| --- | --- | --- |
| 🇫🇷 France | ** PVID**
Expert + first transfer
QES | ** Expert**
QES
PVID |
-| 🇧🇪 Belgium | ** Expert + first transfer** ∗
PVID | ** Expert** ∗
PVID |
+| 🇧🇪 Belgium | ** QES**
Expert + first transfer | ** Expert**
QES
PVID |
| 🇩🇪 Germany | ** QES + first transfer** | ** QES** |
| 🇮🇹 Italy | ** QES**
Expert + first transfer | ** Expert**
QES
PVID |
| 🇳🇱 Netherlands | ** Expert**
QES
PVID | ** Expert**
QES
PVID |