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 |