Function: CreateOrUpdateInvoices
The CreateOrUpdateInvoices function creates or updates invoices, and allows marking bills as paid manually. If you use a payee ID that does not exist in the system, a new payee will be created.
If you do not have a reference code, you can auto-generate one by excluding the InvoiceRefCode element in the request.
For bills management, general bill information (e.g., invoice number, dates) and bill financials (e.g., currency, amount, account) can only be updated if the current bill status is a valid status:
- For "Invoice Processing" and all "Self-billing" flows, the valid statuses are "PendingAPReview" or "PendingAPAction".
- For "Tipalti bills" flow, the valid status is "PendingPayment".
If the status of the bill (before the update request) is not a valid status, general bill information and bill financials will not be updated. If other fields are included in the same request (such as Bill status), those will update successfully and a success result will be returned.
When using this API function, it is recommended that you don't send more than 200 bills in the request. If you need to create more than 200 bills, please create several requests.

In case of a failed call, the system will return 1015-InvoiceValidationError error code with one of the following error messages:
Error message |
description |
---|---|
GL Account and Transaction Date are required to mark the bill as manually paid |
|
Your configuration doesn’t support providing GL Account or Transaction Date while marking a bill as manually paid. To mark the bill as manually paid, please send "IsPaidManually" = TRUE and don't send "InvoiceStatus" | When a payer shouldn’t send the "ManualPaymentDetails" parameter, and the request contains a value in the "ManualPaymentDetails" parameter, the request will fail. |
You can't provide GL Account or Transaction Date while marking a vendor credit as manually paid. To mark the vendor credit as manually paid, please send "IsPaidManually" = TRUE and don't send "InvoiceStatus". | When setting a Vendor Credit as manually paid, the "ManualPaymentDetails" parameter is not required, and the request will fail if it is provided. |
- EAT Encryption Additional Terms parameter: None
- API version: V4
The following is a sample SOAP 1.2 request and response. In the request, you need to replace the data types in yellow with actual values.
SOAP 1.2: Request
POST /v4/payerfunctions.asmx HTTP/1.1
Host: api.tipalti.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<CreateOrUpdateInvoices xmlns="http://Tipalti.org/">
<payerName>string</payerName>
<timestamp>double</timestamp>
<key>string</key>
<invoices>
<TipaltiInvoiceItemRequest>
<Idap>string</Idap>
<InvoiceRefCode>string</InvoiceRefCode>
<InvoiceDate>dateTime</InvoiceDate>
<InvoiceDueDate>dateTime</InvoiceDueDate>
<InvoiceLines>
<InvoiceLine>
<Currency>string</Currency>
<Amount>double</Amount>
<Description>string</Description>
<InvoiceInternalNotes>string</InvoiceInternalNotes>
<EWalletMessage>string</EWalletMessage>
<BankingMessage>string</BankingMessage>
<CustomFields>
<KeyValuePair>
<Key>string</Key>
<Value>string</Value>
</KeyValuePair>
</CustomFields>
<GLAccount>
<Name>string</Name>
<Number>string</Number>
<ExternalId>string</ExternalId>
<Description>string</Description>
<MiscBox1099>string</MiscBox1099>
<Type>string</Type>
<Currency>string</Currency>
</GLAccount>
<LineType>string</LineType>
<LineExternalMetadata>string</LineExternalMetadata>
<Quantity>decimal</Quantity>
<BillLineID>string</BillLineID>
<TaxCodeExternalId>string</TaxCodeExternalId>
<TaxAmount>decimal</TaxAmount>
<RelatedPurchaseOrders>
<TipaltiRelatedPurchaseOrder>
<PurchaseOrderNumber>string</PurchaseOrderNumber>
<ItemNumber>string</ItemNumber>
<Quantity>decimal</Quantity>
<Amount>decimal</Amount>
<ExternalLineId>string</ExternalLineId>
<ItemExternalId>string</ItemExternalId>
<PoLineGlAccountExternalId>string</PoLineGlAccountExternalId>
<PoLineUnitName>string</PoLineUnitName>
<PoLineUnitExternalId>string</PoLineUnitExternalId>
</TipaltiRelatedPurchaseOrder>
</RelatedPurchaseOrders>
</InvoiceLine>
</InvoiceLines>
<Description>string</Description>
<CanApprove>boolean</CanApprove>
<InvoiceInternalNotes>string</InvoiceInternalNotes>
<CustomFields>
<KeyValuePair>
<Key>string</Key>
<Value>string</Value>
</KeyValuePair>
</CustomFields>
<IsPaidManually>boolean</IsPaidManually>
<ManualPaymentDetails>
<GLAccountExternalId>string</GLAccountExternalId>
<TransactionDate>dateTime<TransactionDate>
</ManualPaymentDetails>
<IncomeType>string</IncomeType>
<InvoiceStatus>string</InvoiceStatus>
<Currency>string</Currency>
<Approvers>
<TipaltiInvoiceApprover>
<Name>string</Name>
<Email>string</Email>
<Order>integer</Order>
</TipaltiInvoiceApprover>
</Approvers>
<InvoiceNumber>string</InvoiceNumber>
<PayerEntityName>string</PayerEntityName>
<InvoiceSubject>string</InvoiceSubject>
<ApAccountNumber>string</ApAccountNumber>
</TipaltiInvoiceItemRequest>
<TipaltiInvoiceItemRequest>
<Idap>string</Idap>
<InvoiceRefCode>string</InvoiceRefCode>
<InvoiceDate>dateTime</InvoiceDate>
<InvoiceDueDate>dateTime</InvoiceDueDate>
<InvoiceLines>
<InvoiceLine>
<Currency>string</Currency>
<Amount>double</Amount>
<Description>string</Description>
<InvoiceInternalNotes>string</InvoiceInternalNotes>
<EWalletMessage>string</EWalletMessage>
<BankingMessage>string</BankingMessage>
<CustomFields>
<KeyValuePair>
<Key>string</Key>
<Value>string</Value>
</KeyValuePair>
</CustomFields>
<GLAccount>
<Name>string</Name>
<Number>string</Number>
<ExternalId>string</ExternalId>
<Description>string</Description>
<MiscBox1099>string</MiscBox1099>
<Type>string</Type>
<Currency>string</Currency>
</GLAccount>
<LineType>string</LineType>
<LineExternalMetadata>string</LineExternalMetadata>
<Quantity>decimal</Quantity>
<BillLineID>string</BillLineID>
<TaxCodeExternalId>string</TaxCodeExternalId>
<TaxAmount>decimal</TaxAmount>
<RelatedPurchaseOrders>
<TipaltiRelatedPurchaseOrder>
<PurchaseOrderNumber>string</PurchaseOrderNumber>
<ItemNumber>string</ItemNumber>
<Quantity>decimal</Quantity>
<Amount>decimal</Amount>
<ExternalLineId>string</ExternalLineId>
<ItemExternalId>string</ItemExternalId>
<PoLineGlAccountExternalId>string</PoLineGlAccountExternalId>
<PoLineUnitName>string</PoLineUnitName>
<PoLineUnitExternalId>string</PoLineUnitExternalId>
</TipaltiRelatedPurchaseOrder>
</RelatedPurchaseOrders>
</InvoiceLine>
</InvoiceLines>
<Description>string</Description>
<CanApprove>boolean</CanApprove>
<InvoiceInternalNotes>string</InvoiceInternalNotes>
<CustomFields>
<KeyValuePair>
<Key>string</Key>
<Value>string</Value>
</KeyValuePair>
</CustomFields>
<IsPaidManually>boolean</IsPaidManually>
<ManualPaymentDetails>
<GLAccountExternalId>string</GLAccountExternalId>
<TransactionDate>dateTime<TransactionDate>
</ManualPaymentDetails>
<IncomeType>string</IncomeType>
<InvoiceStatus>string</InvoiceStatus>
<Currency>string</Currency>
<Approvers>
<TipaltiInvoiceApprover>
<Name>string</Name>
<Email>string</Email>
<Order>integer</Order>
</TipaltiInvoiceApprover>
</Approvers>
<InvoiceNumber>string</InvoiceNumber>
<PayerEntityName>string</PayerEntityName>
<InvoiceSubject>string</InvoiceSubject>
<ApAccountNumber>string</ApAccountNumber>
</TipaltiInvoiceItemRequest>
</invoices>
</CreateOrUpdateInvoices>
</soap12:Body>
</soap12:Envelope>
SOAP 1.2: Response
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<CreateOrUpdateInvoicesResponse xmlns="http://Tipalti.org/">
<CreateOrUpdateInvoicesResult>
<errorMessage>string</errorMessage>
<errorCode>string</errorCode>
<b>boolean</b>
<i>integer</i>
<d>double</d>
<s>string</s>
<InvoiceErrors>
<TipaltiInvoiceItemResult>
<ErrorMessage>string</ErrorMessage>
<Succeeded>boolean</Succeeded>
<InvoiceRefCode>string</InvoiceRefCode>
</TipaltiInvoiceItemResult>
<TipaltiInvoiceItemResult>
<ErrorMessage>string</ErrorMessage>
<Succeeded>boolean</Succeeded>
<InvoiceRefCode>string</InvoiceRefCode>
</TipaltiInvoiceItemResult>
</InvoiceErrors>
</CreateOrUpdateInvoicesResult>
</CreateOrUpdateInvoicesResponse>
</soap12:Body>
</soap12:Envelope>
Request parameters
element |
description |
limitation |
Mandatory? |
data type |
---|---|---|---|---|
payerName | The name of the payer, as assigned by Tipalti |
|
Mandatory | string |
timestamp |
Current time (UTC) when the request is sent |
Unix time | Mandatory | double |
key | Encryption key | Mandatory | string | |
invoices |
|
Mandatory | Array of TipaltiInvoice ItemRequest |
TipaltiInvoiceItemRequest
-
If you want to mark an invoice as manually paid, do not include the "InvoiceStatus" parameter in the request. Leaving the parameter with a null value will fail the request.
- Incorrect request
- Correct request
Element |
Description |
Limitation |
Mandatory? |
Data Type |
---|---|---|---|---|
Idap | Unique payee identifier (the payee ID) |
|
Mandatory | string |
InvoiceRefCode |
|
|
Optional to include the element, but if tags are included, a value is mandatory. Otherwise, an error is returned. | string |
InvoiceDate | Invoice value date (estimated date and time the payee receives the funds) | YYYY-MM-DDThh:mm:ss, where T indicates the start of the time section | Mandatory | dateTime |
InvoiceDueDate | The date and time the invoice is due to be paid | YYYY-MM-DDThh:mm:ss, where T indicates the start of the time section |
|
dateTime |
InvoiceLines |
Note: To create an invoice with no lines, leave this parameter empty. |
Optional | Array of InvoiceLine | |
Description | A description of the invoice | Max. length = 256 | Optional | string |
CanApprove | Indicates whether or not the payee is able to approve the invoice | Mandatory | boolean | |
InvoiceInternalNotes | Notes that are not displayed to the payee |
|
Optional | string |
CustomFields |
|
|
Optional | Array of KeyValuePair |
IsPaidManually | If TRUE, the invoice is marked as paid manually |
|
Mandatory | boolean |
ManualPaymentDetails | Details of the manual invoice/ bill payment | Mandatory when IsPaidManually = TRUE | Array of ManualPaymentDetails | |
IncomeType | If the Tax Withholding module is enabled and there are multiple income types that can be associated with the payment, then you must enter the income type per payment. |
|
Mandatory, if more than one income type is enabled | string |
InvoiceStatus |
|
Valid values:
|
Optional | string |
Currency | The currency of the invoice | Length = 3 (per ISO 4217) | Optional | string |
Approvers |
Note: This field can be empty and the default approvers that was set up will be used. |
Mandatory | Array of Tipalti Invoice Approver |
|
InvoiceNumber | The number of the invoice | Max. length = 256 | Optional | string |
PayerEntityName | The name of the payer entity linked to the invoice |
|
Mandatory, if more than one income type is enabled | string |
InvoiceSubject |
|
|
|
string |
ApAccountNumber | The default GL account number (credited with invoice amounts) to link to the invoice | Max. length = 450 | Mandatory, if multiple AP accounts have been defined in Tipalti | string |
InvoiceLine
element |
description |
limitation |
Mandatory? |
data type |
---|---|---|---|---|
Currency | The currency of the invoice | Length = 3 (per ISO 4217) | Optional | string |
Amount | Invoice line amount | Mandatory | double | |
Description | Description of the invoice line | Max. length = 256 | Optional | string |
InvoiceInternalNotes | Notes that are not displayed to the payee |
|
Optional | string |
EWalletMessage |
|
|
Optional | string |
BankingMessage |
|
|
Optional | string |
CustomFields |
|
|
Optional | Array of KeyValue Pair |
GLAccount | List of GL account details for the GL account linked to the invoice line |
Can only be updated if bill status is currently:
|
Optional | GLAccount |
LineType |
The type of invoice line:
|
Valid values:
|
Optional | string |
LineExternalMetadata |
|
Optional | string | |
Quantity |
|
Optional | decimal | |
BillLineID |
|
|
Optional | string |
TaxCodeExternalId | The type of tax code and its rate—e.g., VAT-UK (20%) | Mandatory, if TaxAmount is included | string | |
TaxAmount |
|
Optional | decimal | |
RelatedPurchaseOrders |
|
Optional | Array of TipaltiRelated PurchaseOrder |
GLAccount
If the ExternalId does not exist in Tipalti, a new GL A general ledger (GL) is used for recording transactions related to business assets, liabilities, equity, revenue and expenses. account is created.
element |
Description |
Limitation |
Mandatory? |
Data Type |
---|---|---|---|---|
Name | The name of the GL account | Max. length = 450 | Mandatory | string |
Number |
|
Max. length = 450 | Optional | integer |
ExternalId | An ID that uniquely identifies the GL account (e.g., in NetSuite, it is the "Internal ID") | Max. length = 100 | Mandatory | string |
Description | A description of the GL account | Max. length = 450 | Optional | string |
MiscBox1099 |
|
Valid values for expense accounts:
Note: The values above apply to the "New IRS format (2020 and onwards)". Click here to see the "Old IRS format (pre-2020)". |
Optional | string |
Type | The type of GL account |
Valid values:
|
Optional | string |
Currency | The currency of the GL account | Length = 3 (per ISO 4217) | Optional | string |
Element |
Description |
Limitations |
Mandatory? |
Data type |
---|---|---|---|---|
PurchaseOrderNumber | An identifier for the purchase order | Mandatory | string | |
ItemNumber | Code for the purchase order line | Mandatory | string | |
Quantity | Quantity of the purchase order line | Max. of four decimal places | Mandatory | decimal |
Amount | Amount of the purchase order line | Max. of four decimal places | Mandatory | decimal |
ExternalLineId | The identifier of the purchase order line in your accounting system | Optional | string | |
ItemExternalId | The identifier of the item line | Optional | string | |
PoLineGlAccountExternalId | The identifier of the PO line linked to the GL account | Optional | string | |
PoLineUnitName | Name of the unit for the PO line | Optional | string | |
PoLineUnitExternalId | The identifier of the unit for the PO line | Optional | string |
KeyValuePair
Element |
description |
Mandatory? |
data type |
---|---|---|---|
Key | Name of field | Optional | string |
Value | Value of field | Optional | string |
ManualPaymentDetails
Element |
description |
Limitations |
Mandatory? |
data type |
---|---|---|---|---|
GLAccountExternalId | The external ID of the GL account linked to the invoice that you want to mark as manually paid | Max. length = 450 | Mandatory when ManualPaymentDetails is required* | string |
TransactionDate | The date to mark the invoice as manually paid | YYYY-MM-DDThh:mm:ss, where T indicates the start of the time section | Mandatory when ManualPaymentDetails is required* | dateTime |
* This parameter is required when IsPaidManually = TRUE and the payer follows these conditions:
|
TipaltiInvoiceApprover
element |
Description |
Mandatory? |
Data Type |
---|---|---|---|
Name | Name of bill approver | Optional | string |
Email address of bill approver | Optional | string | |
Order |
|
Optional | integer |
Response parameters
element |
description |
data type |
---|---|---|
CreateOrUpdateInvoicesResult | Contains the response parameters | CreateOrUpdateInvoiceResult (extension of type TipaltiResponse) |
CreateOrUpdateInvoiceResult
element |
description |
limitation |
data type |
---|---|---|---|
errorMessage | A description of the error | See API error codes. | string |
errorCode | The status of the error | See API error codes. | string |
b | If the return code is Boolean, this parameter will carry the value. | boolean | |
i | If the return code is integer, this parameter will carry the value. | integer | |
d | If the return code is double, this parameter will carry the value. | double | |
s | If the return code is string, this parameter will carry the value. | string | |
InvoiceErrors |
|
Array of TipaltiInvoiceItemResult |
TipaltiInvoiceItemResult
element |
description |
Limitation |
data type |
---|---|---|---|
ErrorMessage | A description of the error | string | |
Succeeded | Indicates if the invoice was created or updated successfully | boolean | |
InvoiceRefCode | The reference code for the invoice |
|
string |