Available · v1
Invoice Intelligence
Send an invoice with its purchase order and receipts. Get back matched lines, exact quantity, price, and total discrepancies, possible duplicates, and a recommended next step.
- Exact decimal arithmetic, never estimated
- Matches differently worded lines to the right order line
- Ambiguous matches go to a person instead of being guessed
- Never approves or initiates payments
Request body
{
"invoice": {
"number": "INV-20931",
"vendor": {
"name": "Northwind Supply",
"id": "V-1042"
},
"currency": "USD",
"lines": [
{
"sku": "NW-4410",
"description": "Nitrile gloves, large, box of 100",
"quantity": 40,
"unit_price": "12.50",
"amount": "500.00"
},
{
"description": "Hand sanitizer gel 500ml pump bottle",
"quantity": 24,
"unit_price": "4.10",
"amount": "98.40"
}
],
"subtotal": "598.40",
"tax": "47.87",
"total": "646.27"
},
"purchase_order": {
"number": "PO-7781",
"currency": "USD",
"lines": [
{
"line_id": "1",
"sku": "NW-4410",
"description": "Gloves, nitrile, L (100/box)",
"quantity": 40,
"unit_price": "12.50"
},
{
"line_id": "2",
"description": "Sanitizer, gel, 500 ml pump",
"quantity": 24,
"unit_price": "3.95"
}
]
}
}Response · 200 OK
{
"request_id": "req_2bWq9Lm4Ks7TzXcN",
"status": "discrepancies_found",
"recommended_action": "reject_for_correction",
"issues": [
{
"type": "unit_price_mismatch",
"invoice_line": 1,
"po_line": 1,
"expected": "3.95",
"actual": "4.10",
"explanation": "The unit price differs from the purchase order price.",
"evidence": [
"invoice.lines[1]",
"purchase_order.lines[1]"
]
}
],
"matched_lines": [
{
"invoice_line": 0,
"po_line": 0,
"method": "identifier"
},
{
"invoice_line": 1,
"po_line": 1,
"method": "description"
}
],
"unmatched_lines": [],
"missing_information": []
}The problem
Manual invoice reconciliation is slow and error-prone
Accounts payable teams compare invoices with purchase orders and receipts line by line. Vendors describe the same item differently, prices drift, and duplicates slip through.
Use cases
Where teams use it
- Accounts payable
- Three-way match
- Procure-to-pay platforms
- Duplicate invoice detection
- Spend management
Limitations
- One purchase order per request, and no currency conversion.
- Duplicates are detected only against invoices you supply.
- Advisory: it recommends a next step and never pays or approves.
Integrate
One HTTP call
const response = await fetch("https://kovca.io/api/v1/invoices/check", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KOVCA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"invoice": {
"number": "INV-20931",
"vendor": {
"name": "Northwind Supply",
"id": "V-1042"
},
"currency": "USD",
"lines": [
{
"sku": "NW-4410",
"description": "Nitrile gloves, large, box of 100",
"quantity": 40,
"unit_price": "12.50",
"amount": "500.00"
},
{
"description": "Hand sanitizer gel 500ml pump bottle",
"quantity": 24,
"unit_price": "4.10",
"amount": "98.40"
}
],
"subtotal": "598.40",
"tax": "47.87",
"total": "646.27"
},
"purchase_order": {
"number": "PO-7781",
"currency": "USD",
"lines": [
{
"line_id": "1",
"sku": "NW-4410",
"description": "Gloves, nitrile, L (100/box)",
"quantity": 40,
"unit_price": "12.50"
},
{
"line_id": "2",
"description": "Sanitizer, gel, 500 ml pump",
"quantity": 24,
"unit_price": "3.95"
}
]
}
}),
});
if (!response.ok) {
const { error, request_id } = await response.json();
throw new Error(`${error.code}: ${error.message} (${request_id})`);
}
const { status, recommended_action, issues } = await response.json();Related APIs
- Quote Intelligence
Validate quotes for pricing errors, discount exceptions, configuration conflicts, and approval requirements.