Direct Debits
The C ABI exposes SEPA direct-debit submission through single and batch backend operations.
Scheme references:
- EPC SEPA Direct Debit Core rulebook and implementation guidelines
- EPC SEPA Direct Debit B2B rulebook and implementation guidelines
Operations
| Operation | Request | Result accessor |
|---|---|---|
gln_submit_direct_debit | gln_submit_direct_debit_request_t | gln_get_backend_result_direct_debit_submission |
gln_submit_direct_debit_batch | gln_direct_debit_batch_request_builder_t | gln_get_backend_result_direct_debit_submission |
Backend Support
| Operation | Supported backends |
|---|---|
submit_direct_debit | FinTS, EBICS |
submit_direct_debit_batch | FinTS, EBICS |
Probe support at runtime with gln_check_backend_operation_support before enabling a command
against an arbitrary backend handle.
Single Direct Debit
gln_submit_direct_debit_request_t request = {0};
gln_default_submit_direct_debit_request(&request);
request.creditor_iban = "DE02120300000000202051";
request.creditor_bic = "BYLADEM1001";
request.creditor_name = "Example GmbH";
request.creditor_id = "DE98ZZZ00000000001";
request.debtor_iban = "DE89370400440532013000";
request.debtor_bic = "COBADEFFXXX";
request.debtor_name = "Example Customer";
request.amount = "39.90";
request.purpose = "Subscription 2026-05";
request.mandate_id = "MANDATE-2026-05";
request.mandate_date = "2026-04-20";
request.collection_date_or_null = "2026-05-20";
| Field group | Required | Meaning |
|---|---|---|
| Creditor identity | yes | creditor_iban, creditor_bic, creditor_name, creditor_id. |
| Debtor identity | yes | debtor_iban, debtor_bic, debtor_name. |
| Collection detail | yes | amount, currency, purpose, local_instrument. |
| Mandate detail | yes | mandate_id, mandate_date, sequence_type. |
| Optional fields | no | End-to-end reference, collection date, mandate amendment. |
gln_default_submit_direct_debit_request sets currency to "EUR",
sequence_type to "OOFF", and local_instrument to "CORE".
Mandate Amendments
Use gln_mandate_amendment_t when the SEPA mandate has changed.
| Field | Meaning |
|---|---|
original_mandate_id_or_null | Previous mandate id. |
original_creditor_id_or_null | Previous creditor id. |
original_debtor_iban_or_null | Previous debtor IBAN. |
debtor_changed_bank | Non-zero when the debtor moved banks. |
Batch Direct Debit
gln_direct_debit_batch_request_header_t contains the shared creditor fields.
The builder is the public request object for batch submissions. Use
gln_add_direct_debit_batch_request_item for ordinary batch items and
gln_add_direct_debit_batch_request_amended_item for amended batch items.
gln_direct_debit_batch_request_builder_t* builder = NULL;
gln_error_t error;
(void)gln_default_error(&error);
gln_create_direct_debit_batch_request_builder(&builder, &error);
gln_direct_debit_batch_request_header_t header;
gln_default_direct_debit_batch_request_header(&header);
header.creditor_iban = "DE02120300000000202051";
header.creditor_bic = "BYLADEM1001";
header.creditor_name = "Example GmbH";
header.creditor_id = "DE98ZZZ00000000001";
header.collection_date_or_null = "2026-05-20";
gln_set_direct_debit_batch_request_header(builder, &header, &error);
gln_batch_direct_debit_item_t item;
(void)gln_default_batch_direct_debit_item(&item);
item.debtor_iban = "DE89370400440532013000";
item.debtor_bic = "COBADEFFXXX";
item.debtor_name = "Example Customer";
item.amount = "39.90";
item.purpose = "Subscription 2026-05";
item.mandate_id = "MANDATE-2026-05";
item.mandate_date = "2026-04-20";
gln_add_direct_debit_batch_request_item(builder, &item, &error);
gln_mandate_amendment_t amendment;
(void)gln_default_mandate_amendment(&amendment);
amendment.original_mandate_id_or_null = "MANDATE-2025-05";
gln_add_direct_debit_batch_request_amended_item(builder, &item, &amendment, &error);
gln_backend_result_t* result = NULL;
gln_submit_direct_debit_batch(backend, builder, &result);
gln_destroy_backend_result(result);
gln_destroy_direct_debit_batch_request_builder(builder);
gln_release_error(&error);
Header, item, and amendment values are copied into the builder when they are set or added.
Result Handle
Both operations return gln_direct_debit_submission_t.
| Accessor | FinTS | EBICS |
|---|---|---|
gln_get_direct_debit_submission_status | Summary status. | Summary status. |
gln_get_direct_debit_submission_id | NULL. | EBICS order id. |
gln_get_direct_debit_submission_provider_status_count / _at | Count zero. | EBICS provider-status rows when present. |
FinTS direct-debit submissions can pause for TAN or decoupled approval. Direct debits do not use VoP confirmation in this ABI.