Skip to content

The C ABI exposes single transfers, instant transfers, and batch transfers through backend operations and typed submission result handles.

Scheme references:

Operations

OperationRequestResult accessor
gln_submit_transfergln_submit_transfer_request_tgln_get_backend_result_transfer_submission
gln_submit_instant_transfergln_submit_instant_transfer_request_tgln_get_backend_result_transfer_submission
gln_submit_batch_transfergln_batch_transfer_request_builder_tgln_get_backend_result_batch_transfer_submission

Backend Support

OperationSupported backends
submit_transferFinTS, EBICS
submit_instant_transferFinTS
submit_batch_transferFinTS, 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 groupRequiredMeaning
Source identityyessource_iban, source_bic, source_name.
Recipient identityyesrecipient_iban, recipient_bic, recipient_name.
Payment detailyesamount, currency, purpose.
Referencesnoend_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.

AccessorFinTSEBICS
gln_get_transfer_submission_statusSummary status.Summary status.
gln_get_transfer_submission_idNULL.EBICS order id.
gln_get_transfer_submission_vop_*VoP fields when present.NULL.
gln_get_transfer_submission_provider_status_count / _atCount zero.EBICS provider-status rows when present.

Batch transfers return gln_batch_transfer_submission_t.

AccessorMeaning
gln_get_batch_transfer_submission_statusSummary status.
gln_get_batch_transfer_submission_idEBICS order id, or NULL when the backend has no submission id.
gln_get_batch_transfer_submission_transaction_countNumber of transfer rows accepted or represented.
gln_get_batch_transfer_submission_control_sumDecimal control sum.
gln_get_batch_transfer_submission_item_results_count / _atFinTS item-level rows.
gln_get_batch_transfer_submission_provider_status_count / _atEBICS 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.