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.

Three-way match
Invoice quantities are checked against the order and the receipts, and prices against the order, with your tolerances.
Line matching
Lines are paired by SKU or line ID first, then by description when wording differs, such as "Gloves, nitrile, L" and "Nitrile gloves, large".
Arithmetic and duplicates
Line amounts, subtotals, and totals are recomputed exactly. Duplicates are flagged against invoices you supply.
Use cases

Where teams use it

  • Accounts payable
  • Three-way match
  • Procure-to-pay platforms
  • Duplicate invoice detection
  • Spend management
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();
  • Quote Intelligence

    Validate quotes for pricing errors, discount exceptions, configuration conflicts, and approval requirements.