Quote Intelligence
Validate a quote for pricing errors, discount exceptions, configuration conflicts, unmet requirements, and approval needs.
Endpoint
POST https://kovca.io/api/v1/quotes/checkAuthenticate with your API key in the Authorization: Bearer header. Send JSON with Content-Type: application/json; bodies are limited to 16 KB.
All arithmetic is exact decimal arithmetic in code, and your pricing and approval rules are applied exactly as sent. Interpretation is used only to check customer requirements and line configurations. Policies you don't send are never assumed. The API advises; it never generates, submits, or approves quotes.
Request body
| Field | Type | Description |
|---|---|---|
| quote_id | string, required | Your identifier. |
| currency | string, required | ISO 4217 code. |
| lines | object[], required | 1 to 50 lines: product_id, name, quantity, list_price, net_price, and optional line_id, discount_percent, amount, attributes. |
| total | decimal, optional | Checked against the sum of the line amounts. |
| pricing_rules | object, optional | max_discount_percent, price_tolerance (default 0.01), requires [{ product_id, requires_product_id }], excludes [{ product_id, excludes_product_id }]. |
| approval_policy | object, optional | discount_percent_over and total_over. Approval is evaluated only against these. |
| customer_requirements | string[], optional | Up to 20 requirements in plain language, 300 characters each. |
Example request
{
"quote_id": "Q-2026-0142",
"currency": "USD",
"lines": [
{
"product_id": "SRV-R740",
"name": "Rack server, 2U, dual CPU",
"quantity": 4,
"list_price": "8200.00",
"net_price": "6560.00",
"discount_percent": 20,
"attributes": {
"power_supply": "230V"
}
},
{
"product_id": "SUP-3Y",
"name": "3-year onsite support",
"quantity": 4,
"list_price": "900.00",
"net_price": "900.00"
},
{
"product_id": "RAIL-KIT",
"name": "Sliding rail kit",
"quantity": 2,
"list_price": "120.00",
"net_price": "120.00"
}
],
"total": "30080.00",
"pricing_rules": {
"max_discount_percent": 25,
"requires": [
{
"product_id": "SRV-R740",
"requires_product_id": "SUP-3Y"
}
]
},
"approval_policy": {
"discount_percent_over": 15,
"total_over": 50000
},
"customer_requirements": [
"Four servers",
"Onsite support for at least three years",
"A rail kit for every server"
]
}Response
200 OK
{
"request_id": "req_Hq8mT3vLp6RzN1wK",
"status": "issues_found",
"recommended_action": "correct_quote",
"issues": [
{
"type": "requirement_mismatch",
"method": "model_assisted",
"explanation": "The quote doesn't meet the customer requirement: \"A rail kit for every server\"",
"evidence": [
"customer_requirements[2]"
]
}
],
"approval_required": true,
"approval_reasons": [
"A discount of 20% is above the 15% approval threshold."
],
"computed_total": "30080.00",
"missing_information": []
}| Field | Type | Description |
|---|---|---|
| request_id | string | Unique ID for this request. |
| status | "valid" | "issues_found" | "requires_approval" | "requires_review" | "insufficient_information" | See below. |
| recommended_action | "proceed" | "correct_quote" | "request_approval" | "manual_review" | See below. |
| issues | object[] | type, method ("deterministic" | "model_assisted"), optional line (zero-based), expected and actual, a fixed explanation, and evidence. |
| approval_required | boolean | null | null when no approval_policy was sent: Kovca doesn't guess. |
| approval_reasons | string[] | Which approval threshold was exceeded, with the values. |
| computed_total | string | The sum of the line amounts, exact to the cent. |
| missing_information | "pricing_rules" | "approval_policy" | "customer_requirements"[] | Which of the optional inputs weren't sent. |
Statuses (first match wins)
issues_found: A pricing, discount, product-rule, or configuration problem, or a clearly unmet requirement. Action: correct_quote.requires_review: Only uncertain findings, such as a requirement the quote doesn't show either way. Action: manual_review.requires_approval: No issues, but an approval threshold is exceeded. Action: request_approval.insufficient_information: No pricing rules, approval policy, or customer requirements were sent, so only arithmetic could be checked. Action: manual_review.valid: Nothing found. Action: proceed.
Issue types
pricing_discrepancy: A net price isn't the list price less the stated discount, a line amount isn't quantity × net price, or the total isn't the sum of the lines.discount_exception: A line's discount (list − net, as a percentage of list) is above pricing_rules.max_discount_percent.configuration_conflict: Two quoted products are excluded together by pricing_rules.excludes, or (interpreted) two lines have contradictory configurations.missing_required_product: A quoted product requires another product, per pricing_rules.requires, that isn't on the quote.requirement_mismatch: A customer requirement isn't met, or it's unclear from the quote whether it is. The requirement is quoted exactly.
Pricing errors
Request
{
"quote_id": "Q-2026-0151",
"currency": "USD",
"lines": [
{
"product_id": "WIDGET",
"name": "Industrial widget",
"quantity": 10,
"list_price": "100.00",
"net_price": "85.00",
"discount_percent": 10,
"amount": "850.00"
}
],
"total": "900.00",
"pricing_rules": {
"max_discount_percent": 30
}
}Code
curl https://kovca.io/api/v1/quotes/check \
-H "Authorization: Bearer $KOVCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"quote_id": "Q-2026-0142",
"currency": "USD",
"lines": [
{
"product_id": "SRV-R740",
"name": "Rack server, 2U, dual CPU",
"quantity": 4,
"list_price": "8200.00",
"net_price": "6560.00",
"discount_percent": 20,
"attributes": {
"power_supply": "230V"
}
},
{
"product_id": "SUP-3Y",
"name": "3-year onsite support",
"quantity": 4,
"list_price": "900.00",
"net_price": "900.00"
},
{
"product_id": "RAIL-KIT",
"name": "Sliding rail kit",
"quantity": 2,
"list_price": "120.00",
"net_price": "120.00"
}
],
"total": "30080.00",
"pricing_rules": {
"max_discount_percent": 25,
"requires": [
{
"product_id": "SRV-R740",
"requires_product_id": "SUP-3Y"
}
]
},
"approval_policy": {
"discount_percent_over": 15,
"total_over": 50000
},
"customer_requirements": [
"Four servers",
"Onsite support for at least three years",
"A rail kit for every server"
]
}'Errors
400 INVALID_REQUEST: a field is missing, too long, the wrong type, or not allowed. The message names the field.413 PAYLOAD_TOO_LARGE: the body is larger than 16 KB.401 UNAUTHORIZED,429 RATE_LIMITED,503 SERVICE_UNAVAILABLE,504 TIMEOUT: see Errors and limits.
Limitations
- Configuration conflicts are found from your excludes rules and from line attributes; without either, conflicts can go unnoticed.
- Customer requirements are checked against the quote's lines only, not your product catalog.
- Approval is advisory and covers only the thresholds you send.
- Request data is processed to produce the result and is not stored by Kovca.