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/check

Authenticate 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

FieldTypeDescription
quote_idstring, requiredYour identifier.
currencystring, requiredISO 4217 code.
linesobject[], required1 to 50 lines: product_id, name, quantity, list_price, net_price, and optional line_id, discount_percent, amount, attributes.
totaldecimal, optionalChecked against the sum of the line amounts.
pricing_rulesobject, optionalmax_discount_percent, price_tolerance (default 0.01), requires [{ product_id, requires_product_id }], excludes [{ product_id, excludes_product_id }].
approval_policyobject, optionaldiscount_percent_over and total_over. Approval is evaluated only against these.
customer_requirementsstring[], optionalUp 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": []
}
FieldTypeDescription
request_idstringUnique 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.
issuesobject[]type, method ("deterministic" | "model_assisted"), optional line (zero-based), expected and actual, a fixed explanation, and evidence.
approval_requiredboolean | nullnull when no approval_policy was sent: Kovca doesn't guess.
approval_reasonsstring[]Which approval threshold was exceeded, with the values.
computed_totalstringThe 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.