Charging per Mandate - חיוב לפי הרשאה
Submit charges against a valid Direct Debit Mandate and track execution through webhooks.
Submit direct-debit charge batches against existing mandates, then use Feezback’s a-synchronous status webhooks to track each batch through execution. This flow supports recurring billing and collections without asking the debtor to approve each individual charge.
Prerequisites
Before submitting a charge:
- Your
organizationCodemust be whitelisted for charging with Feezback. Contact your integration contact to confirm this is set up. - For mandates established through Feezback, confirm that the debtor's mandate is valid through a
MandateStatusChangedwebhook withcurrentStatus: "valid"from the Direct Debit Mandate flow.- Store the
customerIdthe debtor entered during Feezback mandate authorization (you receive it with the status webhook). Feezback matches this identifier to the relevant bank account number. You don't need to store the debtor bank account number as Feezback has it.
- Store the
- For independently established mandates, store the debtor's account number
debtorAccountand the account holder's identifierdebtorPsuId
Supported mandate sources
You can charge against mandates established with Feezback or independantly:
- A mandate established through Feezback's Direct Debit Mandate flow, identified by
customerId. - A mandate established independently of Feezback, identified by
debtorAccountanddebtorPsuId
Environments
- Create a token
See Configuring Environments & Security for token issuance:Action Integration URL Production URL Generate a bearer token https://lgs-integ01.feezback.cloud/tokenhttps://lgs-prod.feezback.cloud/token - Send the request with the token
| Environment | Endpoint |
|---|---|
| Integration | https://integ01-tpp.feezback.cloud/tpp/v1/mandates/charges |
| Production | https://prod-tpp.feezback.cloud/tpp/v1/mandates/charges |
Method: POST · Auth: Bearer token
How it works
- Submit a batch of charges to the endpoint above, At least 1 business day before you want to charge.
- Feezback validates the batch and responds synchronously — this response reflects file-level and line-level validity only, not the outcome at Masav.
- Feezback forwards valid charge lines to Masav for execution on
executionDate. - Feezback sends a
MandateBatchStatusUpdatewebhook as the batch progresses through Masav. - Within 6 business days of
executionDate, any charge line Masav rejects triggers aMandateChargeNotExecutedwebhook. If no such webhook arrives for a line within that window, treat it as executed successfully.
A charge can be rejected at three points:
- Synchronously at submission (invalid line/request).
- Asynchronously at the file level — Masav rejects the whole batch.
- Asynchronously at the individual charge level, up to 6 business days after
executionDate(reported viaMandateChargeNotExecuted). If a charge isn't rejected within that 6-day window, treat it as executed.
Submitting a charge batch
Request Configuration
{
"context": "STRAUSS-CHG-20260716-001",
"executionDate": "2026-07-16",
"organizationCode": "24580",
"charges": [
{
"chargeContext": "chg-00087421",
"customerId": "8834215",
"amount": "149.90",
"companyName": "חברה 2",
"remittanceInfo": "חיוב חודשי - קפסולות קפה"
},
{
"chargeContext": "chg-00087422",
"debtorAccount": "IL710110950000102188000",
"debtorPsuId": "512222222",
"companyName": "חברה 3",
"amount": "89.00"
},
{
"chargeContext": "chg-00087423",
"customerId": "8834350",
"debtorAccount": "IL710110950000102188000",
"companyName": "חברה 4",
"amount": "236.50"
}
]
}
|
|
|
|---|---|---|
context |
|
|
executionDate |
|
|
organizationCode |
|
|
charges[] |
|
|
charges[].chargeContext |
|
|
charges[].customerId |
|
|
charges[].debtorAccount |
|
customerId for cross-validation.Required when customerId is not provided. |
charges[].debtorPsuId |
|
You can also send it with customerId for cross-validation.Required when customerId is not provided. |
charges[].companyName |
|
|
charges[].amount |
|
|
charges[].remittanceInfo |
|
|
Identifying the debtor
Each charge line must include at least one of customerId or debtorAccount:
- Send
customerIdfor a mandate established through Feezback. Feezback validates that the related mandate is valid and matches the relevant debtor account. - Send
debtorAccounttogether withdebtorPsuIdfor a mandate established independently of Feezback. When onlydebtorAccountanddebtorPsuIdare sent (withoutcustomerId), Feezback does not perform mandate-availability validation: the line is sent to Masav as-is, and Masav rejects it if no authorization exists. - Send both fields when you want Feezback to cross-validate them. The fields are not mutually exclusive.
debtorPsuId values
debtorPsuId identifies the holder of the debtor account , which may be a provate person or an orgzniation. Send it as a string. The value depends on who holds the account:
| Account holder | Value to send |
|---|---|
| A corporate or other entity with a business number (corporate account) | The business number (ח.פ.) |
| A small business without a business number | The Israeli government ID (ת.ז.) of the account holder |
| A private account | The Israeli government ID (ת.ז.) of the account holder |
Example: "debtorPsuId": "512222222"
executionDate rules
- Cannot be earlier than the current date.
- Same-day execution is allowed only if the batch is submitted before 17:00 Israel time. Submissions after that cutoff for a same-day date are rejected.
- Cannot be more than 2 weeks from the current date.
Response
Feezback validates structure and per-line business rules and responds immediately — this does not wait for Masav.
There's no partial-success status, and no partial forwarding: if any charge line is invalid, the entire batch is rejected. Nothing in that batch is forwarded to Masav — errors tells you which line(s) caused the rejection so you can fix and resubmit (with a new context).
Full success:
{ "statusCode": 2000, "status": "Validated", "context": "STRAUSS-CHG-20260716-001" }Contains invalid lines — entire batch rejected, errors identifies the offending lines:
{
"statusCode": 2003,
"status": "Rejected",
"context": "STRAUSS-CHG-20260716-001",
"errors": [
{ "chargeContext": "chg-00087422", "customerId": "8834298", "statusCode": 20032, "reason": "Mandate is not valid" },
{ "chargeContext": "chg-00087423", "customerId": "8834111", "statusCode": 20033, "reason": "customerId not found" },
{ "chargeContext": "chg-00087425", "statusCode": 20031, "reason": "Missing required field: amount" }
]
}Whole-batch rejection (structural error — applies to the whole request, no specific charge line):
{
"statusCode": 2001,
"status": "Rejected",
"context": "STRAUSS-CHG-20260716-001",
"errors": [ { "reason": "organizationCode is missing from the request" } ]
}| Status code | Meaning | Scope |
|---|---|---|
| 2000 | Valid request | Batch |
| 2001 | Invalid request structure | Batch |
| 2002 | Internal server error | Batch |
| 2003 | Contains one or more invalid charge lines (see sub-codes) | Batch envelope; detail is per line |
Sub-codes returned inside errors when the top-level status is 2003:
| Sub-code | Meaning |
|---|---|
| 20031 | Missing required field on this charge line |
| 20032 | Mandate is not valid for this customerId |
| 20033 | customerId not found |
Standard HTTP errors (401, 403, 429, 500) apply before business validation and don't carry a statusCode.
Resubmitting a batch
context must always be unique. If you submit a request with a context you've used before, it's rejected — regardless of what happened to the original batch, whether it was executed, still in progress, rejected, or never sent to Masav. There is no reuse path.
If a batch needs to be retried (for example, after fixing an invalid line), generate a new context for the retry rather than resubmitting the original.
Tracking execution
There are two webhook events for this flow. Both follow Feezback's standard envelope:
{ "timestamp": "2026-07-16T09:12:03.104Z", "event": "EventName", "payload": { ... } }Your webhook endpoint must return HTTP 200 within 3 seconds. Don't validate against a strict schema — parse only the fields you need and ignore anything else, since fields may be added over time.
MandateBatchStatusUpdate — file-level status at Masav
{
"timestamp": "2026-07-15T14:02:11.500Z",
"event": "MandateBatchStatusUpdate",
"payload": { "context": "STRAUSS-CHG-20260716-001", "status": "Sent" }
}| Status | Meaning |
|---|---|
| Validated | Batch passed Feezback's validation |
| Sent | Charge file was sent to Masav |
| Received | File was received by Masav |
| Rejected | File was rejected by Masav at the file level |
MandateChargeNotExecuted — per-line rejection
Fires for an individual charge line if Masav rejects it, any time up to 6 business days after executionDate. Treat a line as pending until either this webhook arrives or the 6-day window closes.
{
"timestamp": "2026-07-18T10:41:22.019Z",
"event": "MandateChargeNotExecuted",
"payload": {
"context": "STRAUSS-CHG-20260716-001",
"chargeContext": "chg-00087423",
"customerId": "8834350",
"amount": "236.50",
"executionDate": "2026-07-16",
"reasonCode": "INSUFFICIENT_FUNDS"
}
}By default, only rejected lines trigger a webhook — there's no separate success notification. If you need explicit confirmation of successful charges as well, ask your integration contact; this can be enabled per account.
See reasonCode mapping here: https://docs.feezback.cloud/docs/chrage-rejection-reason-code-mapping
Charge line status reference
| Status | Meaning |
|---|---|
| Received | Charge line was received by Masav and is awaiting outcome |
| Executed | Not rejected within 6 business days of executionDate — treat as successful |
| Rejected | Masav rejected the charge; reported via MandateChargeNotExecuted |
Note:
Receiveddescribes different things at the batch level (file received by Masav) and the charge-line level (individual charge received, outcome pending) — check which object a given status appears on.
Constraints
amountmust be greater than 0, numeric, ILS only.organizationCodemust be whitelisted for your account with Feezback.- When sent,
customerIdmust resolve to a mandate in valid status at time of submission — otherwise that line is rejected with 20032. - A line with
debtorAccountanddebtorPsuIdand nocustomerIdis treated as an independently established mandate and does not receive mandate-availability validation. - A line with no
customerIdmust include bothdebtorAccountanddebtorPsuId. If one is missing, the entire batch is rejected with2003and sub-code20031. customerIdanddebtorAccountmay be sent together for cross-validation.contextmust be unique — see Resubmitting a batch.- Maximum charges per batch is not yet published — check with your integration contact if you're submitting large batches.
Coming later
- Status/query API (GET batch and per-charge status) — planned, not yet available. For now, rely on
MandateBatchStatusUpdateandMandateChargeNotExecutedwebhooks to track outcomes.
Updated about 10 hours ago