Administrative Seizures (SATD)
Administrative Seizures (SATD)
Introduction
A Saisie Administrative à Tiers Détenteur (SATD) is a French administrative seizure procedure through which the tax administration may require a financial institution holding funds on behalf of a debtor to seize and, where applicable, transfer those funds to the Public Treasury.
Because the payment accounts opened for end users are held in Xpollens' books, Xpollens is the third-party holder (tiers détenteur) and the legal recipient of SATDs issued by the French tax administration (DGFIP).
In this guide, the term debtor refers to the Partner's end user/customer targeted by the SATD.
Xpollens is therefore responsible for the regulatory processing of the seizure, including:
- identifying the debtor and the relevant account(s);
- determining the amount that can be seized;
- reserving the available seizable funds;
- managing the applicable legal holding period;
- processing any total or partial release (mainlevée);
- transferring seized funds to the Public Treasury when the seizure reaches maturity;
- exchanging the required information with the DGFIP.
The Partner is not the legal recipient of the SATD and does not perform the administrative processing with the DGFIP.
However, the Partner is notified of the events that affect its end users and their accounts so that it can:
- inform the end user when required;
- understand balance movements resulting from the seizure;
- reconcile seizure and release operations;
- reconcile applicable processing fees according to the contractual pricing agreement.
The SATD lifecycle is managed by Xpollens and exposed to the Partner through callbacks.
1. SATD overview
A SATD may concern, for example:
- taxes;
- fines;
- public-sector debts.
When a SATD concerns a Partner end user holding one or several Xpollens accounts, Xpollens identifies the relevant debtor and determines the amount that can legally be seized.
For individual debtors, applicable legal protections are taken into account, including the non-seizable bank balance (Solde Bancaire Insaisissable – SBI).
The exchanges between Xpollens and the DGFIP are handled directly by Xpollens and do not require any operational action from the Partner.
2. Partner-visible SATD lifecycle
The main SATD statuses relevant to the Partner are:
| Status | Description |
|---|---|
Matched | The SATD has been associated with the relevant debtor. |
InProgress | The SATD is being processed. Funds may have been seized, or the seizable amount may be 0.00 EUR. |
Finalized | The SATD has been closed. This may occur after execution at maturity or when the case is closed without execution. |
Canceled | The SATD has been canceled, for example when the seizure was associated with the wrong debtor. |
Processing states used before a SATD is successfully associated with a debtor are outside the scope of this Partner integration guide.
Workflow
stateDiagram-v2
[*] --> Matched : SATD matched with a debtor
Matched --> InProgress : Seizure processing starts
Matched --> Finalized : Case closed without execution
Matched --> Canceled : SATD canceled
InProgress --> InProgress : Partial or total release<br/>Seized amount updated
InProgress --> Finalized : SATD executed at maturity
InProgress --> Canceled : SATD canceled
Finalized --> [*]
Canceled --> [*]
Typical lifecycle
- Xpollens receives the SATD from the DGFIP.
- Xpollens associates the SATD with the relevant debtor.
- The Partner receives a
SeizureCreatedOrUpdatedcallback with statusMatched. - Xpollens determines the amount that can be seized from the debtor's account(s).
- If funds are seized, one or several account movements are generated.
- Each account movement is notified through an
InternalTransfercallback. - The SATD becomes
InProgress, and an updatedSeizureCreatedOrUpdatedcallback contains the currentseizedAmount. - During the legal holding period, the DGFIP may issue a total or partial release.
- If funds are released, the corresponding amount is credited back to the impacted debtor account(s), generating new
InternalTransfercallback(s), followed by an updatedSeizureCreatedOrUpdatedcallback. - If the seizure reaches maturity without a release preventing execution, the seized funds are transferred to the Public Treasury and the SATD becomes
Finalized.
3. Seizure processing
3.1 Debtor identification
When a SATD is received, Xpollens identifies whether the debtor corresponds to one of the Partner's end users and determines the related account(s).
Once the SATD has been associated with the debtor, the Partner is notified through:
SeizureCreatedOrUpdatedwith:
status = MatchedThe appUserId included in the callback identifies the affected debtor in the Partner integration.
Example:
{
"type": "SeizureCreatedOrUpdated",
"data": {
"seizureId": "02ac534c-f08f-4854-abd8-112f2d8cd0dd",
"status": "Matched",
"appUserId": "rx193bo32"
}
}The callback may contain additional SATD information. See SeizureCreatedOrUpdated callback.
3.2 Determination of seizable funds
Xpollens determines the amount that can be seized, taking into account:
- the amount requested in the SATD;
- the balances available on the debtor's account(s);
- applicable regulatory protections, including the SBI when relevant.
The amount effectively reserved is exposed to the Partner as:
seizedAmountThe seized amount can therefore be lower than the total amount requested by the DGFIP.
3.3 Seizable funds greater than zero
When funds are available for seizure, Xpollens reserves the applicable amount.
If the debtor has several impacted accounts, the seizure may result in several account movements.
For each movement, the Partner receives an:
InternalTransfercallback.
The movement is a debit from the debtor's account toward the account used by Xpollens to hold the seized funds during the legal holding period.
Conceptually:
Debtor account
|
| Internal Transfer
v
Seized funds holding accountThe seizure operation is corrective:
isCorrective = trueThe account statement label is based on:
Saisie administrative + <order number>After the seizure movements have been processed, the Partner receives an updated:
SeizureCreatedOrUpdatedcallback with:
status = InProgressand the amount effectively seized.
Example:
{
"type": "SeizureCreatedOrUpdated",
"data": {
"seizureId": "02ac534c-f08f-4854-abd8-112f2d8cd0dd",
"status": "InProgress",
"amount": {
"value": "1500.00",
"currency": "EUR"
},
"seizedAmount": {
"value": "1000.00",
"currency": "EUR"
},
"appUserId": "rx193bo32"
}
}3.4 Multiple accounts
A single SATD may affect several accounts belonging to the same debtor.
In this situation:
- Xpollens determines the amount to seize on each impacted account;
- each account movement generates its own
InternalTransfercallback; - all seizure-related operations remain associated with the same SATD;
- the
operationsarray ofSeizureCreatedOrUpdatedcan contain several related operations.
The Partner must therefore not assume that one SATD corresponds to one account movement.
Example:
SATD
|
+-- Account A -> InternalTransfer #1
|
+-- Account B -> InternalTransfer #2
|
+-- Account C -> InternalTransfer #33.5 No seizable funds
A SATD can remain active even when no funds can currently be seized.
In this case, the Partner receives:
status = InProgress
seizedAmount = 0.00 EURExample:
{
"type": "SeizureCreatedOrUpdated",
"data": {
"seizureId": "02ac534c-f08f-4854-abd8-112f2d8cd0dd",
"status": "InProgress",
"seizedAmount": {
"value": "0.00",
"currency": "EUR"
},
"appUserId": "rx193bo32"
}
}At maturity, the SATD is closed and a new SeizureCreatedOrUpdated callback is sent with:
status = Finalizedand:
seizedAmount = 0.00 EUR4. Legal holding period and execution
Once funds have been seized, they remain reserved during the applicable legal period.
During this period:
- the funds are no longer available to the debtor;
- they have not yet been transferred to the Public Treasury;
- a release may still modify the amount held.
According to the SATD processing workflow, execution occurs at J+30 from the matching of the SATD.
At maturity, if the seizure is still executable:
- Xpollens transfers the seized funds to the Public Treasury.
- The SATD is closed.
- The Partner receives an updated
SeizureCreatedOrUpdatedcallback with:
status = FinalizedExample:
{
"type": "SeizureCreatedOrUpdated",
"data": {
"seizureId": "02ac534c-f08f-4854-abd8-112f2d8cd0dd",
"status": "Finalized",
"seizedAmount": {
"value": "1000.00",
"currency": "EUR"
},
"appUserId": "rx193bo32"
}
}No Partner API call is required to execute the seizure.
5. SATD release (mainlevée)
A release (mainlevée) is an administrative decision that reduces or releases the funds previously seized.
A release may be:
- partial: only part of the seized amount is released;
- total: the full amount held is released.
A release is received and processed directly by Xpollens.
The Partner does not need to call an API to initiate the release.
5.1 Release of funds
When funds are released, Xpollens credits the corresponding amount back to the impacted debtor account(s).
For each account movement, the Partner receives an:
InternalTransfercallback.
Conceptually:
Seized funds holding account
|
| Internal Transfer
v
Debtor accountThe release movement is corrective:
isCorrective = trueThe account statement label is based on:
Annulation saisie administrative + <order number>The release can concern one or several debtor accounts.
5.2 Updating the seized amount
After a partial or total release, the Partner receives an updated:
SeizureCreatedOrUpdatedcallback containing the new seizedAmount.
Example after a partial release:
{
"type": "SeizureCreatedOrUpdated",
"data": {
"seizureId": "02ac534c-f08f-4854-abd8-112f2d8cd0dd",
"status": "InProgress",
"seizedAmount": {
"value": "400.00",
"currency": "EUR"
},
"appUserId": "rx193bo32"
}
}The exact terminal lifecycle following a total release is intentionally not detailed in this guide. Partners should rely on subsequent
SeizureCreatedOrUpdatedcallbacks for the current SATD status.
6. End-to-end sequence
sequenceDiagram
autonumber
actor DGFIP as DGFIP
participant Xpollens as Xpollens
participant Partner as Partner
DGFIP->>Xpollens: SATD notification
Xpollens->>Xpollens: Associate SATD with debtor
Xpollens-->>Partner: SeizureCreatedOrUpdated<br/>status = Matched
alt Case closed without seizure
Xpollens-->>Partner: SeizureCreatedOrUpdated<br/>status = Finalized
else Seizable funds > 0
loop For each impacted account
Xpollens->>Xpollens: Reserve seizable funds
Xpollens-->>Partner: InternalTransfer<br/>Debtor account -> seized funds holding account<br/>isCorrective = true
end
Xpollens-->>Partner: SeizureCreatedOrUpdated<br/>status = InProgress<br/>seizedAmount = current amount
alt Partial or total release received
DGFIP->>Xpollens: Release notification
loop For each impacted account
Xpollens->>Xpollens: Release all or part of seized funds
Xpollens-->>Partner: InternalTransfer<br/>Seized funds holding account -> debtor account<br/>isCorrective = true
end
Xpollens-->>Partner: SeizureCreatedOrUpdated<br/>seizedAmount = updated amount
else Seizure reaches maturity
Xpollens->>Xpollens: Transfer seized funds to Public Treasury at J+30
Xpollens-->>Partner: SeizureCreatedOrUpdated<br/>status = Finalized
end
else Seizable funds = 0
Xpollens-->>Partner: SeizureCreatedOrUpdated<br/>status = InProgress<br/>seizedAmount = 0.00 EUR
Xpollens->>Xpollens: Close SATD at maturity
Xpollens-->>Partner: SeizureCreatedOrUpdated<br/>status = Finalized<br/>seizedAmount = 0.00 EUR
end
7. SeizureCreatedOrUpdated callback
SeizureCreatedOrUpdated callbackThe SeizureCreatedOrUpdated callback is sent when a seizure is created or updated.
For the Partner, it is the main event used to follow the SATD lifecycle and the current amount seized.
7.1 Callback envelope
{
"type": "SeizureCreatedOrUpdated",
"data": {
"...": "..."
}
}7.2 Main fields
| Field | Type | Description |
|---|---|---|
type | string | Callback type. Value: SeizureCreatedOrUpdated. |
data.seizureId | string | Unique identifier of the seizure. |
data.status | string | Current SATD status. |
data.accountOfficeLabel | string | Label of the issuing accounting office. |
data.officeNumber | string | Accounting office / post number. |
data.orderNumber | string | Administrative order / act number. |
data.noticeDate | date | Date of the seizure notice. |
data.amount | object | Total amount requested by the administration. |
data.amount.value | string | Requested amount in decimal format. |
data.amount.currency | string | Currency code, typically EUR. |
data.seizedAmount | object | Amount effectively seized. |
data.seizedAmount.value | string | Seized amount in decimal format. |
data.seizedAmount.currency | string | Currency code. |
data.appUserId | string | Partner identifier of the affected debtor. |
data.operations | array | Operations associated with the seizure. |
7.3 operations fields
operations fieldsEach entry of data.operations can contain:
| Field | Type | Description |
|---|---|---|
operationType | string | Type of seizure-related operation. Documented values include TRANSFER and EMI_SCT_OUT. |
operationId | string | Identifier of the associated operation. |
operationLabel | string | Label of the operation. |
accountId | string | Identifier of the impacted account. |
amount | object | Amount of the operation. |
amount.value | string | Operation amount in decimal format. |
amount.currency | string | Currency code. |
direction | string | Debit or Credit. |
operationDate | date-time | Date and time of the operation. |
7.4 Example
{
"type": "SeizureCreatedOrUpdated",
"data": {
"seizureId": "02ac534c-f08f-4854-abd8-112f2d8cd0dd",
"status": "InProgress",
"accountOfficeLabel": "Paris Office",
"officeNumber": "123456",
"orderNumber": "ORD-123456",
"noticeDate": "2026-08-12",
"amount": {
"value": "1500.00",
"currency": "EUR"
},
"seizedAmount": {
"value": "1000.00",
"currency": "EUR"
},
"appUserId": "rx193bo32",
"operations": [
{
"operationType": "TRANSFER",
"operationId": "demoOperationId",
"operationLabel": "Saisie administrative ORD-123456",
"accountId": "rx193bo32",
"amount": {
"value": "1000.00",
"currency": "EUR"
},
"direction": "Debit",
"operationDate": "2026-08-12T10:30:00.000Z"
}
]
}
}8. InternalTransfer callback
InternalTransfer callbackAn InternalTransfer callback is sent for an Internal Transfer operation affecting an account.
In the SATD context, it is used by the Partner to identify and reconcile the movements generated by:
- the seizure of funds;
- a partial release;
- a total release.
8.1 Main fields
| Field | Type | Description |
|---|---|---|
type | string | Callback type. Value: InternalTransfer. |
internalTransferId | string | Internal Transfer identifier. |
creationDate | string | Operation creation date. |
status | string | Current Internal Transfer status. |
amount | object | Transfer amount. |
amount.value | string | Amount in decimal format. |
amount.currency | string | Currency code. |
sender.accountId | string | Identifier of the debited account. |
recipient.accountId | string | Identifier of the credited account. |
extraDatas.description | string | Transfer description. |
extraDatas.label1 | string | Transfer reason / statement label. |
extraDatas.label2 | string | Additional reconciliation field. |
extraDatas.label3 | string | Additional reconciliation field. |
checkLimits | boolean | Indicates whether account limits were checked/impacted. |
processUnpaid | boolean | Indicates whether debt processing is authorized for the transfer. |
isCorrective | boolean | Indicates that the operation is corrective. |
For SATD-generated seizure and release movements:
isCorrective = true8.2 Seizure movement
Conceptually:
sender.accountId = debtor account
recipient.accountId = seized funds holding accountTypical statement label:
Saisie administrative + <order number>Example structure:
{
"type": "InternalTransfer",
"internalTransferId": "P2P_example",
"creationDate": "2026-08-12T10:30:00.000Z",
"status": "Completed",
"amount": {
"value": "500.00",
"currency": "EUR"
},
"sender": {
"accountId": "<DEBTOR_ACCOUNT_ID>"
},
"recipient": {
"accountId": "<SEIZED_FUNDS_ACCOUNT_ID>"
},
"extraDatas": {
"label1": "Saisie administrative ORD-123456"
},
"isCorrective": true
}8.3 Release movement
Conceptually:
sender.accountId = seized funds holding account
recipient.accountId = debtor accountTypical statement label:
Annulation saisie administrative + <order number>Example structure:
{
"type": "InternalTransfer",
"internalTransferId": "P2P_example_release",
"creationDate": "2026-08-20T09:15:00.000Z",
"status": "Completed",
"amount": {
"value": "200.00",
"currency": "EUR"
},
"sender": {
"accountId": "<SEIZED_FUNDS_ACCOUNT_ID>"
},
"recipient": {
"accountId": "<DEBTOR_ACCOUNT_ID>"
},
"extraDatas": {
"label1": "Annulation saisie administrative ORD-123456"
},
"isCorrective": true
}9. Retrieving related Internal Transfers
The Partner does not create the Internal Transfers used by Xpollens to process a SATD.
These transfers are generated automatically by Xpollens.
If required for reconciliation or support purposes, the Partner can retrieve the generated Internal Transfer using the Internal Transfers API.
Get an Internal Transfer
GET /api/v2.0/internal-transfers/{internalTransferId}The response includes information such as:
internalTransferId;creationDate;amount;status;reason;sender.accountId;recipient.accountId;extraDatas;processUnpaid;isCorrective;checkLimits.
Example:
{
"internalTransferId": "P2P_2024931940",
"creationDate": "2025-03-12T08:19:36.9961387+00:00",
"amount": {
"value": "1.00",
"currency": "EUR"
},
"status": "Completed",
"reason": null,
"sender": {
"accountId": "17e4cfee-5771e6ac6"
},
"recipient": {
"accountId": "b2av3fjvc-0831r2pm0"
},
"extraDatas": {
"description": "Description",
"label1": "Fees",
"label2": "SubLabel",
"label3": "Tag"
},
"processUnpaid": false,
"isCorrective": false,
"checkLimits": true
}List Internal Transfers
Internal Transfers associated with an account can also be retrieved through:
GET /api/v2.0/internal-transfersAvailable filters include:
| Parameter | Description |
|---|---|
accountId | User or Partner account identifier. |
startCreationDate | Inclusive start date in ISO-8601 UTC format. |
endCreationDate | Inclusive end date in ISO-8601 UTC format. |
before | Pagination cursor. |
after | Pagination cursor. |
limit | Number of operations per page, up to 500. |
The
POST /api/v2.0/internal-transfersendpoint is not required for SATD processing. SATD-related transfers are initiated by Xpollens.
10. Internal Transfer statuses
The Internal Transfers API defines the following statuses:
| Status | Description |
|---|---|
Created | The operation has been created. |
Completed | The transaction has been successfully settled and the relevant balances have been impacted. |
Rejected | The transaction has been rejected. |
Canceled | The transaction has been canceled. |
Partners should primarily use the InternalTransfer callback to receive movement updates and the GET endpoints when the operation needs to be retrieved afterwards.
11. Callback acknowledgement
Callbacks include the following HTTP headers:
Webhook-Id
Webhook-ProcessdateWebhook-Id uniquely identifies the callback delivery.
Webhook-Processdate indicates the callback processing/send date.
Partner callback endpoints must acknowledge successful reception according to the callback contract.
The documented successful acknowledgement statuses are:
202 Acceptedor:
204 No Contentdepending on whether the Partner wishes to continue receiving further updates for the callback flow.
Partner implementations should ensure that callback processing is idempotent, as the same business object can legitimately generate several updates over its lifecycle.
12. Partner responsibilities
The Partner does not perform the SATD regulatory processing.
From an integration perspective, the Partner should:
- receive and process
SeizureCreatedOrUpdatedcallbacks; - receive and process the associated
InternalTransfercallbacks; - identify the affected debtor using
appUserId; - reconcile SATD-related account movements;
- support several operations for the same SATD when several accounts are impacted;
- update its own end-user support and operational tools when relevant;
- inform the end user according to the Partner's applicable customer communication obligations;
- reconcile processing fees according to the contractual pricing agreement.
The Partner does not need to:
- receive the SATD directly from the DGFIP;
- identify the debtor on behalf of the DGFIP;
- call an API to reserve the funds;
- call an API to release the funds;
- call an API to transfer the seized funds to the Public Treasury;
- communicate the regulatory response to the DGFIP.
13. Processing fees
SATD processing fees may be recharged to the Partner according to the applicable contractual pricing schedule.
The SATD and operation identifiers exposed through the callbacks provide the information required to reconcile the affected debtor and the associated account movements.
14. Implementation recommendations
Partners should treat SeizureCreatedOrUpdated as an update event for an existing SATD rather than assuming that each callback represents a new seizure.
Recommended integration principles:
- use
seizureIdas the unique business identifier of the SATD; - expect several
SeizureCreatedOrUpdatedcallbacks for the sameseizureId; - use the most recent callback as the current known state of the SATD;
- do not assume that a SATD affects only one account;
- support several
InternalTransfercallbacks for one SATD; - use
appUserIdto associate the SATD with the relevant debtor; - use
operations[].accountIdandInternalTransfer.sender/recipient.accountIdfor account-level reconciliation; - use
internalTransferIdto retrieve a transfer through the Internal Transfers API when necessary; - process callbacks idempotently;
- do not trigger SATD account movements from the Partner side.
15. Partner event summary
| Event | Partner notification | Main information |
|---|---|---|
| SATD associated with a debtor | SeizureCreatedOrUpdated | seizureId, appUserId, status = Matched |
| Funds seized | InternalTransfer | Debited account, credited holding account, amount, isCorrective = true |
| SATD active | SeizureCreatedOrUpdated | status = InProgress, seizedAmount |
| No seizable funds | SeizureCreatedOrUpdated | status = InProgress, seizedAmount = 0.00 EUR |
| Partial release | InternalTransfer + SeizureCreatedOrUpdated | Amount returned to account and updated seizedAmount |
| Total release | InternalTransfer + SeizureCreatedOrUpdated | Amount returned to account and updated SATD information |
| Execution at maturity | SeizureCreatedOrUpdated | status = Finalized, final seizedAmount |
| SATD canceled | SeizureCreatedOrUpdated | status = Canceled |
16. FAQ
Does the Partner receive the SATD directly from the DGFIP?
No. Xpollens is the legal third-party holder and receives the SATD from the DGFIP.
The Partner is informed through Xpollens callbacks.
Does the Partner need to call an API to seize funds?
No.
The seizure is performed by Xpollens.
The Partner receives the resulting account movement through an InternalTransfer callback.
How does the Partner know which debtor is affected?
The SeizureCreatedOrUpdated callback contains:
appUserIdwhich identifies the debtor in the Partner integration.
How is the Partner informed that money has actually been seized?
The Partner receives:
- one or several
InternalTransfercallbacks corresponding to the account movement(s); - an updated
SeizureCreatedOrUpdatedcallback containing the currentseizedAmount.
Can one SATD affect several accounts?
Yes.
A SATD may generate several Internal Transfers if several accounts belonging to the same debtor are impacted.
Can the amount seized be lower than the amount requested in the SATD?
Yes.
amount represents the amount requested by the administration, while seizedAmount represents the amount effectively seized.
What happens if no money can be seized?
The SATD can move to:
InProgresswith:
seizedAmount = 0.00 EURIt is subsequently closed according to the SATD lifecycle.
What happens when a partial release is received?
Xpollens returns the released amount to the impacted account(s).
The Partner receives:
- one or several
InternalTransfercallbacks for the returned funds; - an updated
SeizureCreatedOrUpdatedcallback containing the newseizedAmount.
What happens when a total release is received?
Xpollens returns the relevant seized funds to the debtor's account(s).
The Partner receives the corresponding InternalTransfer callback(s) and an updated SeizureCreatedOrUpdated callback.
The subsequent status should be taken from the callback received for the SATD.
Does the Partner have to initiate the release?
No.
The release is received from the administration and processed by Xpollens.
Can the Partner retrieve an Internal Transfer after receiving the callback?
Yes.
Use:
GET /api/v2.0/internal-transfers/{internalTransferId}Should the Partner call POST /api/v2.0/internal-transfers for a SATD?
POST /api/v2.0/internal-transfers for a SATD?No.
SATD-related Internal Transfers are generated by Xpollens as part of the seizure lifecycle.
Are SATD-related transfers corrective operations?
Yes, the seizure and release P2P movements used in the SATD workflow are flagged with:
isCorrective = trueWhich label is displayed for a seizure movement?
The functional label is based on:
Saisie administrative + <order number>Which label is displayed when seized funds are returned after a release?
The functional label is based on:
Annulation saisie administrative + <order number>17. API and callback references
The SATD integration relies primarily on the following Xpollens interfaces:
| Interface | Purpose |
|---|---|
SeizureCreatedOrUpdated callback | SATD lifecycle, debtor identification, amounts and related operations |
InternalTransfer callback | Account movement generated by a seizure or release |
GET /api/v2.0/internal-transfers/{internalTransferId} | Retrieve one Internal Transfer |
GET /api/v2.0/internal-transfers | Retrieve Internal Transfers associated with an account |
The Internal Transfers API is exposed through the Xpollens API gateway.
Sandbox base URL:
https://sb-api.xpollens.comAuthentication is required for API requests according to the standard Xpollens authentication mechanism.
Updated 25 days ago