# `Tipalti.SOAP.Payer`
[🔗](https://github.com/iamkanishka/tipalti/blob/main/lib/tipalti/soap/payer.ex#L1)

Legacy SOAP API — Payer Functions (`PayerFunctions.asmx`).

Every operation here signs the request per `Tipalti.SOAP.Signature` and
goes through `Tipalti.SOAP.Client.call/5`. Each function documents the
operation's EAT (Encryption Additional Terms) parameter, if it has one.

Every function has a raising `!` counterpart.

# `apply_vendor_credit`

```elixir
@spec apply_vendor_credit(Tipalti.Config.t(), map()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Applies a vendor credit to one or more bills.

# `apply_vendor_credit!`

# `create_extended_payee_status_file`

```elixir
@spec create_extended_payee_status_file(Tipalti.Config.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Requests an extended bulk payee-status CSV export to SFTP. EAT: `saveToFile`.

# `create_extended_payee_status_file!`

# `create_or_update_custom_fields`

```elixir
@spec create_or_update_custom_fields(Tipalti.Config.t(), [map()]) ::
  {:ok, map()} | {:error, Exception.t()}
```

Creates or updates custom field definitions.

# `create_or_update_custom_fields!`

# `create_or_update_gl_accounts`

```elixir
@spec create_or_update_gl_accounts(Tipalti.Config.t(), [map()]) ::
  {:ok, map()} | {:error, Exception.t()}
```

Creates or updates one or more G/L accounts.

# `create_or_update_gl_accounts!`

# `create_or_update_grns`

```elixir
@spec create_or_update_grns(Tipalti.Config.t(), [map()]) ::
  {:ok, map()} | {:error, Exception.t()}
```

Creates or updates one or more goods-received notices (GRNs).

# `create_or_update_grns!`

# `create_or_update_invoices`

```elixir
@spec create_or_update_invoices(Tipalti.Config.t(), [map()]) ::
  {:ok, map()} | {:error, Exception.t()}
```

Creates or updates one or more invoices.

# `create_or_update_invoices!`

# `create_or_update_purchase_orders`

```elixir
@spec create_or_update_purchase_orders(Tipalti.Config.t(), [map()]) ::
  {:ok, map()} | {:error, Exception.t()}
```

Creates or updates one or more purchase orders.

# `create_or_update_purchase_orders!`

# `create_payee_status_file`

```elixir
@spec create_payee_status_file(Tipalti.Config.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Requests a bulk payee-status CSV export to SFTP. EAT: `saveToFile`.

# `create_payee_status_file!`

# `create_payment_orders_report`

```elixir
@spec create_payment_orders_report(Tipalti.Config.t(), String.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Requests a payment-orders report export to SFTP.

# `create_payment_orders_report!`

# `get_balances`

```elixir
@spec get_balances(Tipalti.Config.t()) :: {:ok, map()} | {:error, Exception.t()}
```

Returns account balances by provider and currency.

# `get_balances!`

# `get_custom_fields`

```elixir
@spec get_custom_fields(Tipalti.Config.t()) :: {:ok, map()} | {:error, Exception.t()}
```

Retrieves custom field definitions.

# `get_custom_fields!`

# `get_dynamic_key`

```elixir
@spec get_dynamic_key(Tipalti.Config.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Generates a signing key/token for embedding a Tipalti iFrame for the given payee.

# `get_dynamic_key!`

# `get_dynamic_key_of_sub_payer`

```elixir
@spec get_dynamic_key_of_sub_payer(Tipalti.Config.t(), String.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Generates a signing key/token for embedding a Tipalti iFrame for a sub-payer.

# `get_dynamic_key_of_sub_payer!`

# `get_payee_invoices_list_details`

```elixir
@spec get_payee_invoices_list_details(Tipalti.Config.t(), [String.t()]) ::
  {:ok, map()} | {:error, Exception.t()}
```

Retrieves invoice details by reference code.

# `get_payee_invoices_list_details!`

# `get_payer_fees`

```elixir
@spec get_payer_fees(Tipalti.Config.t(), String.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Returns fees charged in a date range.

# `get_payer_fees!`

# `get_processing_request_status`

```elixir
@spec get_processing_request_status(Tipalti.Config.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Polls the status of an async processing request. EAT: `requestId`.

# `get_processing_request_status!`

# `get_provider_accounts`

```elixir
@spec get_provider_accounts(Tipalti.Config.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Lists the payer's provider accounts.

# `get_provider_accounts!`

# `get_updated_payments`

```elixir
@spec get_updated_payments(Tipalti.Config.t(), integer()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Returns reference codes of payment orders updated since a Unix timestamp.

# `get_updated_payments!`

# `log_integration_error`

```elixir
@spec log_integration_error(Tipalti.Config.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Logs an integration error from a connected ERP/accounting system.

# `log_integration_error!`

# `process_multi_currency_payment_file`

```elixir
@spec process_multi_currency_payment_file(Tipalti.Config.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Submits a pre-loaded multi-currency SFTP payment file for processing. EAT: `fileName`.

# `process_multi_currency_payment_file!`

# `process_payment_file`

```elixir
@spec process_payment_file(Tipalti.Config.t(), String.t(), number()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Submits a pre-loaded SFTP payment file for processing. EAT: `totalAmount`.

# `process_payment_file!`

# `process_payments`

```elixir
@spec process_payments(Tipalti.Config.t(), [map()], keyword()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Processes up to 250 payments in a single call. EAT: `paymentGroupTitle`
(pass via `opts`).

    Tipalti.SOAP.Payer.process_payments(config, [
      %{idap: "vendor-123", amount: 100.00, currency: "USD", refCode: "pay-1"}
    ], payment_group_title: "Weekly payout")

# `process_payments!`

# `test_multi_currency_payment_file`

```elixir
@spec test_multi_currency_payment_file(Tipalti.Config.t(), String.t()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Dry-runs `process_multi_currency_payment_file/2`.

# `test_multi_currency_payment_file!`

# `test_payment_file`

```elixir
@spec test_payment_file(Tipalti.Config.t(), String.t(), number()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Dry-runs `process_payment_file/3`.

# `test_payment_file!`

# `test_payments`

```elixir
@spec test_payments(Tipalti.Config.t(), [map()], keyword()) ::
  {:ok, map()} | {:error, Exception.t()}
```

Dry-runs `process_payments/3` — validates without moving money.

# `test_payments!`

---

*Consult [api-reference.md](api-reference.md) for complete listing*
