Transfers
The C ABI exposes single transfers, instant transfers, and batch transfers through backend operations and typed submission result handles.
Scheme references:
- EPC SEPA Credit Transfer rulebook and implementation guidelines
- EPC SEPA Instant Credit Transfer rulebook and implementation guidelines
Operations
| Operation | Request | Result accessor |
|---|---|---|
gln_submit_transfer | gln_submit_transfer_request_t | gln_get_backend_result_transfer_submission |
gln_submit_instant_transfer | gln_submit_instant_transfer_request_t | gln_get_backend_result_transfer_submission |
gln_submit_batch_transfer | gln_batch_transfer_request_builder_t | gln_get_backend_result_batch_transfer_submission |
Backend Support
| Operation | Supported backends |
|---|---|
submit_transfer | FinTS, EBICS |
submit_instant_transfer | FinTS |
submit_batch_transfer | FinTS, EBICS |
Probe support at runtime with gln_check_backend_operation_support before enabling a command
against an arbitrary backend handle.
Single Transfer Request
gln_submit_transfer_request_t request = {0};
gln_default_submit_transfer_request(&request);
request.source_iban = "DE02120300000000202051";
request.source_bic = "BYLADEM1001";
request.source_name = "Example GmbH";
request.recipient_iban = "DE89370400440532013000";
request.recipient_bic = "COBADEFFXXX";
request.recipient_name = "Supplier GmbH";
request.amount = "125.40";
request.currency = "EUR";
request.purpose = "Invoice 2026-05";
request.end_to_end_reference_or_null = "INV-2026-05";
request.requested_execution_date_or_null = "2026-05-20";
| Field group | Required | Meaning |
|---|---|---|
| Source identity | yes | source_iban, source_bic, source_name. |
| Recipient identity | yes | recipient_iban, recipient_bic, recipient_name. |
| Payment detail | yes | amount, currency, purpose. |
| References | no | end_to_end_reference_or_null, requested_execution_date_or_null. |
requested_execution_date_or_null is valid for regular transfers. Instant
transfers use gln_submit_instant_transfer_request_t, which has no requested
execution date field.
Instant Transfer Request
gln_submit_instant_transfer_request_t request = {0};
gln_default_submit_instant_transfer_request(&request);
request.source_iban = "DE02120300000000202051";
request.source_bic = "BYLADEM1001";
request.source_name = "Example GmbH";
request.recipient_iban = "DE89370400440532013000";
request.recipient_bic = "COBADEFFXXX";
request.recipient_name = "Supplier GmbH";
request.amount = "125.40";
request.currency = "EUR";
request.purpose = "Invoice 2026-05";
request.end_to_end_reference_or_null = "INV-2026-05";
The instant request carries the same source, recipient, payment detail, and
end-to-end reference fields as a regular single transfer request, but omits
requested_execution_date_or_null.
Batch Transfer Request
gln_error_t error;
gln_default_error(&error);
gln_batch_transfer_request_builder_t* builder = NULL;
gln_create_batch_transfer_request_builder(&builder, &error);
gln_batch_transfer_request_header_t header;
gln_default_batch_transfer_request_header(&header);
header.source_iban = "DE02120300000000202051";
header.source_bic = "BYLADEM1001";
header.source_name = "Example GmbH";
header.single_booking = 1;
gln_set_batch_transfer_request_header(builder, &header, &error);
gln_batch_transfer_item_t item;
gln_default_batch_transfer_item(&item);
item.recipient_iban = "DE89370400440532013000";
item.recipient_bic = "COBADEFFXXX";
item.recipient_name = "Supplier GmbH";
item.amount = "125.40";
item.purpose = "Invoice 2026-05";
gln_add_batch_transfer_request_item(builder, &item, &error);
gln_backend_result_t* result = NULL;
gln_submit_batch_transfer(backend, builder, &result);
gln_destroy_backend_result(result);
gln_destroy_batch_transfer_request_builder(builder);
gln_release_error(&error);
The builder is the public request object for batch transfers. Header and item values are copied into the builder when they are set or added.
Result Handles
Single and instant transfers return gln_transfer_submission_t.
| Accessor | FinTS | EBICS |
|---|---|---|
gln_get_transfer_submission_status | Summary status. | Summary status. |
gln_get_transfer_submission_id | NULL. | EBICS order id. |
gln_get_transfer_submission_vop_* | VoP fields when present. | NULL. |
gln_get_transfer_submission_provider_status_count / _at | Count zero. | EBICS provider-status rows when present. |
Batch transfers return gln_batch_transfer_submission_t.
| Accessor | Meaning |
|---|---|
gln_get_batch_transfer_submission_status | Summary status. |
gln_get_batch_transfer_submission_id | EBICS order id, or NULL when the backend has no submission id. |
gln_get_batch_transfer_submission_transaction_count | Number of transfer rows accepted or represented. |
gln_get_batch_transfer_submission_control_sum | Decimal control sum. |
gln_get_batch_transfer_submission_item_results_count / _at | FinTS item-level rows. |
gln_get_batch_transfer_submission_provider_status_count / _at | EBICS provider-status rows. |
Submit and Inspect
gln_backend_result_t* result = NULL;
gln_status_t call_status = gln_submit_transfer(backend, &request, &result);
if (call_status == GLN_OK &&
gln_get_backend_result_outcome(result) == GLN_BACKEND_OUTCOME_SUCCESS) {
const gln_transfer_submission_t* submission =
gln_get_backend_result_transfer_submission(result);
const char* status = gln_get_transfer_submission_status(submission);
const char* submission_id = gln_get_transfer_submission_id(submission);
(void)status;
(void)submission_id;
}
gln_destroy_backend_result(result);
FinTS transfers can pause for TAN, decoupled approval, or VoP confirmation. Use the continuation flow documented in TAN and resume.