Kynthar API Documentation
Procurement intelligence over HTTP. Upload documents, read the extracted and cross-referenced results, and subscribe to events.
Base URL: https://kynthar.com
All endpoints are versioned under /api/v1/.
Authentication
Company or per-user API key. Send as Authorization: Bearer <key> or as X-API-Key: <key> header.
X-API-Key: your_api_key_here
Get your API key: Login → Settings → Copy API Key
Response envelope
Canonical success envelope. Single shape for every 2xx JSON response.
| Field | Type |
|---|---|
data | any |
pagination | object |
pagination.next_cursor | string or null |
pagination.has_more | boolean |
pagination.limit | integer |
meta | object |
Errors use one shape everywhere:
| Field | Type |
|---|---|
error | object |
error.code | string |
error.message | string |
error.details | any |
error.request_id | string |
{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Document not found"
}
}
Common statuses: 401 bad or missing API key · 404 not found ·
422 validation failed · 429 rate or plan limit reached ·
500 our bad, we're on it.
Pagination
Cursor pagination block. Absent from the envelope when the response is a complete list.
cursor— Opaque base64url cursor; omit for first page.limit— Page size (default 25, max 100).
| Field | Type |
|---|---|
next_cursor | string or null |
has_more | boolean |
limit | integer |
Pass pagination.next_cursor back as cursor until has_more is
false.
Quick start: upload a document
1. Request an upload slot
POST /api/v1/ingest/initiate
Content-Type: application/json
{ "file_name": "invoice.pdf", "content_type": "application/pdf" }
The response data carries a presigned upload_url and a key.
2. Upload the file bytes
PUT <data.upload_url>
Content-Type: application/pdf
<raw file bytes>
3. Start processing
POST /api/v1/ingest/finalize
Content-Type: application/json
{ "key": "<data.key>", "original_filename": "invoice.pdf" }
The response data.doc_id identifies the document.
4. Read the result
Poll GET /api/v1/documents/{doc_id} until processing
completes — or skip polling and subscribe to the
document.processed webhook below.
You can also email documents straight in: every company gets an
ingest address ({your-company-id}@ingest.kynthar.com — find yours
in Settings).
API reference
Generated from the same contract the API is served and validated with — grouped by domain. Endpoints not yet in the published contract are omitted; this reference grows as the contract does.
Accessorial authorizations
GET /api/v1/accessorial-authorizations
List accessorial authorizations
data payload:
| Field | Type |
|---|---|
authorizations | array of objects |
authorizations[].id | number |
authorizations[].pro_number | string |
authorizations[].charge_code | string |
authorizations[].authorized_by | string or null |
authorizations[].authorized_at | string or null |
authorizations[].authorized_amount_max | string or number or null |
authorizations[].authorization_expires_at | string or null |
authorizations[].source | string |
authorizations[].notes | string or null |
authorizations[].created_at | string or null |
authorizations[].updated_at | string or null |
Account
GET /api/v1/bootstrap
Consolidated auth + company bootstrap payload — Returns everything a client needs to initialize a session in one request — the authenticated user, company profile, enabled modules, feature flags, and plan. Call it once on startup instead of fetching each piece separately.
Returns: Bootstrap payload
Agent
POST /api/v1/agent/actions/{id}/approve
Create agent action approve
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
action_id | string |
status | string |
decision_id | string |
approved_by | string |
denied_by | string |
POST /api/v1/agent/actions/{id}/deny
Create agent action deny
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
action_id | string |
status | string |
decision_id | string |
approved_by | string |
denied_by | string |
GET /api/v1/agent/pending-approvals
Get agent pending approvals
data payload:
| Field | Type |
|---|---|
actions | array of objects |
actions[].id | string |
actions[].action | string |
actions[].tool_id | string |
actions[].reason | string |
actions[].trust_level | string |
actions[].description | string or null |
actions[].context | object or null |
actions[].created_at | string or null |
Agent actions
POST /api/v1/agent-actions/{action_id}/dismiss
Create agent action dismiss
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
action_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
action_id | string |
status | string |
insight_action_id | string |
POST /api/v1/agent-actions/{action_id}/execute
Create agent action execute
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
action_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
action_id | string |
status | string |
decision_id | string |
dispatched_by | string |
GET /api/v1/agent-actions/{action_id}/reasoning
Get agent action reasoning
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
action_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
action_id | string |
tool_id | string |
tool_description | string or null |
status | string |
confidence | number or null |
reasoning_summary | string or null |
source_signals | array of objects or null |
source_kind | string or null |
entity_refs | array of objects or null |
created_at | string |
expires_at | string or null |
agent_principal_id | string |
GET /api/v1/agent-actions/stats
Get agent actions stats
data payload:
| Field | Type |
|---|---|
queued_for_approval | number |
executed_last_24h | number |
dismissed_last_24h | number |
failed_last_24h | number |
observations_executed_last_24h | number |
by_tool | object |
Alerts
GET /api/v1/alerts/date-drift
Get alerts date drift
data payload:
| Field | Type |
|---|---|
alerts | array of objects |
alerts[].alert_id | string |
alerts[].po_number | string |
alerts[].vendor_name | string or null |
alerts[].line_item | string or null |
alerts[].requested_date | string or null |
alerts[].promised_date | string or null |
alerts[].drift_days | number or string or null |
alerts[].status | string or null |
alerts[].created_at | string or null |
GET /api/v1/alerts/date-drift/count
Get alerts date drift count
data payload:
| Field | Type |
|---|---|
counts | object |
counts.new | number |
counts.acknowledged | number |
counts.resolved | number |
new_count | number |
Anomalies
GET /api/v1/anomalies
List anomalies/findings with cursor pagination and filters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor |
limit | query | integer | no | Page size (shared cursor contract) |
status | query | string | no | Anomaly status filter (default 'flagged') |
severity | query | string | no | Severity filter |
anomaly_type | query | string | no | Type filter |
doc_type | query | string | no | Document type filter |
doc_id | query | string | no | Scope to one document |
buyer_po_number | query | string | no | Scope to one PO number |
vendor_id | query | string | no | Scope to one vendor |
grouped | query | string | no | Collapse per-doc fan-out to (type, part) tuples ('1') |
data payload:
| Field | Type |
|---|---|
anomalies | array of objects |
anomalies[].id | number or string |
anomalies[].finding_id | string |
anomalies[].anomaly_type | string |
anomalies[].severity | string |
anomalies[].status | string |
anomalies[].title | string or null |
anomalies[].summary | string or null |
anomalies[].description | string or null |
anomalies[].claim | object or null |
anomalies[].verification_status | string or null |
anomalies[].detected_at | string |
anomalies[].related_doc_ids | array of string or null |
anomalies[].field_name | string or null |
anomalies[].current_value | any or null |
anomalies[].expected_value | any or null |
anomalies[].deviation_score | number or string or null |
anomalies[].deviation_percent | number or string or null |
anomalies[].expectation_part_key | string or null |
anomalies[].provenance | object or null |
Approvals
GET /api/v1/approvals/pending
Get approvals pending
data payload:
| Field | Type |
|---|---|
pending_approvals | array of objects |
pending_approvals[].action_id | string or null |
pending_approvals[].doc_id | string |
pending_approvals[].action_type | string or null |
pending_approvals[].approval_status | string or null |
pending_approvals[].assigned_to | string or null |
pending_approvals[].due_date | string or null |
pending_approvals[].invoice | object |
pending_approvals[].match | object |
pending_approvals[].rule | object |
pending_approvals[].vendor_risk_score | string or number or null or null |
pending_approvals[].notes | string or null |
pending_approvals[].created_by | string or null |
pending_approvals[].created_at | string or null |
GET /api/v1/approvals/rules
Get approvals rules
data payload:
| Field | Type |
|---|---|
rules | array of objects |
rules[].id | string |
rules[].rule_name | string |
rules[].rule_type | string |
rules[].conditions | object or null |
rules[].approver_role | string or null |
rules[].approver_user_id | string or null |
rules[].approver_email | string or null |
rules[].priority | number |
rules[].is_active | boolean |
rules[].created_at | string or null |
rules[].updated_at | string or null |
As of
GET /api/v1/as-of/{entity_type}/{entity_id}
Replay an entity's facts as they stood on a past date
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
entity_type | path | string | yes | — |
entity_id | path | string | yes | — |
at | query | string | yes | ISO timestamp to replay to. |
data payload:
| Field | Type |
|---|---|
entity_type | string |
entity_id | string |
as_of | string |
fact_count | number |
facts | array of objects |
facts[].kind | string |
facts[].value | any |
facts[].effective_at | string or null |
facts[].fact_id | string |
facts[].evidence_quote | string or null |
facts[].verification_status | string or null |
facts[].confidence | number or null |
GET /api/v1/as-of/vendor/{vendor_id}/orders
Replay a vendor's orders as they stood on a past date
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
at | query | string | yes | ISO timestamp to replay to. |
data payload:
| Field | Type |
|---|---|
vendor_id | string |
as_of | string |
order_count | number |
undated_excluded | number |
unnumbered_excluded | number |
orders | array of objects |
orders[].po_number | string or null |
orders[].order_date | string or null |
orders[].promised_delivery_date | string or null |
orders[].total_amount | number or string or null |
orders[].history | string |
Auth
GET /api/v1/auth/company-settings
Get auth company settings
data payload:
| Field | Type |
|---|---|
company_id | string |
company_name | string |
company_name_is_placeholder | boolean or null |
email | string or null |
ingest_email | string or null |
webhook_url | string or null |
webhook_enabled | boolean or null |
webhook_secret | string or null |
extraction_config | object or null |
model_tier | string or null |
enabled_modules | object or null |
has_email_ingests | boolean or null |
erp_connections | array of objects or null |
email_preferences | object or null |
company_address | string or null |
company_city | string or null |
company_state | string or null |
company_zip_code | string or null |
company_phone | string or null |
logo_s3_key | string or null |
default_payment_terms | string or null |
default_po_notes | string or null |
base_currency | string or null |
Automations
GET /api/v1/automations/actions
Get automations actions
data payload:
| Field | Type |
|---|---|
actions | array of objects |
actions[].name | string |
actions[].description | string or null |
actions[].category | string or null |
actions[].schema | any |
actions[].requiresApproval | boolean |
GET /api/v1/automations/events
Get automations events
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
events | array of objects |
events[].id | string |
events[].event_type | string or null |
events[].source | string or null |
events[].entity_id | string or null |
events[].entity_type | string or null |
events[].payload | object |
events[].processed_at | string or null |
events[].created_at | string or null |
GET /api/v1/automations/executions
Get automations executions
data payload:
| Field | Type |
|---|---|
total | number |
executions | array of objects |
executions[].id | string |
executions[].company_id | string or null |
executions[].rule_id | string |
executions[].rule_name | string or null |
executions[].trigger_event | string or null |
executions[].trigger_data | object |
executions[].status | string |
executions[].temporal_workflow_id | string or null |
executions[].vendor_id | string or null |
executions[].vendor_name | string or null |
executions[].result | object or null |
executions[].started_at | string or null |
executions[].completed_at | string or null |
executions[].error | string or null |
executions[].edited_subject | string or null |
executions[].edited_body | string or null |
GET /api/v1/automations/executions/{id}
Get automations execution
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
execution | object |
execution.id | string |
execution.company_id | string or null |
execution.rule_id | string |
execution.rule_name | string or null |
execution.trigger_event | string or null |
execution.trigger_data | object |
execution.status | string |
execution.temporal_workflow_id | string or null |
execution.vendor_id | string or null |
execution.vendor_name | string or null |
execution.result | object or null |
execution.started_at | string or null |
execution.completed_at | string or null |
execution.error | string or null |
execution.edited_subject | string or null |
execution.edited_body | string or null |
action_logs | array of objects |
action_logs[].id | string |
action_logs[].execution_id | string |
action_logs[].action_type | string or null |
action_logs[].action_data | object |
action_logs[].result | string or null |
action_logs[].created_at | string or null |
emails | array of objects |
emails[].id | string |
emails[].execution_id | string |
emails[].direction | string |
emails[].sender | string or null |
emails[].recipient | string or null |
emails[].subject | string or null |
emails[].body_html | string or null |
emails[].body_text | string or null |
emails[].ses_message_id | string or null |
emails[].created_at | string or null |
GET /api/v1/automations/executions/{id}/preview
Get automations execution preview
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
subject | string or null |
body_html | string or null |
recipient_email | string or null |
trigger_data | object |
trigger_event | string or null |
vendor_name | string or null |
rule_name | string or null |
is_edited | boolean |
GET /api/v1/automations/history
Get automations history
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data array — each row:
| Field | Type |
|---|---|
id | string |
record_id | string |
source | string |
status | string |
occurred_at | string |
rule_id | string or null |
rule_name | string or null |
tool_id | string or null |
vendor_name | string or null |
reasoning_summary | string or null |
entity_refs | array of objects or null |
execution_action_id | string or null |
GET /api/v1/automations/history/agent/{id}
Get automations history agent
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
record_id | string |
source | string |
status | string |
occurred_at | string |
rule_id | string or null |
rule_name | string or null |
tool_id | string or null |
vendor_name | string or null |
reasoning_summary | string or null |
entity_refs | array of objects or null |
execution_action_id | string or null |
GET /api/v1/automations/history/stats
Get automations history stats
data payload:
| Field | Type |
|---|---|
by_status | array of objects |
by_status[].status | string |
by_status[].count | number |
total | number |
GET /api/v1/automations/rules
Get automations rules
data payload:
| Field | Type |
|---|---|
rules | array of objects |
rules[].id | string |
rules[].company_id | string or null |
rules[].template_id | string or null |
rules[].template_key | string or null |
rules[].template_name | string or null |
rules[].category | string or null |
rules[].template_description | string or null |
rules[].step_config | array of any or null |
rules[].name | string |
rules[].enabled | boolean |
rules[].trigger_event | string or null |
rules[].conditions | object |
rules[].actions | array of any |
rules[].email_subject_template | string or null |
rules[].email_body_template | string or null |
rules[].cooldown_hours | number |
rules[].max_daily_emails | number |
rules[].require_approval | boolean |
rules[].quiet_hours_start | string or null |
rules[].quiet_hours_end | string or null |
rules[].quiet_hours_timezone | string or null |
rules[].workflow_mode | string or null |
rules[].condition_groups | any or null |
rules[].event_types | string or null |
rules[].trigger_source | string or null |
rules[].recipient_role | string or null |
rules[].execution_count | number |
rules[].last_executed_at | string or null |
rules[].created_at | string or null |
rules[].updated_at | string or null |
POST /api/v1/automations/rules/{id}/test
Create automations rule test
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
rule_name | string or null |
trigger_event | string or null |
total_matches | number |
rate_limited_vendors | array of string |
would_fire | number |
matches | array of objects |
dry_run | boolean |
GET /api/v1/automations/stats
Get automations stats
data payload:
| Field | Type |
|---|---|
active_rules | number |
total_rules | number |
executions_30d | number |
successful_30d | number |
failed_30d | number |
emails_sent_30d | number |
replies_received_30d | number |
avg_response_hours_30d | number or null |
committed_30d | number |
value_recovered_30d | number |
GET /api/v1/automations/templates
Get automations templates
data payload:
| Field | Type |
|---|---|
templates | array of objects |
templates[].id | string |
templates[].template_key | string or null |
templates[].name | string |
templates[].description | string or null |
templates[].category | string or null |
templates[].trigger_event | string or null |
templates[].default_conditions | object |
templates[].default_actions | array of any |
templates[].default_email_subject | string or null |
templates[].default_email_body | string or null |
templates[].configurable_fields | array of any |
templates[].sort_order | number |
templates[].step_config | array of any or null |
templates[].created_at | string or null |
GET /api/v1/automations/triggers
Get automations triggers
data payload:
| Field | Type |
|---|---|
triggers | array of objects |
triggers[].name | string |
triggers[].category | string or null |
triggers[].description | string or null |
triggers[].eventTypes | array of string |
triggers[].availableFields | array of objects |
triggers[].hasPollQuery | boolean |
Billing
GET /api/v1/billing/config
Get billing config
data payload:
| Field | Type |
|---|---|
publishable_key | string |
GET /api/v1/billing/usage
Get billing usage
data payload:
| Field | Type |
|---|---|
plan | string |
current_usage | number |
limit | number or null |
within_limit | boolean |
percentage_used | number |
is_grandfathered | boolean |
subscription_status | string or null |
company_id | string |
lifetime_usage | number |
is_overage | boolean |
overage_count | number |
overage_price_cents | number |
per_doc_price_cents | number or null |
trial_ends_at | string or null |
pilot_active | boolean |
pilot_ends_at | string or null |
pilot_days_remaining | number |
cancel_at_period_end | boolean |
current_period_end | string or null |
company_created_at | string or null |
dollars_caught | number |
is_demo | boolean |
org_usage | object or null |
GET /api/v1/billing/usage-history
Get billing usage history
data payload:
| Field | Type |
|---|---|
items | array of objects |
items[].id | string |
items[].counted_at | string or null |
items[].item_name | string or null |
items[].kind | string |
items[].doc_type | string or null |
truncated | boolean |
Briefing
GET /api/v1/briefing
List briefings
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
hero | object |
hero.open_issues | number |
hero.dollars_caught | number |
hero.emails_processed | number |
hero.action_items | number |
action_buckets | array of objects |
action_buckets[].label | string |
action_buckets[].count | number |
action_buckets[].link | string |
highlights | array of objects |
highlights[].source | string or null |
highlights[].severity | string or null |
highlights[].title | string |
highlights[].subtitle | string or null |
highlights[].link | string or null |
highlights[].amount | string or number or null |
highlights[].created_at | string or null |
email | object |
email.total | number |
email.action_required | number |
email.urgent | number |
email.inbound | number |
email.outbound | number |
generated_at | string or null |
Budgets
GET /api/v1/budgets
List budget ledger rows for the authenticated company
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
sort_by | query | string | no | Sort column (allowlisted per endpoint). |
sort_dir | query | string | no | — |
order | query | string | no | Alias for sort_dir (used only when sort_dir is absent). |
scope_kind | query | string | no | Filter to one budget scope kind. |
active | query | string | no | "1"/"true" restricts to budgets whose period covers today. |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
budgets | array of objects |
budgets[].id | string |
budgets[].scope_kind | string |
budgets[].scope_ref | string or null |
budgets[].scope_label | string or null |
budgets[].period_start | string or null |
budgets[].period_end | string or null |
budgets[].amount_usd | number or string or null |
budgets[].currency_code | string or null |
budgets[].encumbrance_usd | number or string or null |
budgets[].actuals_usd | number or string or null |
budgets[].available_usd | number or string or null |
budgets[].excluded_non_usd_count | number |
budgets[].unvalued_doc_count | number |
budgets[].open_po_count | number |
budgets[].invoice_count | number |
budgets[].warning_pct | number |
budgets[].source_citation | string or null |
budgets[].created_by | string or null |
budgets[].created_at | string or null |
budgets[].updated_at | string or null |
GET /api/v1/budgets/{id}
Get budget
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
scope_kind | string |
scope_ref | string or null |
scope_label | string or null |
period_start | string or null |
period_end | string or null |
amount_usd | number or string or null |
currency_code | string or null |
encumbrance_usd | number or string or null |
actuals_usd | number or string or null |
available_usd | number or string or null |
excluded_non_usd_count | number |
unvalued_doc_count | number |
open_po_count | number |
invoice_count | number |
warning_pct | number |
source_citation | string or null |
created_by | string or null |
created_at | string or null |
updated_at | string or null |
monthly_actuals | array of objects |
monthly_actuals[].month | string or null |
monthly_actuals[].actuals_usd | number or string or null |
monthly_actuals[].invoice_count | number |
excluded_note | string or null |
unvalued_note | string or null |
Carriers
GET /api/v1/carriers/{vendorId}/profile
Get carrier profile
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendorId | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
credentials | array of objects |
credentials[].credential_type | string |
credentials[].credential_number | string or null |
credentials[].status | string or null |
credentials[].expiration_date | string or null |
insurance | array of objects |
insurance[].insurance_type | string |
insurance[].insurer_name | string or null |
insurance[].coverage_amount | string or number or null |
insurance[].expiration_date | string or null |
insurance[].status | string or null |
contacts | array of objects |
contacts[].id | string or null |
contacts[].role | string or null |
contacts[].contact_name | string or null |
contacts[].email | string or null |
contacts[].phone | string or null |
contacts[].is_primary | boolean or null |
equipment_types | array of string |
rate_card_summary | object |
rate_card_summary.total_cards | number or string or null |
rate_card_summary.active_cards | number or string or null |
rate_card_summary.mode_count | number or string or null |
rate_card_summary.modes | array of string or null |
rate_card_summary.earliest_rate | string or null |
rate_card_summary.latest_expiry | string or null |
performance | object or null |
compliance_score | number or null |
Chart of accounts
GET /api/v1/chart-of-accounts
List chart of accounts
data payload:
| Field | Type |
|---|---|
accounts | array of objects |
accounts[].account_code | string |
accounts[].account_name | string |
accounts[].account_type | string |
accounts[].is_active | boolean |
Communications
GET /api/v1/communications
List communications with cursor pagination
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
status | query | string | no | — |
action | query | string | no | — |
type | query | string | no | — |
search | query | string | no | — |
direction | query | string | no | — |
date_from | query | string | no | — |
date_to | query | string | no | — |
sort | query | string | no | — |
order | query | string | no | — |
include_filed | query | boolean | no | Opt IN to filed noise mail (vendor_marketing / auto_reply / system_notification) — the default listing excludes it server-side. |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
communications | array of objects |
communications[].id | string |
communications[].email_ingest_id | string or null |
communications[].communication_types | array of string |
communications[].action_required | boolean |
communications[].urgency | string or null |
communications[].communication_date | string or null |
communications[].sender | object |
communications[].subject | string or null |
communications[].received_at | string or null |
communications[].cc_recipients | array of any |
communications[].linked_po | string or null |
communications[].linked_vendor_name | string or null |
communications[].entity_links | array of objects |
communications[].primary_match_score | number or string or null |
communications[].body_text | string or null |
communications[].email_direction | string or null |
communications[].sender_domain | string or null |
communications[].subject_normalized | string or null |
communications[].in_reply_to | string or null |
communications[].has_documents | boolean |
communications[].status | string or null |
communications[].snoozed_until | string or null |
communications[].resolved_at | string or null |
communications[].resolved_by | string or null |
communications[].email_class | string or null |
communications[].filed_reason | string or null |
communications[].filed_summary | string or null |
communications[].key_info | any or null |
communications[].amounts | any or null |
communications[].dates | any or null |
communications[].people | any or null |
communications[].references | any or null |
communications[].provenance | array of objects |
total | number or string or null |
GET /api/v1/communications/{id}
Get communication
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
email_ingest_id | string or null |
communication_types | array of string |
action_required | boolean |
urgency | string or null |
communication_date | string or null |
sender | object |
sender.email | string or null |
sender.name | string or null |
sender.title | string or null |
subject | string or null |
received_at | string or null |
cc_recipients | array of any |
linked_po | string or null |
linked_vendor_name | string or null |
entity_links | array of objects |
entity_links[].type | string or null |
entity_links[].ref | string or null |
entity_links[].score | number or string or null |
entity_links[].entity_type | string or null |
entity_links[].entity_id | string or null |
entity_links[].reference_value | string or null |
primary_match_score | number or string or null |
body_text | string or null |
email_direction | string or null |
sender_domain | string or null |
subject_normalized | string or null |
in_reply_to | string or null |
has_documents | boolean |
status | string or null |
snoozed_until | string or null |
resolved_at | string or null |
resolved_by | string or null |
email_class | string or null |
filed_reason | string or null |
filed_summary | string or null |
key_info | any or null |
amounts | any or null |
dates | any or null |
people | any or null |
references | any or null |
provenance | array of objects |
provenance[].fact_id | string |
provenance[].extraction_run_id | string or null |
provenance[].document_id | string or null |
provenance[].evidence_quote | string or null |
provenance[].confidence | number or string or null |
provenance[].fact_fingerprint | string or null |
provenance[].page_start | number or null |
provenance[].page_end | number or null |
provenance[].char_start | number or null |
provenance[].char_end | number or null |
body_html | string or null |
to_recipients | array of string |
thread_id | string or null |
attachments | array of objects |
attachments[].doc_id | string |
attachments[].doc_type | string or null |
attachments[].document_number | string or null |
attachments[].file_name | string or null |
attachments[].relation | string or null |
attachments[].mime_type | string or null |
attachments[].size_bytes | number or null |
attachments[].total_amount | number or string or null |
attachments[].currency | string or null |
attachments[].payment_terms | string or null |
attachments[].document_date | string or null |
unread_attachments | array of objects |
unread_attachments[].filename | string or null |
unread_attachments[].note | string |
extracted | object |
extracted.summary | string or null |
extracted.tracking_numbers | array of string or null |
extracted.total_amount | string or number or null |
extracted.amounts_mentioned | array of objects |
extracted.attachments_mentioned | array of objects |
extracted.response_needed | boolean or null |
extracted.delivery_update | string or null |
extracted.quantity_update | string or null |
extracted.vendor_questions | array of string |
extracted.response_deadline | string or null |
extracted.price_update | string or null |
extracted.order_status | string or null |
extracted.line_item_updates | array of objects |
extracted.quality_issue | string or object or null |
extracted.return_rma | string or object or null |
extracted.decision_required | string or object or null |
extracted.insights | string or null |
extracted.lead_time_change | string or null |
extracted.payment_info | string or null |
extracted.payment_terms | string or null |
extracted.ship_to_change | string or null |
extracted.shipping_documents | string or null |
extracted.customs_info | string or null |
extracted.lot_batch_numbers | array of string or null |
extracted.certifications | array of string or null |
extracted.order_links | array of objects |
extracted.portal_reference_without_link | boolean or null |
extracted.key_contacts | array of objects |
extracted.extras | object |
sender_source | string or null |
forwarded_by | string or null |
link_resolution | object or null |
linked_po_link_id | string or null |
GET /api/v1/communications/{id}/actions
Get communication actions
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
actions | array of objects |
actions[].id | string |
actions[].action_type | string or null |
actions[].notes | string or null |
actions[].snooze_until | string or null |
actions[].link_po_number | string or null |
actions[].created_by | string or null |
actions[].created_at | string or null |
GET /api/v1/communications/{id}/facts
Get communication facts
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
email_ingest_id | string |
facts | array of objects |
facts[].fact_id | string |
facts[].kind | string |
facts[].stated | object or null |
facts[].act | string or null |
facts[].topic | string or null |
facts[].speaker | string or null |
facts[].addressee | string or null |
facts[].subject_ref | string or null |
facts[].in_reply_to | string or null |
facts[].valid_from | string or null |
facts[].condition | object or null |
facts[].superseded | boolean |
facts[].superseded_by_fact_id | string or null |
facts[].confidence | number or string or null |
facts[].evidence_quote | string or null |
facts[].display | string or null |
facts[].po_number | string or null |
facts[].payload | object or null |
facts[].attachment_check | object or null |
facts[].display_fields | array of objects |
POST /api/v1/communications/{id}/link
Create communication link
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
success | boolean |
link | object |
link.id | string |
link.communication_id | string or null |
link.procurement_header_id | string or null |
link.link_type | string or null |
link.match_method | string or null |
link.linked_by | string or null |
GET /api/v1/communications/{id}/link-suggestions
Get communication link suggestions
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
suggestions | array of objects |
suggestions[].doc_id | string |
suggestions[].buyer_po_number | string or null |
suggestions[].vendor_name | string or null |
suggestions[].match_reason | string or null |
suggestions[].document_type | string or null |
suggestions[].created_at | string or null |
POST /api/v1/communications/{id}/reply
Create communication reply
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
success | boolean |
sent_to | string or null |
subject | string or null |
message_id | string or null |
GET /api/v1/communications/{id}/thread
Get communication thread
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
thread | array of objects |
thread[].id | string |
thread[].communication_types | array of string |
thread[].action_required | boolean |
thread[].urgency | string or null |
thread[].sender | object |
thread[].subject | string or null |
thread[].received_at | string or null |
thread[].direction | string or null |
thread[].in_reply_to | string or null |
thread[].summary | string or null |
thread[].to_recipients | array of string |
thread[].cc_recipients | array of string |
thread[].sender_domain | string or null |
thread[].body_text | string or null |
thread[].body_html | string or null |
thread[].extracted | object or null |
thread[].provenance | array of objects |
GET /api/v1/communications/{id}/threads
Get communication threads
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
threads | array of objects |
threads[].thread_id | string |
threads[].thread_kind | string |
threads[].primary_po_number | string or null |
threads[].status | string |
threads[].outcome | string or null |
threads[].summary | string or null |
threads[].has_anomaly | boolean |
threads[].delivered_in_full | boolean or null |
threads[].relationships | array of objects |
threads[].events | array of objects |
GET /api/v1/communications/stats
Get communications stats
data payload:
| Field | Type |
|---|---|
total | number |
open | number |
resolved | number |
snoozed | number |
action_required | number |
urgent | number |
high | number |
inbound | number |
outbound | number |
unlinked | number |
awaiting_response | number |
Company settings
GET /api/v1/company-settings
List company settings for the authenticated company
data payload:
| Field | Type |
|---|---|
settings | object |
Completeness
GET /api/v1/completeness/vendors/{vendorId}
Get completeness vendor
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendorId | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
vendor_id | string |
vendor_name | string |
doc_count | number |
avg_completeness_score | number or null |
docs_with_audit | number |
docs_without_audit | number |
missed_labels | array of objects |
missed_labels[].label_text | string |
missed_labels[].suggested_canonical_key | string |
missed_labels[].category | string |
missed_labels[].miss_count | number |
missed_labels[].doc_count_seen | number |
missed_labels[].miss_rate | number |
Contracts
GET /api/v1/contracts
List contracts for the authenticated company
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
sort_by | query | string | no | Sort column (allowlisted per endpoint). |
sort_dir | query | string | no | — |
order | query | string | no | Alias for sort_dir (used only when sort_dir is absent). |
status | query | string | no | Filter by contract status. |
vendor_id | query | string | no | Filter to one vendor. |
contract_type | query | string | no | Filter by contract type. |
search | query | string | no | Free-text search over contract number / vendor name. |
source_doc_id | query | string | no | Look up contracts created from one source document (bypasses the list MV so freshly extracted contracts appear). |
filter | query | string | no | Opaque base64url filter-builder spec. |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
contracts | array of objects |
contracts[].contract_id | string |
contracts[].contract_number | string or null |
contracts[].contract_type | string or null |
contracts[].scope_category | string or null |
contracts[].vendor_id | string or null |
contracts[].vendor_name | string or null |
contracts[].effective_date | string or null |
contracts[].expiration_date | string or null |
contracts[].total_value_limit | string or number or null |
contracts[].cumulative_spend | string or number or null |
contracts[].usage_complete | boolean |
contracts[].utilization_pct | string or number or null |
contracts[].status | string or null |
contracts[].auto_renewal | boolean or null |
contracts[].health_score | string or number or null |
contracts[].risk_level | string or null |
contracts[].successor_contract_id | string or null |
contracts[].successor_contract_number | string or null |
contracts[].created_at | string or null |
stats | object |
stats.total | number |
stats.active | number |
stats.expiring | number |
stats.expired | number |
stats.over_nte | number |
stats.renewed | number |
stats.is_renewal | number |
Custom fields
GET /api/v1/custom-fields/discovered
Get custom fields discovered
data payload:
| Field | Type |
|---|---|
header_fields | array of objects |
header_fields[].field_key | string |
header_fields[].document_count | number |
header_fields[].line_item_count | number |
line_fields | array of objects |
line_fields[].field_key | string |
line_fields[].document_count | number |
line_fields[].line_item_count | number |
Delivery analytics
GET /api/v1/analytics/carrier-scorecards
Carrier scorecards + summary
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
period | query | string | no | Trailing window in days (30 |
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
window | any or null |
carriers | array of objects |
carriers[].vendor_id | string or null |
carriers[].carrier_name | string |
carriers[].total_deliveries | number or string or null |
carriers[].measured_deliveries | number or string or null |
carriers[].otif_pct | string or number or null |
carriers[].on_time_pct | string or number or null |
carriers[].in_full_pct | string or number or null |
carriers[].avg_days_variance | string or number or null |
carriers[].carrier_otif_strict_pct | string or number or null or null |
carriers[].carrier_otif_strict_on_time | number or string or null |
carriers[].carrier_otif_strict_measured | number or string or null |
carriers[].avg_strict_variance_days | string or number or null or null |
carriers[].transit_time_actual_avg | string or number or null or null |
carriers[].total_freight_spend | string or number or null |
carriers[].invoice_count | number or string or null |
carriers[].anomaly_count | number or string or null |
carriers[].critical_count | number or string or null |
carriers[].active_rate_cards | number or string or null |
carriers[].composite_score | string or number or null |
carriers[].tenders_sent | number or string or null |
carriers[].tenders_accepted | number or string or null |
carriers[].acceptance_rate_pct | string or number or null |
carriers[].avg_acceptance_lag_hours | string or number or null |
carriers[].acceptance_month_bucket | string or null |
carriers[].delivered_basis_count | number or string or null |
carriers[].received_basis_count | number or string or null |
carriers[].graded_basis_label | string or null |
summary | object |
summary.total_carriers | number or string or null |
summary.fleet_otif_strict_pct | string or number or null or null |
summary.fleet_otif_on_time | number or string or null |
summary.fleet_otif_measured | number or string or null |
summary.graded_basis_label | string or null |
summary.total_freight_spend | string or number or null |
summary.active_rate_cards | number or string or null |
GET /api/v1/analytics/contract-reviews
Get contract reviews
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
latest | object or null |
history | array of objects |
history[].id | string |
history[].review_period | string or null |
history[].status | string |
history[].contracts_reviewed | number or string or null |
history[].critical_findings | number or string or null |
history[].high_findings | number or string or null |
history[].medium_findings | number or string or null |
history[].completed_at | string or null |
GET /api/v1/analytics/discounts
Early-payment discount capture analytics
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
period | query | string | no | Trailing window in days (30 |
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
totals | object |
totals.total_captured | string or number or null |
totals.total_missed | string or number or null |
totals.captured_count | number or string or null |
totals.missed_count | number or string or null |
totals.capture_rate_pct | string or number or null |
totals.eligible_count | number or string or null |
totals.expiring_soon_count | number or string or null |
totals.pipeline_savings | string or number or null |
totals.payment_data_available | boolean or null |
over_time | array of objects |
over_time[].month | string |
over_time[].captured | string or number or null |
over_time[].missed | string or number or null |
over_time[].captured_count | number or string or null |
over_time[].missed_count | number or string or null |
by_vendor | array of objects |
by_vendor[].vendor_id | string or null |
by_vendor[].vendor_name | string |
by_vendor[].captured | string or number or null |
by_vendor[].missed | string or number or null |
by_vendor[].captured_count | number or string or null |
by_vendor[].missed_count | number or string or null |
by_vendor[].capture_rate_pct | string or number or null |
period | string |
GET /api/v1/analytics/executive-summary
Get executive summary
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
total_spend | string or number or null |
total_spend_window | any or null |
total_spend_basis | string or null |
otif_pct | string or number or null |
otif_window | any or null |
otif_deliveries | number or string or null |
otif_on_time_deliveries | number or string or null |
otif_measured_deliveries | number or string or null |
first_pass_match_rate | string or number or null or null |
first_pass_match_window | any or null |
first_pass_matched | number or string or null |
first_pass_match_eligible | number or string or null |
value_surfaced | string or number or null |
value_currency_code | string or null |
open_exceptions | number or string or null |
active_contracts | number or string or null |
on_contract_spend_pct | string or number or null |
on_contract_spend | string or number or null |
total_spend_for_coverage | string or number or null |
on_contract_item_count | number or string or null |
total_item_count | number or string or null |
GET /api/v1/analytics/freight-audit
Freight audit anomaly rollup
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
period | query | string | no | Trailing window in days (30 |
data payload:
| Field | Type |
|---|---|
totals | object |
totals.total_anomalies | number or string or null |
totals.high_count | number or string or null |
totals.critical_count | number or string or null |
totals.medium_count | number or string or null |
totals.low_count | number or string or null |
totals.resolved_count | number or string or null |
by_type | array of objects |
by_type[].anomaly_type | string |
by_type[].count | number or string or null |
by_type[].critical_count | number or string or null |
trend | array of objects |
trend[].month | string |
trend[].anomaly_count | number or string or null |
trend[].critical_count | number or string or null |
recent | array of objects |
recent[].id | string or null |
recent[].anomaly_type | string or null |
recent[].severity | string or null |
recent[].status | string or null |
recent[].message | string or null |
recent[].vendor_name | string or null |
recent[].vendor_id | string or null |
recent[].created_at | string or null |
GET /api/v1/analytics/freight-spend
Freight spend KPIs, carriers, lanes
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
period | query | string | no | Trailing window in days (30 |
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
kpis | object |
kpis.shipment_count | number or string or null |
kpis.total_freight_spend | string or number or null |
kpis.avg_cost_per_shipment | string or number or null |
spend_over_time | array of objects |
spend_over_time[].month | string |
spend_over_time[].invoice_count | number or string or null |
spend_over_time[].total_spend | string or number or null |
by_carrier | array of objects |
by_carrier[].carrier_name | string |
by_carrier[].invoice_count | number or string or null |
by_carrier[].total_spend | string or number or null |
by_charge_type | array of objects |
by_charge_type[].charge_type | string |
by_charge_type[].line_count | number or string or null |
by_charge_type[].total_amount | string or number or null |
top_lanes | array of objects |
top_lanes[].origin | string or null |
top_lanes[].dest | string or null |
top_lanes[].shipment_count | number or string or null |
top_lanes[].total_spend | string or number or null |
top_lanes[].avg_cost | string or number or null |
GET /api/v1/analytics/intermodal-audit
Intermodal audit anomaly rollup
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
period | query | string | no | Trailing window in days (30 |
data payload:
| Field | Type |
|---|---|
totals | object |
totals.total_anomalies | number or string or null |
totals.high_count | number or string or null |
totals.critical_count | number or string or null |
totals.medium_count | number or string or null |
totals.low_count | number or string or null |
totals.resolved_count | number or string or null |
by_type | array of objects |
by_type[].anomaly_type | string |
by_type[].count | number or string or null |
by_type[].critical_count | number or string or null |
trend | array of objects |
trend[].month | string |
trend[].anomaly_count | number or string or null |
trend[].critical_count | number or string or null |
recent | array of objects |
recent[].id | string or null |
recent[].anomaly_type | string or null |
recent[].severity | string or null |
recent[].status | string or null |
recent[].message | string or null |
recent[].vendor_name | string or null |
recent[].vendor_id | string or null |
recent[].created_at | string or null |
GET /api/v1/analytics/lane-intelligence
Lane intelligence (carrier recs, stats, rate cards)
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
origin_zip | query | string | yes | Origin ZIP code. |
dest_zip | query | string | yes | Destination ZIP code. |
mode | query | string | no | Freight mode (default LTL). |
data payload:
| Field | Type |
|---|---|
lane | object |
lane.origin_zip | string |
lane.dest_zip | string |
lane.mode | string |
lane.lane_id | string or null |
lane.origin_country | string or null |
lane.dest_country | string or null |
lane.haversine_km | number or null |
lane.region_pair | string or null |
lane.transit_prediction | object or null |
recommendations | array of objects |
recommendations[].carrier_name | string |
recommendations[].carrier_vendor_id | string or null |
recommendations[].shipment_count | number or string or null |
recommendations[].avg_cost | string or number or null |
recommendations[].median_cost | string or number or null |
recommendations[].min_cost | string or number or null |
recommendations[].max_cost | string or number or null |
recommendations[].otif_pct | string or number or null |
recommendations[].on_time_pct | string or number or null |
recommendations[].avg_days_variance | string or number or null |
recommendations[].has_rate_card | boolean or null |
recommendations[].rate_card_rate | string or number or null |
recommendations[].rate_type | string or null |
recommendations[].cost_score | number or string or null |
recommendations[].otif_score | number or string or null |
recommendations[].volume_score | number or string or null |
recommendations[].composite_score | string or number or null |
recommendations[].acceptance_rate_pct | string or number or null |
recommendations[].avg_acceptance_lag_hours | string or number or null |
recommendations[].tenders_sent | number or string or null |
recommendations[].tenders_accepted | number or string or null |
recommendations[].acceptance_month_bucket | string or null |
lane_stats | object |
lane_stats.total_shipments | number or string or null |
lane_stats.carrier_count | number or string or null |
lane_stats.avg_cost | string or number or null |
lane_stats.median_cost | string or number or null |
rate_cards | array of objects |
rate_cards[].carrier_name | string |
rate_cards[].scac_code | string or null |
rate_cards[].discount_pct | string or number or null |
rate_cards[].rate_per_cwt | string or number or null |
rate_cards[].flat_rate | string or number or null |
rate_cards[].rate_per_mile | string or number or null |
rate_cards[].minimum_charge | string or number or null |
rate_cards[].freight_class | string or null |
rate_cards[].weight_break_min | string or number or null |
rate_cards[].weight_break_max | string or number or null |
GET /api/v1/analytics/otif
OTIF analytics summary over a trailing window
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
period | query | string | no | Trailing window in days (default '30') |
data payload:
| Field | Type |
|---|---|
summary | object |
summary.otif_pct | string or number or null |
summary.on_time_pct | string or number or null |
summary.in_full_pct | string or number or null |
summary.total_deliveries | number or string or null |
summary.measured_deliveries | number or string or null |
summary.on_time_count | number or string or null |
summary.in_full_count | number or string or null |
summary.otif_count | number or string or null |
summary.on_time_measured | number or string or null |
summary.in_full_measured | number or string or null |
summary.on_time_latest_promise_count | number or string or null |
summary.otif_latest_promise_count | number or string or null |
summary.on_time_latest_promise_pct | string or number or null |
summary.otif_latest_promise_pct | string or number or null |
summary.avg_days_variance | string or number or null |
summary.requested_share_pct | number or string or null |
summary.metric_backing | object or null |
summary.graded_basis | object or null |
alerts | any |
window | any or null |
GET /api/v1/analytics/otif/by-vendor
Get OTIF by vendor
data payload:
| Field | Type |
|---|---|
vendors | array of objects |
vendors[].vendor_name | string |
vendors[].vendor_id | string or null |
vendors[].total_deliveries | number or string or null |
vendors[].on_time_pct | string or number or null |
vendors[].in_full_pct | string or number or null |
vendors[].otif_pct | string or number or null |
vendors[].on_time_latest_promise_pct | string or number or null |
vendors[].otif_latest_promise_pct | string or number or null |
vendors[].avg_days_variance | string or number or null |
vendors[].delivered_basis_count | number or string or null |
vendors[].received_basis_count | number or string or null |
vendors[].graded_basis_label | string or null |
window | any or null |
unattributed_deliveries | number or string or null |
GET /api/v1/analytics/otif/trend
Get OTIF trend
data payload:
| Field | Type |
|---|---|
trend | array of objects |
trend[].week_start | string |
trend[].otif_pct | string or number or null |
trend[].on_time_pct | string or number or null |
trend[].in_full_pct | string or number or null |
trend[].otif_latest_promise_pct | string or number or null |
trend[].on_time_latest_promise_pct | string or number or null |
trend[].total | number or string or null |
trend[].total_deliveries | number or string or null |
trend[].otif_count | number or string or null |
trend[].measured_deliveries | number or string or null |
window | any or null |
GET /api/v1/analytics/savings
Savings totals, series, recent items, ROI
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
months | query | string | no | Trailing window in months. |
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
totals | object |
totals.total_savings | string or number or null |
totals.duplicates_prevented | string or number or null |
totals.price_variances | string or number or null |
totals.overbilling_caught | string or number or null |
totals.price_outliers | string or number or null |
totals.cumulative_fraud | string or number or null |
totals.sourcing_opportunities | string or number or null |
totals.early_payment_discounts | string or number or null |
totals.sole_source_risk | string or number or null |
totals.late_delivery_cost | string or number or null |
totals.email_credit_memos | string or number or null |
totals.discount_captured | string or number or null |
totals.discount_missed | string or number or null |
totals.total_events | number or string or null |
totals.docs_with_value | number or string or null |
savings_over_time | array of objects |
savings_over_time[].month | string |
savings_over_time[].total_savings | string or number or null |
savings_over_time[].event_count | number or string or null |
recent_items | array of objects |
recent_items[].event_id | string or null |
recent_items[].doc_id | string or null |
recent_items[].event_type | string or null |
recent_items[].amount_usd | string or number or null |
recent_items[].severity | string or null |
recent_items[].part_number | string or null |
recent_items[].details | string or null |
recent_items[].created_at | string or null |
recent_items[].vendor_name | string or null |
recent_items[].document_number | string or null |
roi | object |
roi.total_invoices_processed | number or string or null |
roi.total_invoice_spend | string or number or null |
roi.total_savings | string or number or null |
roi.savings_rate_pct | string or number or null |
tracker_identified | string or number or null |
tracker_recovered | string or number or null |
months | string |
GET /api/v1/analytics/savings-tracker
Get savings tracker
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
rollup | object |
rollup.total_identified | string or number or null |
rollup.total_recovered | string or number or null |
rollup.recovery_rate | string or number or null |
rollup.total_entries | number or string or null |
rollup.recovered_count | number or string or null |
entries | array of objects |
entries[].id | string |
entries[].contract_review_id | string or null |
entries[].contract_id | string or null |
entries[].finding_type | string or null |
entries[].finding_title | string |
entries[].vendor_name | string or null |
entries[].identified_amount | string or number or null |
entries[].recovered_amount | string or number or null |
entries[].status | string |
entries[].notes | string or null |
entries[].recovered_at | string or null |
entries[].created_at | string or null |
entries[].updated_at | string or null |
entries[].contract_number | string or null |
entries[].metric_backing | object or null |
GET /api/v1/analytics/spend
Spend analytics (over time, by vendor, by category)
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
period | query | string | no | Trailing window in days (30 |
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
spend_over_time | array of objects |
spend_over_time[].month | string |
spend_over_time[].total_spend | string or number or null |
spend_over_time[].invoice_count | number or string or null |
spend_by_vendor | array of objects |
spend_by_vendor[].vendor_id | string or null |
spend_by_vendor[].vendor_name | string |
spend_by_vendor[].total_spend | string or number or null |
spend_by_vendor[].invoice_count | number or string or null |
spend_by_vendor[].spend_pct | string or number or null |
spend_by_category | array of objects |
spend_by_category[].category | string |
spend_by_category[].total_spend | string or number or null |
spend_by_category[].invoice_count | number or string or null |
trends | object |
trends.current_total | string or number or null |
trends.previous_total | string or number or null |
trends.change_pct | string or number or null |
trends.current_invoice_count | number or string or null |
trends.previous_invoice_count | number or string or null |
concentration | object |
concentration.top5_pct | string or number or null |
concentration.top10_pct | string or number or null |
concentration.grand_total | string or number or null |
concentration.vendor_count | number or string or null |
period | string |
base_currency | string or null |
GET /api/v1/analytics/tariff-exposure
Tariff exposure by country / material + coverage
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
period | query | string | no | Trailing window in days (30 |
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
money_available | boolean |
money_unavailable_reason | string or null |
duty_as_of_date | string or null |
duty_snapshot_status | string |
duty_window_label | string or null |
total_duty_usd | string or number or null or null |
flat_exposure_total_usd | number or null |
blended_effective_rate_pct | string or number or null or null |
priced_lines | number or null |
avoidable_section_301_usd | string or number or null or null |
duty_source | string or null |
by_country | array of objects |
by_country[].country | string |
by_country[].country_code | string or null |
by_country[].risk_tier | string or null |
by_country[].base_tariff_pct | string or number or null |
by_country[].doc_count | number or string or null |
by_country[].line_count | number or string or null |
by_country[].total_spend | string or number or null |
by_country[].estimated_exposure | string or number or null |
by_country[].lines | array of objects |
by_country[].detail_coverage | object |
by_country[].duty_from_document_usd | number or string or null |
by_country[].duty_from_inferred_usd | number or string or null |
by_country[].effective_tariff_pct | string or number or null or null |
by_country[].duty_is_precise | boolean |
domestic | object or null |
by_material | array of objects or null |
material_by_country | array of objects or null |
material_coverage | object or null |
coverage | object |
coverage.total_lines | number or string or null |
coverage.lines_with_coo | number or string or null |
coverage.lines_with_hts | number or string or null |
coverage.total_spend | string or number or null |
coverage.spend_with_coo | string or number or null |
coverage.spend_with_hts | string or number or null |
coverage.coverage_pct | string or number or null |
coverage.hts_coverage_pct | string or number or null |
top_items | array of objects |
top_items[].item_id | string or null |
top_items[].vendor_part_number | string or null |
top_items[].description | string or null |
top_items[].country | string or null |
top_items[].hts_code | string or null |
top_items[].line_count | number or string or null |
top_items[].total_spend | string or number or null |
top_vendors | array of objects |
top_vendors[].vendor_id | string or null |
top_vendors[].vendor_name | string |
top_vendors[].country | string or null |
top_vendors[].invoice_count | number or string or null |
top_vendors[].total_spend | string or number or null |
trend | array of objects |
trend[].month | string |
trend[].tagged_spend | string or number or null |
trend[].total_spend | string or number or null |
contract_clauses | object |
contract_clauses.total | number or string or null |
contract_clauses.with_tariff_clause | number or string or null |
contract_clauses.passthrough_allowed | number or string or null |
contract_clauses.uncapped_passthrough | number or string or null |
risk_profiles | array of objects or null |
GET /api/v1/analytics/tariff-gaps
Tariff data gaps by vendor and item
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
period | query | string | no | Trailing window in days (30 |
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
money_available | boolean |
money_unavailable_reason | string or null |
by_vendor | array of objects |
by_vendor[].vendor_name | string |
by_vendor[].vendor_id | string or null |
by_vendor[].total_spend | string or number or null |
by_vendor[].spend_no_coo | string or number or null |
by_vendor[].spend_no_hts | string or number or null |
by_vendor[].total_lines | number or string or null |
by_vendor[].lines_no_coo | number or string or null |
by_vendor[].lines_no_hts | number or string or null |
by_item | array of objects |
by_item[].item_id | string or null |
by_item[].vendor_id | string or null |
by_item[].vendor_part_number | string or null |
by_item[].description | string or null |
by_item[].vendor_name | string or null |
by_item[].total_spend | string or number or null |
by_item[].line_count | number or string or null |
by_item[].missing_coo | boolean or null |
by_item[].missing_hts | boolean or null |
GET /api/v1/analytics/value-surfaced
Value surfaced totals + monthly series
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
months | query | string | no | Trailing window in months. |
data payload:
| Field | Type |
|---|---|
currency_code | string |
currency_complete | boolean |
unresolved_currency_events | integer |
window | object |
window.months | integer or null |
window.label | string |
window.undated_events | integer |
metric_backing | object or null |
totals | object |
totals.total_value | string or number or null |
totals.verified_value | string or number or null |
totals.identified_value | string or number or null |
totals.recovered_value | string or number or null |
totals.total_events | number or string or null |
totals.total_docs | number or string or null |
categories | array of objects |
categories[].key | string |
categories[].label | string |
categories[].total | string or number or null |
categories[].events | integer |
monthly | array of objects |
monthly[].month | string |
monthly[].total | string or number or null |
monthly[].events | number or string or null |
Dock appointments
GET /api/v1/dock-appointments
List dock appointments
data payload:
| Field | Type |
|---|---|
appointments | array of objects |
appointments[].id | string |
appointments[].appointment_number | string or null |
appointments[].appointment_type | string or null |
appointments[].status | string or null |
appointments[].carrier_id | string or null |
appointments[].carrier_name | string or null |
appointments[].carrier_display_name | string or null |
appointments[].dock_door | string or null |
appointments[].facility_location | string or null |
appointments[].scheduled_date | string or null |
appointments[].slot_start | string or null |
appointments[].slot_end | string or null |
appointments[].po_numbers | string or null |
appointments[].shipment_doc_id | string or null |
appointments[].tracking_number | string or null |
appointments[].trailer_number | string or null |
appointments[].seal_number | string or null |
appointments[].commodity_description | string or null |
appointments[].total_weight | number or string or null |
appointments[].total_pallets | number or string or null |
appointments[].special_instructions | string or null |
appointments[].notes | string or null |
appointments[].check_in_at | string or null |
appointments[].check_in_by | string or null |
appointments[].actual_departure | string or null |
appointments[].created_by | string or null |
appointments[].created_at | string or null |
appointments[].updated_at | string or null |
total | number |
GET /api/v1/dock-appointments/stats
Get dock appointments stats
data payload:
| Field | Type |
|---|---|
date | string |
total | number |
by_status | object |
Dock doors
GET /api/v1/dock-doors
List dock doors
data payload:
| Field | Type |
|---|---|
doors | array of objects |
doors[].id | string |
doors[].door_number | string |
doors[].door_type | string |
doors[].facility_location | string or null |
doors[].capabilities | string or null |
doors[].notes | string or null |
doors[].is_active | boolean |
Documents
GET /api/v1/documents
List documents with cursor pagination — Returns documents for the authenticated company, newest first by default. Supports cursor pagination and a handful of filter + sort params.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
sort_by | query | string | no | Sort column (allowlisted per endpoint). |
sort_dir | query | string | no | — |
doc_type | query | string | no | — |
vendor_name | query | string | no | — |
status | query | string | no | — |
search | query | string | no | — |
document_date | query | string | no | — |
Returns: Paginated document list
GET /api/v1/documents/{doc_id}/threads
Get document threads
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doc_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
threads | array of objects |
threads[].thread_id | string |
threads[].thread_kind | string |
threads[].primary_po_number | string or null |
threads[].status | string |
threads[].outcome | string or null |
threads[].summary | string or null |
threads[].has_anomaly | boolean |
threads[].delivered_in_full | boolean or null |
threads[].relationships | array of objects |
threads[].events | array of objects |
GET /api/v1/documents/{doc_id}/workbook
Get document workbook
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doc_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
workbook | object |
workbook.doc_id | string |
workbook.file_name | string or null |
workbook.source | string or null |
workbook.mime_type | string or null |
workbook.doc_type | string or null |
workbook.processing_status | string or null |
workbook.origin | object |
sheets | array of objects |
sheets[].sheet_index | number or string or null |
sheets[].sheet_name | string or null |
sheets[].kind | string |
sheets[].child_doc_id | string or null |
sheets[].doc_type | string or null |
sheets[].document_number | string or null |
sheets[].processing_status | string or null |
sheets[].import | object or null |
sheets[].grid | object or null |
Doe diesel prices
GET /api/v1/doe-diesel-prices
List doe diesel prices
data payload:
| Field | Type |
|---|---|
rows | array of objects |
rows[].id | number |
rows[].week_ending | string |
rows[].region | string |
rows[].price_per_gal | string or number or null |
rows[].source | string or null |
rows[].fetched_at | string or null |
rows[].created_at | string or null |
Entities
GET /api/v1/entities/{type}/{id}
Get entitie
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
type | path | string | yes | — |
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
entity | object |
schema | array of objects |
schema[].field_path | string |
schema[].field_type | string |
schema[].is_summable | boolean |
schema[].is_filterable | boolean |
schema[].description | string or null |
schema[].canonical_entity_type | string or null |
schema[].ui_order | number or null |
schema[].ui_format | string or null |
observations | array of objects |
observations[].fact_id | string |
observations[].kind | string |
observations[].payload | object or null |
observations[].source_type | string or null |
observations[].source_id | string or null |
observations[].created_at | string |
provenance | object or null |
related_count | number or null |
timeline_count | number or null |
GET /api/v1/entities/{type}/{id}/graph
Get entitie graph
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
type | path | string | yes | — |
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
root | object |
root.type | string |
root.id | string |
root.display_name | string or null |
root.route_key | string or null |
root.sender | string or null |
root.relation | string |
edges | array of objects |
edges[].from_entity_type | string |
edges[].from_entity_id | string |
edges[].to_entity_type | string |
edges[].to_entity_id | string |
edges[].relationship_type | string |
edges[].score | number or null |
edges[].source | string or null |
edges[].evidence | object or null |
nodes | array of objects |
nodes[].type | string |
nodes[].id | string |
nodes[].display_name | string or null |
nodes[].route_key | string or null |
nodes[].sender | string or null |
nodes[].relation | string |
GET /api/v1/entities/{type}/{id}/timeline
Get entitie timeline
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
type | path | string | yes | — |
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
events | array of objects |
events[].event_id | string |
events[].event_type | string |
events[].event_subtype | string |
events[].event_data | object or null |
events[].source_type | string or null |
events[].source_id | string or null |
events[].event_time | string |
events[].evidence_quote | string or null |
events[].chunk_citations | array of objects or null |
total_count | number |
Erp
GET /api/v1/erp/connections
Get erp connections
data payload:
| Field | Type |
|---|---|
connections | array of objects |
connections[].id | string |
connections[].erp_type | string |
connections[].status | string |
connections[].sync_vendors | boolean |
connections[].sync_accounts | boolean |
connections[].sync_pos | boolean |
connections[].push_bills | boolean |
connections[].last_sync_at | string or null |
connections[].error_message | string or null |
connections[].created_at | string or null |
GET /api/v1/erp/field-mappings
Get erp field mappings
data payload:
| Field | Type |
|---|---|
mappings | array of objects |
mappings[].id | string |
mappings[].erp_type | string |
mappings[].entity_type | string |
mappings[].source_field | string |
mappings[].source_field_label | string or null |
mappings[].source_field_type | string or null |
mappings[].target_table | string or null |
mappings[].target_field | string or null |
mappings[].target_jsonb_path | string or null |
mappings[].confidence | number or null |
mappings[].status | string |
mappings[].source | string or null |
mappings[].transform_type | string or null |
mappings[].transform_config | object or null |
mappings[].created_at | string or null |
mappings[].updated_at | string or null |
GET /api/v1/erp/import/connections
Get erp import connections
data payload:
| Field | Type |
|---|---|
connections | array of objects |
connections[].id | string |
connections[].system_type | string |
connections[].system_name | string |
connections[].status | string |
connections[].created_at | string or null |
connections[].updated_at | string or null |
GET /api/v1/erp/import/runs
Get erp import runs
data payload:
| Field | Type |
|---|---|
import_runs | array of objects |
import_runs[].id | string |
import_runs[].target_table | string or null |
import_runs[].status | string |
import_runs[].rows_imported | number or string or null |
import_runs[].rows_failed | number or string or null |
import_runs[].error_message | string or null |
import_runs[].created_at | string or null |
import_runs[].completed_at | string or null |
GET /api/v1/erp/import/runs/{id}/rows
Get erp import run rows
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
import_run_id | number |
target_table | string or null |
status | string |
total_rows | number or string or null |
inserted_rows | number or string or null |
error_rows | number or string or null |
landed_count | number or string or null |
diff_available | boolean |
total_data_rows | number or string or null |
rows_returned | number or string or null |
rows | array of objects |
rows[].row_number | number |
rows[].cells | array of objects |
GET /api/v1/erp/mappings
Get erp mappings
data payload:
| Field | Type |
|---|---|
mappings | array of objects |
mappings[].id | string |
mappings[].import_connection_id | string or null |
mappings[].system_name | string or null |
mappings[].target_table | string or null |
mappings[].column_mapping | object or null |
mappings[].header_values | array of string or null |
mappings[].created_at | string or null |
GET /api/v1/erp/sync/logs
Get erp sync logs
data payload:
| Field | Type |
|---|---|
logs | array of objects |
logs[].id | string |
logs[].erp_type | string |
logs[].direction | string or null |
logs[].entity_type | string or null |
logs[].entity_count | number or string or null |
logs[].status | string |
logs[].error_message | string or null |
logs[].started_at | string or null |
logs[].completed_at | string or null |
logs[].duration_ms | number or string or null |
GET /api/v1/erp/unmapped-columns
Get erp unmapped columns
data payload:
| Field | Type |
|---|---|
unmapped_columns | array of objects |
unmapped_columns[].id | string |
unmapped_columns[].connection_id | number or null |
unmapped_columns[].entity_type | string or null |
unmapped_columns[].source_field | string |
unmapped_columns[].sample_values | any |
unmapped_columns[].suggested_target_table | string or null |
unmapped_columns[].suggested_target_column | string or null |
unmapped_columns[].suggested_confidence | number or null |
unmapped_columns[].parking_reason | string |
unmapped_columns[].created_at | string or null |
Exposure
GET /api/v1/exposure
List exposures
data payload:
| Field | Type |
|---|---|
as_of_date | string or null |
base_currency | string |
total_exposed_usd | number or null |
currency_code | string |
money_available | boolean |
money_unavailable_reason | string or null |
portfolio_as_of_date | string or null |
events_linked | number |
briefing | object or null |
by_kind | array of objects |
by_kind[].signal_kind | string |
by_kind[].label | string |
by_kind[].total_usd | number or null |
by_kind[].amount_label | string |
by_kind[].currency_code | string |
by_kind[].window_label | string |
by_kind[].count | number |
signals | array of objects |
signals[].signal_kind | string |
signals[].signal_kind_label | string |
signals[].signal_ref | string |
signals[].signal_label | string |
signals[].exposure_amount_usd | number or null |
signals[].amount_label | string |
signals[].currency_code | string |
signals[].window_label | string |
signals[].exposure_basis | string |
signals[].confidence | number or null |
signals[].as_of_date | string or null |
signals[].snapshot_status | string |
signals[].source | object or null |
signals[].evidence_summary | object |
signals[].related_events | array of objects |
Feature flags
GET /api/v1/feature-flags
List feature flags
data payload:
| Field | Type |
|---|---|
flags | object |
Filter facets
GET /api/v1/filter-facets/{table}
Get filter facet
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
table | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
facets | object |
Findings
GET /api/v1/findings
List findings (grouped by category, money-ranked) with cursor pagination
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
status | query | string | no | — |
category | query | string | no | One buyer-facing category (the registry categories.order word: billing, contracts, payments, receiving, documents) — the finding type's registry assignment, resolved at read time (never the stored column). Omit for every category. The internal category is never returned. |
po_number | query | string | no | Scope to one PO — the row's PO # (its own po_number, else its document's buyer PO number). The orders list's open_findings_count counts exactly these rows under the default view. |
vendor_id | query | string | no | Scope to one vendor — the row's vendor (its stamped vendor_id, else its document's seller). The vendors list's open_findings_count counts exactly these rows under the default view. |
doc_id | query | string | no | Scope to one document — the findings raised on it. The invoices list's open_findings_count counts exactly these rows under the default view. |
search | query | string | no | — |
sort_by | query | string | no | One explicit ranking (amount = surfaceable $, document_date = the date the finding's document states, vendor); omit for the grouped default (category order, then $ desc, severity, newest). An unknown value falls back to the default. |
sort_dir | query | string | no | Direction for sort_by; $ and document_date default desc, vendor asc. |
detected_within | query | string | no | Window on when Kynthar found the issue (created_at): 1d, 7d, 30d or 90d. Applies to the rows and to category_counts alike. |
persona | query | string | no | The viewer's persona (buyer, ops, logistics, ap, compliance). It orders the grouped default: buyer and ap lead with money, ops and logistics with receiving, compliance with contracts. Omit it, or send one with no declared order, for the registry order. The rows' ranking and category_counts follow the same order. |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
findings | array of objects |
findings[].item_id | string |
findings[].kind | string |
findings[].waiting_on | string or null |
findings[].target | object or null |
findings[].finding_id | string or null |
findings[].finding_type | string or null |
findings[].category | string or null |
findings[].severity | string or null |
findings[].title | string or null |
findings[].summary | string or null |
findings[].status | string or null |
findings[].verification_status | string or null |
findings[].resolution_notes | string or null |
findings[].dismiss_reason | string or null |
findings[].resolved_by | string or null |
findings[].surfaceable_savings_usd | string or number or null |
findings[].source_document_date | string or null |
findings[].next_step | string or null |
findings[].metric_backing | object or null |
findings[].vendor_id | string or null |
findings[].vendor_name | string or null |
findings[].vendor_website | string or null |
findings[].document_label | string or null |
findings[].document_label_kind | string or null |
findings[].document_type | string or null |
findings[].additional_source_count | number or string or null |
findings[].doc_id | string or null |
findings[].recurrence_count | number or string or null |
findings[].created_at | string or null |
findings[].po_number | string or null |
findings[].source_fact_id | string or null |
findings[].source_comm_id | string or null |
findings[].claim | object or null |
findings[].amount | object or null |
findings[].amount_declared | boolean |
currency_code | string or null |
resolved_count | number or string or null |
resolved_scope | object |
resolved_scope.po_number | string or null |
resolved_scope.vendor_id | string or null |
resolved_scope.doc_id | string or null |
resolved_scope.contract_id | string or null |
resolved_scope.category | string or null |
open_count | number or string or null |
open_amount | object or null |
waiting_on | string |
waiting_on_counts | object |
waiting_on_counts.you | number |
waiting_on_counts.vendor | number |
waiting_on_counts.all | number |
recoverable_amount | object or null |
situation_totals | array of objects |
situation_totals[].po_number | string |
situation_totals[].total_usd | number or null |
situation_totals[].metric_backing | object or null |
category_counts | array of objects |
category_counts[].category | string |
category_counts[].label | string |
category_counts[].count | number |
category_counts[].money_total_usd | number or null |
category_counts[].metric_backing | object or null |
category_counts[].context | array of objects |
GET /api/v1/findings/{finding_id}/draft
Get finding draft
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
finding_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
action_id | string or null |
status | string or null |
draft | object or null |
evidence_links | array of objects |
evidence_links[].kind | string |
evidence_links[].id | string |
evidence_links[].url | string |
evidence_links[].label | string or null |
draftable_kind | string or null |
already_exists | boolean |
POST /api/v1/findings/{finding_id}/draft
Create finding draft
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
finding_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
action_id | string or null |
status | string or null |
draft | object or null |
evidence_links | array of objects |
evidence_links[].kind | string |
evidence_links[].id | string |
evidence_links[].url | string |
evidence_links[].label | string or null |
draftable_kind | string or null |
already_exists | boolean |
GET /api/v1/findings/stats
Get findings stats
data payload:
| Field | Type |
|---|---|
total | number |
material | number |
procedural | number |
critical | number |
high | number |
surfaceable_total | number |
Freight claims
GET /api/v1/freight-claims
List freight claims for the authenticated company
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
sort_by | query | string | no | Sort column (allowlisted per endpoint). |
sort_dir | query | string | no | — |
order | query | string | no | Alias for sort_dir (used only when sort_dir is absent). |
vendor_id | query | string | no | Filter to one carrier/vendor. |
status | query | string | no | Comma-separated claim status filter. |
claim_type | query | string | no | Filter by claim type. |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
items | array of objects |
items[].id | number or string |
items[].claim_number | string or null |
items[].vendor_id | string or null |
items[].vendor_name | string or null |
items[].claim_type | string or null |
items[].status | string or null |
items[].pro_number | string or null |
items[].tracking_number | string or null |
items[].shipment_doc_id | string or null |
items[].invoice_doc_id | string or null |
items[].amount_claimed | string or number or null |
items[].amount_approved | string or number or null |
items[].amount_recovered | string or number or null |
items[].currency_code | string or null |
items[].description | string or null |
items[].notes | string or null |
items[].evidence_doc_ids | array of string or null |
items[].filed_date | string or null |
items[].acknowledged_date | string or null |
items[].resolved_date | string or null |
items[].created_at | string or null |
GET /api/v1/freight-claims/{id}
Get freight claim
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | number or string |
claim_number | string or null |
vendor_id | string or null |
vendor_name | string or null |
claim_type | string or null |
status | string or null |
pro_number | string or null |
tracking_number | string or null |
shipment_doc_id | string or null |
invoice_doc_id | string or null |
amount_claimed | string or number or null |
amount_approved | string or number or null |
amount_recovered | string or number or null |
currency_code | string or null |
description | string or null |
notes | string or null |
evidence_doc_ids | array of string or null |
filed_date | string or null |
acknowledged_date | string or null |
resolved_date | string or null |
created_at | string or null |
GET /api/v1/freight-claims/stats
Get freight claims stats
data payload:
| Field | Type |
|---|---|
by_status | array of objects |
by_status[].status | string |
by_status[].count | number |
total_claims | number |
open_claims | number |
resolved_claims | number |
recovered_claims | number |
denied_claims | number |
recovery_rate_pct | number or null |
total_claimed | string or number or null |
total_recovered | string or number or null |
total_approved | string or number or null |
currency_code | string or null |
mixed_currency | boolean |
Gl category mappings
GET /api/v1/gl-category-mappings
List GL category mappings
data payload:
| Field | Type |
|---|---|
mappings | array of objects |
mappings[].id | string |
mappings[].category | string |
mappings[].subcategory | string or null |
mappings[].gl_account_code | string |
mappings[].created_at | string or null |
mappings[].account_name | string or null |
Identity
GET /api/v1/identity/{type}/{id}
Get identity
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
type | path | string | yes | — |
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
canonical | object |
canonical.id | string |
canonical.display_name | string or null |
canonical.type | string |
aliases | array of objects |
aliases[].value | string |
aliases[].type | string |
merged_from | array of objects |
merged_from[].id | string |
merged_from[].former_name | string or null |
merged_from[].merged_at | string or null |
decided | object |
decided.tier | string or null |
decided.method | string or null |
decided.confidence | number or string or null |
decided.source_doc_id | string or null |
decided.decided_at | string or null |
Import review
GET /api/v1/import-review/census
Get import review census
data payload:
| Field | Type |
|---|---|
by_sink | object |
open_total | number |
over_7d_total | number |
unsettled | object |
unsettled.total | number |
unsettled.over_1d | number |
unsettled.oldest_at | string or null |
GET /api/v1/import-review/parked
Get import review parked
data payload:
| Field | Type |
|---|---|
columns | object |
columns.items | array of objects |
sheets | object |
sheets.items | array of objects |
files | object |
files.items | array of objects |
census | object |
census.by_sink | object |
census.open_total | number |
census.over_7d_total | number |
census.unsettled | object |
GET /api/v1/import-review/parked/{sink}
Get import review parked
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
sink | path | string | yes | — |
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
items | array of objects |
items[].item_id | string |
items[].sink | string |
items[].observed_at | string or null |
items[].title | string or null |
items[].detail | object |
items[].source | object |
items[].first_seen_at | string or null |
items[].settled_at | string or null |
POST /api/v1/import-review/parked/{sink}/{item_id}/dismiss
Create import review parked dismiss
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
sink | path | string | yes | — |
item_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
item_id | string |
sink | string |
dismissed_by | string |
reason | string |
Ingested
GET /api/v1/ingested
Unified ingest feed (documents + emails + imports) with cursor pagination
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
source | query | string | no | — |
type | query | string | no | — |
date_from | query | string | no | — |
date_to | query | string | no | — |
search | query | string | no | — |
filter | query | string | no | Opaque base64url-encoded FilterSpec (Notion filter-builder). |
docs_only | query | boolean | no | — |
emails_only | query | boolean | no | — |
imports_only | query | boolean | no | Restrict the feed to tabular-intake artifacts (workbooks + ERP CSV imports). |
direction | query | string | no | Email direction view — inbound |
filed_only | query | boolean | no | Restrict the email branch to FILED noise mail. |
include_filed | query | boolean | no | — |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
items | array of objects |
items[].row_type | string |
items[].id | string |
items[].source | string |
items[].type | string |
items[].party | string or null |
items[].title | string or null |
items[].ts | string or null |
items[].status | string or null |
items[].size_bytes | number or string or null |
items[].page_count | number or string or null |
items[].parent_email_id | string or null |
items[].subject | string or null |
items[].sender_email | string or null |
items[].body_preview | string or null |
items[].summary | string or null |
items[].vendor_id | string or null |
items[].vendor_name | string or null |
items[].vendor_resolved | boolean or null |
items[].vendor_website | string or null |
items[].document_number | string or null |
items[].buyer_po_number | string or null |
items[].total_amount | number or string or null |
items[].currency_code | string or null |
items[].amount_basis | string |
items[].email_direction | string or null |
items[].email_class | string or null |
items[].filed_reason | string or null |
items[].filed_summary | string or null |
items[].thread_message_count | number or string or null |
items[].attachments | array of objects |
items[].sheet_count | number or string or null |
items[].import_rows_total | number or string or null |
items[].import_rows_inserted | number or string or null |
items[].import_rows_errored | number or string or null |
view | object or null |
Insights
GET /api/v1/insights
List insights
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
insights | array of objects |
insights[].insight_id | string |
insights[].analysis_type | string or null |
insights[].category | string or null |
insights[].title | string or null |
insights[].summary | string or null |
insights[].findings | array of string or object or null or null |
insights[].recommendations | array of string or object or null or null |
insights[].supporting_data | object or null |
insights[].confidence_score | string or number or null |
insights[].potential_savings_usd | string or number or null |
insights[].verification_status | string or null |
insights[].priority | number or string or null |
insights[].sensor_source | array of string or null |
insights[].status | string or null |
insights[].run_id | string or null |
insights[].recurrence_count | number or string or null |
insights[].first_seen_at | string or null |
insights[].created_at | string or null |
insights[].auto_triaged_at | string or null |
insights[].auto_triage_action | string or null |
insights[].triage_trace_id | string or null |
insights[].triage_reason | string or null |
insights[].provenance | object or null |
insights[].metric_backing | object or null |
insights[].assigned_to | string or null |
insights[].assigned_at | string or null |
insights[].dismiss_reason | string or null |
insights[].action_notes | string or null |
insights[].reviewed_at | string or null |
insights[].reviewed_by | string or null |
POST /api/v1/insights/generate
Create insights generate
data payload:
| Field | Type |
|---|---|
success | boolean |
run_id | string |
status | string |
GET /api/v1/insights/history
Get insights history
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
insights | array of objects |
insights[].insight_id | string |
insights[].analysis_type | string or null |
insights[].category | string or null |
insights[].title | string or null |
insights[].summary | string or null |
insights[].findings | array of string or object or null or null |
insights[].recommendations | array of string or object or null or null |
insights[].supporting_data | object or null |
insights[].confidence_score | string or number or null |
insights[].potential_savings_usd | string or number or null |
insights[].verification_status | string or null |
insights[].priority | number or string or null |
insights[].sensor_source | array of string or null |
insights[].status | string or null |
insights[].run_id | string or null |
insights[].recurrence_count | number or string or null |
insights[].first_seen_at | string or null |
insights[].created_at | string or null |
insights[].auto_triaged_at | string or null |
insights[].auto_triage_action | string or null |
insights[].triage_trace_id | string or null |
insights[].triage_reason | string or null |
insights[].provenance | object or null |
insights[].metric_backing | object or null |
insights[].assigned_to | string or null |
insights[].assigned_at | string or null |
insights[].dismiss_reason | string or null |
insights[].action_notes | string or null |
insights[].reviewed_at | string or null |
insights[].reviewed_by | string or null |
total | number or string or null |
page | number or string or null |
pages | number or string or null |
GET /api/v1/insights/runs/{run_id}
Get insights run
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
run_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
run_id | string |
status | string |
insights_generated | number or string or null |
llm_cost_usd | string or number or null |
error_message | string or null |
started_at | string or null |
completed_at | string or null |
GET /api/v1/insights/stats
Get insights stats
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
total_savings | string or number or null |
total_at_risk | string or number or null |
actioned_count | number or string or null |
reviewed_count | number or string or null |
total_count | number or string or null |
action_rate | string or number or null |
this_month | number or string or null |
top_category | string or null |
runs_this_month | number or string or null |
generation_limit | number or string or null |
plan | string or null |
categories | array of objects |
categories[].category | string |
categories[].count | number or string or null |
categories[].new_count | number or string or null |
categories[].savings | string or number or null |
GET /api/v1/insights/trends
Get insights trends
data payload:
| Field | Type |
|---|---|
trends | array of objects |
trends[].week | string or null |
trends[].category | string or null |
trends[].count | number or string or null |
trends[].savings | string or number or null |
trends[].actioned | number or string or null |
trends[].avg_recurrence | string or number or null |
Integrations
GET /api/v1/integrations/notification-config
Get integrations notification config
data payload:
| Field | Type |
|---|---|
configs | array of objects |
configs[].id | string |
configs[].provider | string |
configs[].channel_config | object or null |
configs[].enabled | boolean |
configs[].created_at | string or null |
configs[].updated_at | string or null |
configs[].team_name | string or null |
GET /api/v1/integrations/slack/channels
Get integrations slack channels
data payload:
| Field | Type |
|---|---|
channels | array of objects |
channels[].id | string |
channels[].name | string |
Invoices
GET /api/v1/invoices/{doc_id}/intelligence
Get invoice intelligence
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doc_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
doc_id | string |
generated_at | string |
severity | string or null |
summary | string or null |
findings | array of objects |
findings[].title | string |
findings[].description | string |
findings[].severity | string or null |
acknowledged_findings | array of objects |
acknowledged_findings[].title | string |
acknowledged_findings[].user_id | string or null |
acknowledged_findings[].user_email | string or null |
acknowledged_findings[].acknowledged_at | string or null |
acknowledged_findings[].note | string or null |
stale | boolean |
GET /api/v1/invoices/{invoice_number}/amendments
Get invoice amendments
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
invoice_number | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
invoice_number | string |
amendments | array of objects |
amendments[].id | string or number |
amendments[].doc_id | string or null |
amendments[].invoice_number | string |
amendments[].vendor_id | string or null |
amendments[].amendment_type | string |
amendments[].line_number | number or null |
amendments[].field_name | string |
amendments[].old_value | string or null |
amendments[].new_value | string |
amendments[].effective_date | string or null |
amendments[].source | string |
amendments[].source_detail | string or null |
amendments[].created_at | string |
amendments[].updated_at | string |
amendments[].provenance | object or null |
total | number |
Issues
GET /api/v1/issues
Unified issues list with cursor pagination
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
status | query | string | no | — |
severity | query | string | no | — |
type | query | string | no | — |
type_prefix | query | string | no | Family filter validated against a server-side allowlist. |
vendor | query | string | no | — |
date_from | query | string | no | — |
date_to | query | string | no | — |
search | query | string | no | — |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
issues | array of objects |
issues[].id | string |
issues[].issue_id | string |
issues[].source | string |
issues[].type | string |
issues[].severity | string |
issues[].affected_count | number |
issues[].affected_fields | array of string |
issues[].current_value | string or null |
issues[].expected_value | string or null |
issues[].deviation_score | number or null |
issues[].description | string or null |
issues[].status | string |
issues[].actioned_by | string or null |
issues[].actioned_at | string or null |
issues[].resolution_notes | string or null |
issues[].created_at | string or null |
issues[].doc_id | string or null |
issues[].file_name | string or null |
issues[].document_number | string or null |
issues[].total_amount | number or null |
issues[].vendor_name | string or null |
issues[].vendor_id | string or null |
counts | object |
counts.active | number |
counts.dismissed | number |
counts.resolved | number |
counts.total | number |
Items
GET /api/v1/items
List items with cursor pagination
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
search | query | string | no | — |
category | query | string | no | — |
sourcing | query | string | no | — |
filter | query | string | no | Opaque base64url-encoded FilterSpec (Notion filter-builder), compiled server-side against the trusted ITEM_FILTER_REGISTRY whitelist. |
sort | query | string | no | — |
order | query | string | no | — |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
items | array of objects |
items[].item_id | string |
items[].description | string or null |
items[].category | string or null |
items[].subcategory | string or null |
items[].sku | string or null |
items[].mpn | string or null |
items[].uom | string or null |
items[].currency_code | string or null |
items[].line_item_count | number or string or null |
items[].document_count | number or string or null |
items[].vendor_count | number or string or null |
items[].total_qty | number or string or null |
items[].avg_price | number or string or null |
items[].min_price | number or string or null |
items[].max_price | number or string or null |
items[].total_spend_lifetime | number or string or null |
items[].total_spend_ttm | number or string or null |
items[].total_spend_30d | number or string or null |
items[].total_spend_90d | number or string or null |
items[].total_spend_365d | number or string or null |
items[].total_spend | number or string or null |
items[].spend_rank_in_company | number or string or null |
items[].price_variance_pct | number or string or null |
items[].sourcing_strategy | string or null |
items[].first_purchased | string or null |
items[].last_purchased | string or null |
items[].last_unit_price | number or string or null |
items[].price_trend_pct | number or string or null |
items[].avg_lead_time_days | number or string or null |
items[].avg_lead_time_days_30d | number or string or null |
items[].avg_lead_time_days_365d | number or string or null |
items[].lead_time_p90 | number or string or null |
items[].lead_time_observation_count | number or string or null |
items[].on_time_pct | number or string or null |
items[].on_time_pct_30d | number or string or null |
items[].on_time_pct_90d | number or string or null |
items[].on_time_pct_365d | number or string or null |
items[].delivery_count | number or string or null |
items[].delivery_count_30d | number or string or null |
items[].delivery_count_90d | number or string or null |
items[].delivery_count_365d | number or string or null |
items[].has_active_contract | boolean or null |
items[].active_contract_count | number or string or null |
items[].criticality_class | string or null |
items[].criticality_reasoning | string or null |
items[].supply_risk_score | number or string or null |
items[].supply_risk_reasoning | string or null |
items[].seasonality_pattern | string or null |
items[].seasonality_notes | string or null |
items[].last_enriched_at | string or null |
items[].intelligence_age_days | number or string or null |
items[].has_active_intelligence | boolean or null |
stats | object or null |
currency_code | string or null |
view | object or null |
GET /api/v1/items/{item_id}/intelligence
Get item intelligence
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
item_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
intelligence | object or null |
generated_at | string or null |
GET /api/v1/items/{item_id}/linked-documents
Get item linked documents
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
item_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
item_id | string |
linked_documents | array of objects |
linked_documents[].doc_id | string |
linked_documents[].link_type | string or null |
linked_documents[].match_method | string or null |
linked_documents[].confidence | number or string or null |
linked_documents[].linked_at | string or null |
linked_documents[].file_name | string or null |
linked_documents[].doc_type | string or null |
linked_documents[].processing_status | string or null |
linked_documents[].uploaded_at | string or null |
linked_documents[].generic_type | string or null |
linked_documents[].extracted_fields | object or null |
linked_documents[].tables | array of string |
documents | array of objects |
documents[].doc_id | string |
documents[].link_type | string or null |
documents[].match_method | string or null |
documents[].confidence | number or string or null |
documents[].linked_at | string or null |
documents[].file_name | string or null |
documents[].doc_type | string or null |
documents[].processing_status | string or null |
documents[].uploaded_at | string or null |
documents[].generic_type | string or null |
documents[].extracted_fields | object or null |
documents[].tables | array of string |
total | number |
GET /api/v1/items/{item_id}/price-history
Get item price history
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
item_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
item_id | string |
history | array of objects |
history[].date | string or null |
history[].avg_price | number or string or null |
history[].min_price | number or string or null |
history[].max_price | number or string or null |
history[].transaction_count | number or string or null |
history[].total_spend | number or string or null |
GET /api/v1/items/{item_id}/transactions
Get item transactions
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
item_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
transactions | array of objects |
transactions[].line_item_id | string or null |
transactions[].doc_id | string or null |
transactions[].document_number | string or null |
transactions[].doc_type | string or null |
transactions[].date | string or null |
transactions[].vendor_name | string or null |
transactions[].vendor_id | string or null |
transactions[].quantity | number or string or null |
transactions[].unit_price | number or string or null |
transactions[].line_total | number or string or null |
transactions[].uom | string or null |
transactions[].currency_code | string or null |
transactions[].po_number | string or null |
transactions[].invoice_number | string or null |
po_invoice_rollup | array of objects |
po_invoice_rollup[].po_number | string |
po_invoice_rollup[].invoice_count | number |
GET /api/v1/items/{item_id}/vendors
Get item vendors
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
item_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
item_id | string |
description | string or null |
category | string or null |
category_metric_backing | object or null |
sku | string or null |
mpn | string or null |
aliases | array of string |
weight_per_unit_lbs | number or string or null |
weight_unit | string or null |
length_in | number or string or null |
width_in | number or string or null |
height_in | number or string or null |
freight_class | number or string or null |
packaging_form | string or null |
vendor_count | number or string or null |
priced_vendor_count | number or string or null |
total_spend | number or string or null |
avg_price | number or string or null |
last_bought | object or null |
price_sample_count | number or string or null |
vendors | array of objects |
vendors[].vendor_id | string or null |
vendors[].vendor_name | string or null |
vendors[].document_count | number or string or null |
vendors[].line_item_count | number or string or null |
vendors[].total_quantity | number or string or null |
vendors[].avg_price | number or string or null |
vendors[].last_cost | number or string or null |
vendors[].min_price | number or string or null |
vendors[].max_price | number or string or null |
vendors[].total_spend | number or string or null |
vendors[].on_time_pct | number or string or null |
vendors[].avg_lead_time_days | number or string or null |
vendors[].delivery_count | number or string or null |
vendors[].first_purchased | string or null |
vendors[].last_purchased | string or null |
vendors[].price_sample_count | number or string or null |
vendors[].last_price_update | string or null |
vendors[].last_price_doc_id | string or null |
vendors[].price_vs_portfolio_pct | number or string or null |
vendors[].contract_price | number or string or null |
vendors[].contract_drift | object or null |
vendors[].lt_avg_days | number or string or null |
vendors[].lt_ewma_days | number or string or null |
vendors[].lt_trend_pct | number or string or null |
vendors[].lt_last_3 | array of number or null |
vendors[].lt_observation_count | number or string or null |
vendors[].lt_last_observed | string or null |
total_spend_lifetime | number or string or null |
total_spend_ttm | number or string or null |
spend_rank_in_company | number or string or null |
sourcing_strategy | string or null |
item_on_time_pct | number or string or null |
item_delivery_count | number or string or null |
item_avg_lead_time_days | number or string or null |
item_lead_time_p90 | number or string or null |
item_lead_time_observation_count | number or string or null |
item_last_unit_price | number or string or null |
item_price_trend_pct | number or string or null |
has_active_contract | boolean or null |
active_contract_count | number or string or null |
intelligence | object or null |
GET /api/v1/items/facets
Get items facets
data payload:
| Field | Type |
|---|---|
facets | object |
GET /api/v1/items/stats
Get items stats
data payload:
| Field | Type |
|---|---|
total_items | number |
sole_source_count | number |
dual_source_count | number |
multi_source_count | number |
active_contract_count | number |
high_variance_count | number |
Lineage
GET /api/v1/lineage/aggregation
Get lineage aggregation
data payload:
| Field | Type |
|---|---|
aggregate | object |
aggregate.table | string |
aggregate.row_id | string |
aggregate.column | string |
aggregate.value | number or null |
agg_function | string |
contributor_count | number |
contributors | array of objects |
contributors[].table | string |
contributors[].row_id | string |
contributors[].value | number or null |
contributors[].doc_type | string or null |
contributors[].doc_number | string or null |
contributors[].doc_date | string or null |
contributors[].doc_id | string |
contributors[].has_lineage | boolean |
POST /api/v1/lineage/cells
Create lineage cells
data payload:
| Field | Type |
|---|---|
results | array of objects |
results[].cell | object |
results[].chain | array of objects |
results[].found | boolean |
results[].all_fact_ids | array of string |
GET /api/v1/lineage/fact/{id}
Get lineage fact
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
fact_id | string |
chain | array of objects |
chain[].table | string |
chain[].row_id | string |
chain[].evidence_quote | string or null |
chain[].source_doc_id | string or null |
chain[].page_start | number or null |
chain[].page_end | number or null |
chain[].char_start | number or null |
chain[].char_end | number or null |
chain[].parser_version | string or null |
chain[].extraction_run_id | string or null |
chain[].llm_call_id | string or null |
chain[].fact_kind | string or null |
chain[].confidence | number or null |
chain[].verification_status | string or null |
chain[].source_segment_id | string or null |
chain[].source_segment_type | string or null |
chain[].schema_version | string or null |
chain[].prompt_version | string or null |
chain[].model | string or null |
chain[].schema_id | string or null |
chain[].canonical_text_sha256 | string or null |
chain[].source_channel | string or null |
chain[].received_at | string or null |
chain[].filename | string or null |
chain[].document_type | string or null |
chain[].source_kind | string or null |
chain[].section_tag | string or null |
chain[].from_type | string or null |
chain[].from_id | string or null |
chain[].to_type | string or null |
chain[].to_id | string or null |
chain[].link_type | string or null |
chain[].match_method | string or null |
chain[].action | string or null |
chain[].reason | string or null |
chain[].user_id | string or null |
chain[].created_at | string or null |
GET /api/v1/lineage/finding/{id}
Get lineage finding
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
finding_id | string |
finding_type | string |
category | string or null |
title | string or null |
summary | string or null |
claim | object or null |
verification_status | string or null |
verified_amount | number or string or null |
severity | string or null |
status | string or null |
resolved_at | string or null |
resolution_notes | string or null |
dismiss_reason | string or null |
dismissed_at | string or null |
resolved_by | string or null |
superseded_by_finding_id | string or null |
assigned_to | string or null |
field_name | string or null |
current_value | number or string or null |
expected_value | number or string or null |
doc_id | string or null |
vendor_id | string or null |
po_number | string or null |
invoice_number | string or null |
contract_id | string or null |
potential_savings_usd | number or string or null |
details | object or null |
related_entities | array of objects |
related_entities[].kind | string |
related_entities[].id | string |
related_entities[].label | string or null |
contributors | array of objects |
contributors[].line_no | number or string or null |
contributors[].part_number | string or null |
contributors[].field | string or null |
contributors[].observed_value | number or string or null |
contributors[].expected_value | number or string or null |
contributors[].quantity | number or string or null |
contributors[].line_overcharge | number or string or null |
contributors[].fact_id | string or null |
contributors[].evidence_quote | string or null |
contributors[].char_start | number or string or null |
contributors[].char_end | number or string or null |
contributors[].walkable | boolean |
contributors[].resolved | boolean |
evidence_walk | array of objects |
evidence_walk[].side | string |
evidence_walk[].label | string |
evidence_walk[].field | string or null |
evidence_walk[].value | string or number or boolean or null |
evidence_walk[].doc_id | string or null |
evidence_walk[].line_no | number or string or null |
evidence_walk[].fact_id | string or null |
evidence_walk[].quote | string or null |
evidence_walk[].source_kind | string or null |
evidence_walk[].source_table | string or null |
evidence_walk[].source_row_key | string or null |
evidence_walk[].ref | string or null |
evidence_walk[].walkable | boolean |
aggregate | object or null |
comparison | object or null |
payment | object or null |
triggering_facts | array of objects |
triggering_facts[].fact_id | string |
triggering_facts[].evidence_quote | string or null |
triggering_facts[].doc_id | string or null |
triggering_facts[].page_start | number or string or null |
triggering_facts[].page_end | number or string or null |
triggering_facts[].char_start | number or string or null |
triggering_facts[].char_end | number or string or null |
triggering_facts[].parser_version | string or null |
source_docs | array of objects |
source_docs[].doc_id | string |
source_docs[].doc_title | string or null |
source_docs[].filename | string or null |
source_docs[].document_number | string or null |
source_docs[].source_kind | string or null |
source_docs[].primary | boolean |
timeline | array of objects |
timeline[].kind | string |
timeline[].date | string |
timeline[].contract_id | string or null |
timeline[].contract_number | string or null |
timeline[].expiration_date | string or null |
timeline[].po_number | string or null |
timeline[].doc_id | string or null |
timeline[].doc_type | string or null |
timeline[].primary | boolean |
timeline[].label | string or null |
timeline[].communication_id | string or null |
timeline[].subject | string or null |
timeline[].specifics | object or null |
reference | object or null |
recovery | object or null |
source_fact_id | string or null |
source_comm_id | string or null |
GET /api/v1/lineage/promise/{po_number}
Get lineage promise
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
po_number | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
po_number | string |
active | object or null |
history | array of objects |
history[].value | string |
history[].source | string or null |
history[].effective_at | string or null |
history[].evidence_quote | string or null |
history[].sender | string or null |
history[].channel | string or null |
history[].received_at | string or null |
history[].open_ref | object or null |
history[].superseded | boolean |
po_requested_date | string or null |
GET /api/v1/lineage/vendor-credential/{vendor_id}/{label}
Get lineage vendor credential
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
label | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
vendor_id | string |
label | string |
category | string |
source | string |
triggering_facts | array of any |
source_docs | array of objects |
source_docs[].doc_id | string |
source_docs[].title | string or null |
source_docs[].doc_type | string or null |
source_docs[].source_kind | string or null |
source_docs[].received_at | string or null |
evidence_url | string or null |
first_seen_at | string or null |
last_seen_at | string or null |
Measures
GET /api/v1/measures/{id}
Get measure
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
title | string |
unit | string or null |
grain | string |
as_of | string or null |
value | number or null |
rows | array of objects |
benchmark | object or null |
Negotiations
GET /api/v1/negotiations/{id}
Get negotiation
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
vendor_id | string |
subject | string |
status | string |
current_offer | any or null |
target_terms | any or null |
initiated_at | string or null |
closed_at | string or null |
closed_reason | string or null |
last_activity_at | string or null |
created_at | string or null |
vendor_name | string or null |
event_count | number or null |
thread_count | number |
last_event_actor | string or null |
contract_id | string or null |
item_id | string or null |
updated_at | string or null |
subjects | array of objects |
subjects[].id | string |
subjects[].term_scope | string |
subjects[].subject_key | string |
subjects[].status | string |
subjects[].current_offer | object or null |
subjects[].target_terms | object or null |
subjects[].item_id | string or null |
subjects[].part_number | string or null |
subjects[].normalized_part_number | string or null |
subjects[].item_description | string or null |
subjects[].last_event_at | string |
events | array of objects |
events[].id | string |
events[].event_type | string |
events[].actor | string |
events[].event_data | any or null |
events[].event_at | string |
events[].created_at | string |
events[].thread_canonical_id | string or null |
events[].transition_reason | string or null |
events[].low_confidence | boolean |
events[].match_tier | string or null |
events[].content_hash | string or null |
events[].source | object |
negotiated_savings | object or null |
terms_unacknowledged | object or null |
GET /api/v1/negotiations/{id}/brief-v2
Get negotiation brief v2
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
negotiation_id | string |
vendor_id | string |
vendor_name | string |
accusation_audit | object |
accusation_audit.claims | array of objects |
accusation_audit.findings | array of objects |
talking_points | array of objects |
talking_points[].topic | string |
talking_points[].fact | string |
talking_points[].dollar_impact | number or null |
talking_points[].detail | any or null |
talking_points_raw | any or null |
counter_proposals | array of objects |
counter_proposals[].item_id | string or null |
counter_proposals[].part_number | string or null |
counter_proposals[].current_unit_price | number or null |
counter_proposals[].counter_unit_price | number or null |
counter_proposals[].justification | string |
counter_proposals[].source_urls | array of any |
counter_proposals[].alt_vendor_count | number |
anchoring | object |
anchoring.anchor_price | number or null |
anchoring.anchor_basis | string |
anchoring.citation | string |
anchoring.historical_low | number or null |
anchoring.best_alternative | number or null |
anchoring.observation_count | number |
synthesis | object or null |
generated_at | string |
GET /api/v1/negotiations/stats
Get negotiations stats
data payload:
| Field | Type |
|---|---|
total | number |
active | number |
agreed | number |
stalled | number |
Notifications
GET /api/v1/notifications/preferences
Get notifications preferences
data payload:
| Field | Type |
|---|---|
preferences | array of objects |
preferences[].type | string |
preferences[].category | string |
preferences[].description | string |
preferences[].forceDelivery | boolean |
preferences[].channels | object |
GET /api/v1/notifications/types
Get notifications types
data payload:
| Field | Type |
|---|---|
categories | array of objects |
categories[].name | string |
categories[].types | array of objects |
Open items
GET /api/v1/ops/open-items
Get open items
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
items | array of objects |
items[].po_number | string |
items[].line_no | number or string or null |
items[].part_number | string or null |
items[].vendor_part_number | string or null |
items[].description | string or null |
items[].vendor_name | string or null |
items[].vendor_id | string or null |
items[].qty_ordered | string or number or null |
items[].qty_received | string or number or null |
items[].qty_shipped | string or number or null |
items[].expected_date | string or null |
items[].expected_basis | string or null |
items[].delivery_standing | string or null |
items[].days_late | number or string or null |
items[].status | string or null |
items[].days_variance | number or string or null |
items[].uom | string or null |
items[].unit_price | string or number or null |
items[].tracking_number | string or null |
items[].carrier_name | string or null |
items[].ship_date | string or null |
stats | object |
stats.total | number |
stats.overdue | number |
stats.unconfirmed | number |
stats.awaiting_receipt | number |
stats.due_soon | number |
stats.at_risk | number |
stats.on_track | number |
stats.delivered | number |
stats.over_shipped | number |
stats.max_overdue_days | number |
Procurement
POST /api/v1/procurement/intake
Create procurement intake
data payload:
| Field | Type |
|---|---|
requisition | object |
finding_id | string |
suggested_vendors | array of objects |
suggested_vendors[].vendor_id | string |
suggested_vendors[].vendor_name | string |
suggested_vendors[].total_spend | number or null |
suggested_contracts | array of objects |
suggested_contracts[].contract_id | string |
suggested_contracts[].contract_number | string or null |
suggested_contracts[].vendor_id | string |
suggested_contracts[].contract_type | string or null |
suggested_contracts[].effective_date | string or null |
suggested_contracts[].expiration_date | string or null |
suggested_contracts[].status | string or null |
Procurement intel
GET /api/v1/procurement-intel/{finding_id}
Get procurement intel
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
finding_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
finding_id | string |
agent_mode | string or null |
finding_type | string or null |
title | string or null |
summary | string or null |
findings | array of string or object or null or null |
recommendations | array of string or object or null or null |
entity_refs | any or null |
confidence_score | string or number or null |
estimated_savings_usd | string or number or null |
priority | number or string or null |
sensor_sources | any or null |
status | string or null |
run_id | string or null |
created_at | string or null |
supporting_data | any or null |
expires_at | string or null |
reviewed_at | string or null |
reviewed_by | string or null |
GET /api/v1/procurement-intel/runs
List recent procurement-intel agent runs
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | no | Page size (default 25, max 100). |
agent_mode | query | string | no | Filter to one agent mode. |
data payload:
| Field | Type |
|---|---|
runs | array of objects |
runs[].run_id | string |
runs[].agent_mode | string or null |
runs[].status | string or null |
runs[].sensors_run | number or string or null |
runs[].findings_generated | number or string or null |
runs[].llm_cost_usd | string or number or null |
runs[].error_message | string or null |
runs[].started_at | string or null |
runs[].completed_at | string or null |
GET /api/v1/procurement-intel/summary
Get procurement intel summary
data payload:
| Field | Type |
|---|---|
by_status | array of objects |
by_status[].status | string |
by_status[].count | number or string or null |
by_status[].total_savings | string or number or null |
by_mode | array of objects |
by_mode[].agent_mode | string |
by_mode[].count | number or string or null |
by_mode[].new_count | number or string or null |
by_mode[].total_savings | string or number or null |
last_runs | array of objects |
last_runs[].run_id | string |
last_runs[].agent_mode | string or null |
last_runs[].status | string or null |
last_runs[].sensors_run | number or string or null |
last_runs[].findings_generated | number or string or null |
last_runs[].llm_cost_usd | string or number or null |
last_runs[].error_message | string or null |
last_runs[].started_at | string or null |
last_runs[].completed_at | string or null |
Purchase orders
GET /api/v1/orders/{po_number}/landed-cost
Get order landed cost
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
po_number | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
po_number | string |
line_items | array of any |
total_landed | string or number or null |
freight_total | string or number or null |
duty_total | string or number or null |
other_total | string or number or null |
GET /api/v1/po
List purchase orders
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
purchase_orders | array of objects |
purchase_orders[].po_number | string |
purchase_orders[].vendor_name | string or null |
purchase_orders[].vendor_id | string or null |
purchase_orders[].vendor_website | string or null |
purchase_orders[].po_date | string or null |
purchase_orders[].total_amount | string or number or null |
purchase_orders[].fulfillment_state | string or null |
purchase_orders[].is_open | boolean |
purchase_orders[].fulfillment_status | string or null |
purchase_orders[].lifecycle_status | string or null |
purchase_orders[].match_status | string or null |
purchase_orders[].delivery_standing | string or null |
purchase_orders[].next_expected_date | string or null |
purchase_orders[].delivery_expected_basis | string or null |
purchase_orders[].next_expected_source | string or null |
purchase_orders[].delivery_vendor_promise_date | string or null |
purchase_orders[].delivery_vendor_promise_source | string or null |
purchase_orders[].delivery_requested_date | string or null |
purchase_orders[].delivery_days_late | number or string or null |
purchase_orders[].delivery_days_past_requested | number or string or null |
purchase_orders[].receipt_pct | string or number or null |
purchase_orders[].open_findings_count | number or string or null |
purchase_orders[].anomaly_count | number or string or null |
purchase_orders[].critical_anomaly_count | number or string or null |
purchase_orders[].acknowledged_count | number or string or null |
purchase_orders[].comm_count | number or string or null |
purchase_orders[].unread_count | number or string or null |
purchase_orders[].intelligence_severity | string or null |
purchase_orders[].delivery_site_name | string or null |
stats | object |
stats.total | number |
stats.open | number or null |
stats.past_due | number or null |
stats.due_this_week | number or null |
stats.unconfirmed | number or null |
stats.in_transit | number or null |
stats.closed | number or null |
view | object or null |
GET /api/v1/po/{po_number}
Get purchase order
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
po_number | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
po_number | string |
po_date | string or null |
order_date | string or null |
order_placed_date | string or null |
confirmation_received_date | string or null |
confirmation | object or null |
status | string or null |
fulfillment_state | string or null |
is_open | boolean |
state_source | string or null |
state_confidence | string or null |
fulfillment_status | string or null |
match_status | string or null |
match_receipt_backed | boolean or null |
open_obligation_count | number or null |
legs | array of objects |
legs[].leg | string |
legs[].scope_kind | string |
legs[].scope_ref | string or null |
legs[].scope_key | string or null |
legs[].basis | string |
legs[].source | object |
legs[].asserted_by | object |
legs[].stated_at | string or null |
legs[].observed_at | string or null |
legs[].recorded_at | string or null |
legs[].stated | object |
legs[].entries | array of objects |
legs[].entry_count | integer |
obligations | array of objects |
obligations[].obligation_id | string |
obligations[].type | string or null |
obligations[].status | string or null |
obligations[].owed_by | string or null |
obligations[].owed_to | string or null |
obligations[].subject | string or null |
obligations[].opened_by_fact_id | string or null |
obligations[].opened_at | string or null |
obligations[].sla_due_at | string or null |
expected_date | string or null |
delivery_date | string or null |
ship_to_address | string or null |
ship_to_name | string or null |
payment_terms | string or null |
currency_code | string or null |
freight_terms | string or null |
source | string or null |
buyer_name | string or null |
blanket_type | string or null |
blanket_total | string or number or null |
blanket_released | string or number or null |
status_summary | object or null |
vendor | object or null |
amounts | object or null |
delivery | object or null |
delivery_site | object or null |
shipping | object or null |
line_items | array of objects |
line_items[].line_no | number or string or null |
line_items[].part_number | string or null |
line_items[].vendor_part_number | string or null |
line_items[].manufacturer_part_number | string or null |
line_items[].description | string or null |
line_items[].quantity | string or number or null |
line_items[].qty_ordered | string or number or null |
line_items[].unit_price | string or number or null |
line_items[].unit | string or null |
line_items[].uom | string or null |
line_items[].amount | string or number or null |
line_items[].line_total | string or number or null |
line_items[].qty_received | string or number or null |
line_items[].qty_accepted | string or number or null |
line_items[].qty_arrived | string or number or null |
line_items[].qty_rejected | string or number or null |
line_items[].qty_received_source | string or null |
line_items[].qty_shipped | string or number or null |
line_items[].qty_invoiced | string or number or null |
line_items[].qty_acked | string or number or null |
line_items[].expected_date | string or null |
line_items[].actual_delivery_date | string or null |
line_items[].on_time | boolean or null |
line_items[].in_full | boolean or null |
line_items[].days_variance | number or string or null |
line_items[].delivery_status | string or null |
line_items[].match_status | string or null |
line_items[].invoice_price | string or number or null |
line_items[].contract_price | string or number or null |
line_items[].ack_unit_price | string or number or null |
line_items[].invoice_unit_price | string or number or null |
line_items[].po_requested_date | string or null |
line_items[].ack_promised_date | string or null |
line_items[].email_promised_date | string or null |
line_items[].promise_vs_request | object or null |
line_items[].ack_promised_ship_date | string or null |
line_items[].email_promised_ship_date | string or null |
line_items[].actual_ship_date | string or null |
line_items[].ship_on_time | boolean or null |
line_items[].ship_variance_days | number or string or null |
line_items[].on_time_basis | string or null |
line_items[].actual_date | string or null |
line_items[].actual_date_source | string or null |
line_items[].receipt_date_confidence | number or string or null |
line_items[].carrier_delivered_date | string or null |
line_items[].carrier_delivered_source | string or null |
line_items[].promise_source | string or null |
line_items[].receipt_doc_id | string or null |
line_items[].bol_doc_id | string or null |
line_items[].pod_doc_id | string or null |
line_items[].variance_days | number or string or null |
line_items[].part_number_mismatch | boolean or null |
line_items[].delivery | object or null |
line_items[].schedule | array of objects |
line_items[].receipts | array of objects |
line_items[].shipments | array of objects |
line_items[].comm_updates | array of objects |
line_items[].ship_tracking | string or null |
line_items[].carrier_name | string or null |
linked_documents | array of objects |
linked_documents[].doc_id | string |
linked_documents[].doc_type | string or null |
linked_documents[].document_number | string or null |
linked_documents[].document_date | string or null |
linked_documents[].total_amount | string or number or null |
linked_documents[].file_name | string or null |
linked_documents[].processing_status | string or null |
linked_documents[].requested_delivery_date | string or null |
linked_documents[].email_ingest_id | string or null |
linked_documents[].email_context | object or null |
shipment_tracking | array of objects |
shipment_tracking[].tracking_number | string or null |
shipment_tracking[].carrier_name | string or null |
shipment_tracking[].status | string or null |
shipment_tracking[].ship_date | string or null |
shipment_tracking[].eta | string or null |
shipment_tracking[].delivered_date | string or null |
intelligence | object or null |
exceptions | array of any |
delivery_health | any or null |
contract_nte | array of any |
narrative_comms | array of objects |
narrative_comms[].id | string |
narrative_comms[].types | array of string |
narrative_comms[].date | string or null |
narrative_comms[].subject | string or null |
narrative_comms[].summary | string or null |
narrative_comms[].sender | string or null |
narrative_comms[].sender_email | string or null |
narrative_comms[].urgency | string or null |
narrative_comms[].provenance | array of objects |
narrative_comms[].filed | boolean |
narrative_comms[].email_class | string or null |
narrative_comms[].filed_reason | string or null |
narrative_comms[].filed_summary | string or null |
narrative_comms[].email_ingest_id | string or null |
promise_move | object or null |
price_moves | array of objects |
price_moves[].part_number | string or null |
price_moves[].scope | string or null |
price_moves[].prior_price | string or null |
price_moves[].price | string |
price_moves[].currency | string or null |
price_moves[].change_pct | string or null |
price_moves[].effective_date | string or null |
price_moves[].fact_id | string or null |
price_moves[].comm_id | string or null |
GET /api/v1/po/{po_number}/as-of
Get purchase order as-of state
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
po_number | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
po_number | string |
as_of | string |
no_data_as_of | boolean |
first_seen | string or null |
header | object or null |
lines | array of objects |
lines[].line_no | number or string or null |
lines[].description | string or null |
lines[].uom | string or null |
lines[].part_number | string or null |
lines[].quantity | number or string or null |
lines[].unit_price | number or string or null |
lines[].line_total | number or string or null |
lines[].changed_fields | array of string |
lines[].inconsistent | boolean |
changed_count | number or string or null |
changes | array of objects |
changes[].field | string |
changes[].label | string or null |
changes[].line_no | number or string or null |
changes[].as_of_value | string or number or null |
changes[].current_value | string or number or null |
changes[].changed_by | object or null |
legs | array of objects |
legs[].leg | string |
legs[].scope_kind | string |
legs[].scope_ref | string or null |
legs[].scope_key | string or null |
legs[].basis | string |
legs[].source | object |
legs[].asserted_by | object |
legs[].stated_at | string or null |
legs[].observed_at | string or null |
legs[].recorded_at | string or null |
legs[].stated | object |
legs[].entries | array of objects |
legs[].entry_count | integer |
GET /api/v1/po/{po_number}/blanket-releases
Get purchase order blanket releases
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
po_number | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
releases | array of any |
summary | any or null |
GET /api/v1/po/{po_number}/change-orders
Get purchase order change orders
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
po_number | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
change_orders | array of objects |
change_orders[].change_order_id | string |
change_orders[].change_type | string or null |
change_orders[].description | string or null |
change_orders[].created_at | string or null |
change_orders[].created_by | string or null |
change_orders[].vendor_acked | boolean or null |
change_orders[].line_items | array of any |
change_orders[].decision_status | string or null |
GET /api/v1/po/delivery-sites/list
Get purchase order delivery sites list
data payload:
| Field | Type |
|---|---|
sites | array of objects |
sites[].site_id | string |
sites[].site_name | string or null |
sites[].address | string or null |
sites[].city | string or null |
sites[].state | string or null |
sites[].zip_code | string or null |
GET /api/v1/po/matching-settings
Get purchase order matching settings
data payload:
| Field | Type |
|---|---|
price_tolerance_pct | number |
tax_tolerance_pct | number |
qty_tolerance_pct | number |
desc_match_threshold | number |
GET /api/v1/po/otif-settings
Get purchase order OTIF settings
data payload:
| Field | Type |
|---|---|
late_tolerance_days | number |
early_tolerance_days | number |
penalize_early_delivery | boolean |
use_business_days | boolean |
GET /api/v1/po/stats
Get purchase order stats
data payload:
| Field | Type |
|---|---|
total | number |
open | number or null |
past_due | number or null |
due_this_week | number or null |
unconfirmed | number or null |
in_transit | number or null |
closed | number or null |
Rate cards
GET /api/v1/rate-cards
List rate cards
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
rate_cards | array of objects |
rate_cards[].rate_card_id | string |
rate_cards[].company_id | string or null |
rate_cards[].carrier_vendor_id | string or null |
rate_cards[].carrier_name | string |
rate_cards[].mode | string |
rate_cards[].effective_date | string or null |
rate_cards[].expiration_date | string or null |
rate_cards[].status | string |
rate_cards[].discount_pct | string or number or null |
rate_cards[].fsc_method | string or null |
rate_cards[].fsc_base_rate | string or number or null |
rate_cards[].minimum_charge | string or number or null |
rate_cards[].currency_code | string or null |
rate_cards[].base_tariff | string or null |
rate_cards[].scac_code | string or null |
rate_cards[].contract_id | string or null |
rate_cards[].contract_number | string or null |
rate_cards[].linked_contract | string or null |
rate_cards[].lane_count | number |
rate_cards[].accessorial_count | number |
rate_cards[].created_at | string or null |
rate_cards[].updated_at | string or null |
GET /api/v1/rate-cards/{id}
Get rate card
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
rate_card_id | string |
company_id | string or null |
carrier_vendor_id | string or null |
carrier_name | string |
mode | string |
effective_date | string or null |
expiration_date | string or null |
status | string |
discount_pct | string or number or null |
fsc_method | string or null |
fsc_base_rate | string or number or null |
minimum_charge | string or number or null |
currency_code | string or null |
base_tariff | string or null |
scac_code | string or null |
contract_id | string or null |
contract_number | string or null |
linked_contract | string or null |
lane_count | number |
accessorial_count | number |
created_at | string or null |
updated_at | string or null |
rate_lines | array of objects |
rate_lines[].id | number or string or null |
rate_lines[].rate_card_id | string |
rate_lines[].origin_zip_low | string or null |
rate_lines[].origin_zip_high | string or null |
rate_lines[].dest_zip_low | string or null |
rate_lines[].dest_zip_high | string or null |
rate_lines[].freight_class | string or null |
rate_lines[].weight_break_min | string or number or null |
rate_lines[].weight_break_max | string or number or null |
rate_lines[].rate_per_cwt | string or number or null |
rate_lines[].flat_rate | string or number or null |
rate_lines[].rate_per_mile | string or number or null |
rate_lines[].minimum_charge | string or number or null |
rate_lines[].fak_class | string or null |
accessorial_rates | array of objects |
accessorial_rates[].id | number or string or null |
accessorial_rates[].rate_card_id | string |
accessorial_rates[].charge_code | string |
accessorial_rates[].charge_description | string or null |
accessorial_rates[].rate_type | string |
accessorial_rates[].rate_amount | string or number or null |
accessorial_rates[].minimum_charge | string or number or null |
accessorial_rates[].maximum_charge | string or number or null |
accessorial_rates[].free_time_minutes | number or string or null |
accessorial_rates[].effective_date | string or null |
accessorial_rates[].expiration_date | string or null |
GET /api/v1/rate-cards/stats
Get rate cards stats
data payload:
| Field | Type |
|---|---|
total | number |
active | number |
expired | number |
expiring_soon | number |
archived | number |
Reconciliation
GET /api/v1/reconciliation
List reconciliations
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
invoices | array of objects |
invoices[].doc_id | string |
invoices[].file_name | string or null |
invoices[].doc_type | string or null |
invoices[].vendor_id | string or null |
invoices[].vendor_name | string or null |
invoices[].vendor_resolved | boolean or null |
invoices[].vendor_name_raw | string or null |
invoices[].vendor_website | string or null |
invoices[].document_number | string or null |
invoices[].total_amount | number or string or null |
invoices[].subtotal | number or string or null |
invoices[].tax_amount | number or string or null |
invoices[].tax_rate | number or string or null |
invoices[].shipping_amount | number or string or null |
invoices[].discount_amount | number or string or null |
invoices[].discount_percent | number or string or null |
invoices[].discount_deadline | string or null |
invoices[].discount_days_left | number or string or null |
invoices[].discount_capturable_amount | number or string or null |
invoices[].discount_status | string or null |
invoices[].document_date | string or null |
invoices[].uploaded_at | string or null |
invoices[].due_date | string or null |
invoices[].due_in_days | number or string or null |
invoices[].pay_urgency | number or string or null |
invoices[].net_days | number or string or null |
invoices[].net_days_basis | string or null |
invoices[].terms_anchor_date | string or null |
invoices[].payment_terms | string or null |
invoices[].final_status | string or null |
invoices[].match | any |
invoices[].match_status | string or null |
invoices[].payability | any |
invoices[].matched_po_number | string or null |
invoices[].buyer_po_number | string or null |
invoices[].anomaly_count | number or string or null |
invoices[].critical_anomaly_count | number or string or null |
invoices[].high_anomaly_count | number or string or null |
invoices[].open_findings_count | number or string or null |
invoices[].payment_status | string or null |
invoices[].settlement_state | string or null |
invoices[].current_status | string or null |
invoices[].risk_score | number or string or null |
invoices[].sanctions_status | string or null |
invoices[].baseline_total | number or string or null |
invoices[].previously_invoiced | number or string or null |
invoices[].hold_reason | string or null |
invoices[].failed_checks | any |
invoices[].related_documents | any |
invoices[].five_way_match | any |
invoices[].credits | any |
invoices[].linked_invoice_doc_id | string or null |
invoices[].linked_invoice_number | string or null |
invoices[].credit_memo_match_method | string or null |
stats | object or null |
view | object or null |
GET /api/v1/reconciliation/{doc_id}/gl-coding
Get reconciliation GL coding
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doc_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
rows | array of objects |
rows[].line_id | number or string |
rows[].line_no | number |
rows[].description | string |
rows[].line_total | number |
rows[].gl_account_code | string or null |
rows[].gl_cost_center | string or null |
rows[].gl_confidence | number or null |
rows[].gl_coded_by | string or null |
summary | object |
summary.coded_lines | number |
summary.total_lines | number |
summary.all_coded | boolean |
payment_status | string or null |
PATCH /api/v1/reconciliation/{doc_id}/gl-coding
Update reconciliation GL coding
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doc_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
updated | number |
all_coded | boolean |
GET /api/v1/reconciliation/{doc_id}/history
Get reconciliation history
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doc_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
doc_id | string |
current_status | string |
status_changed_by | string |
status_changed_at | string |
history | array of objects |
history[].id | number |
history[].action_type | string |
history[].notes | string or null |
history[].hold_reason | string or null |
history[].created_by | string |
history[].created_at | string |
GET /api/v1/reconciliation/{doc_id}/line-items
Get reconciliation line items
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doc_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
line_items | array of objects |
line_items[].id | number or string or null |
line_items[].line_id | number or string or null |
line_items[].line_no | number or string or null |
line_items[].description | string or null |
line_items[].buyer_part_number | string or null |
line_items[].vendor_part_number | string or null |
line_items[].manufacturer_part_number | string or null |
line_items[].uom | string or null |
line_items[].po_qty | string or number or null |
line_items[].invoice_qty | string or number or null |
line_items[].received_qty | string or number or null |
line_items[].po_unit_price | string or number or null |
line_items[].invoice_unit_price | string or number or null |
line_items[].line_total | string or number or null |
line_items[].status | string or null |
line_items[].gl_account_code | string or null |
line_items[].gl_cost_center | string or null |
line_items[].gl_confidence | number or string or null |
line_items[].gl_coded_by | string or null |
line_items[].gl_coded_at | string or null |
line_items[].expected_price | string or number or null |
line_items[].expected_price_source | string or null |
line_items[].expected_price_effective_date | string or null |
line_items[].expected_price_currency | string or null |
line_items[].price_vs_expected_pct | number or string or null |
po_qty_label | string |
match_status | string or null |
match_verdict | string or null |
match_confidence | number or string or null |
payability | object or null |
five_way_match | object or null |
order_coverage | object or null |
match_reasons | array of objects or null |
procurement_chain | array of objects |
procurement_chain[].stage | string or null |
procurement_chain[].doc_type | string or null |
procurement_chain[].doc_id | string or null |
procurement_chain[].document_number | string or null |
procurement_chain[].document_date | string or null |
procurement_chain[].total_amount | number or string or null |
procurement_chain[].vendor_name | string or null |
procurement_chain[].receipt_source | string or null |
procurement_chain[].line_count | number or string or null |
chain_order_ref | object or null |
order_confirmations | object or null |
communication_hints | array of objects |
communication_hints[].id | string or null |
communication_hints[].types | array of string |
communication_hints[].date | string or null |
communication_hints[].subject | string or null |
communication_hints[].sender | string or null |
communication_hints[].price_update | any or null |
communication_hints[].quantity_update | any or null |
communication_hints[].line_item_updates | any or null |
money_documents | array of objects |
money_documents[].doc_id | string or null |
money_documents[].doc_type | string or null |
money_documents[].document_number | string or null |
money_documents[].relationship | string or null |
money_documents[].total_amount | number or string or null |
counterparty_position | object or null |
GET /api/v1/reconciliation/{doc_id}/timeline
Get reconciliation timeline
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doc_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
timeline | array of objects |
timeline[].type | string |
timeline[].action | string or null |
timeline[].user | string or null |
timeline[].ts | string |
timeline[].notes | string or null |
timeline[].hold_reason | string or null |
GET /api/v1/reconciliation/cash-flow
Get reconciliation cash flow
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
buckets | array of objects |
buckets[].bucket_type | string |
buckets[].week_start | string or null |
buckets[].week_end | string or null |
buckets[].bucket_start | string or null |
buckets[].bucket_end | string or null |
buckets[].total_due | number |
buckets[].approved_due | number |
buckets[].pending_approval_due | number |
buckets[].invoice_count | number |
monthly_buckets | array of objects |
monthly_buckets[].bucket_type | string |
monthly_buckets[].bucket_start | string or null |
monthly_buckets[].bucket_end | string or null |
monthly_buckets[].total_due | number |
monthly_buckets[].approved_due | number |
monthly_buckets[].pending_approval_due | number |
monthly_buckets[].invoice_count | number |
discount_opportunities | array of objects |
discount_opportunities[].deadline_week | string or null |
discount_opportunities[].capturable | number |
discount_opportunities[].invoice_count | number |
summary | object |
summary.overdue | number |
summary.next_7d | number |
summary.next_30d | number |
summary.next_90d | number |
summary.total_outstanding | number |
summary.pending_approval_total | number |
summary.discount_capturable | number |
summary.discount_capturable_count | number |
summary.missed_discount_12mo | number |
summary.missed_discount_count_12mo | number |
GET /api/v1/reconciliation/facets
Get reconciliation facets
data payload:
| Field | Type |
|---|---|
facets | object |
GET /api/v1/reconciliation/payment-funnel
Get reconciliation payment funnel
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
gl_coding_enabled | boolean |
stages | array of objects |
stages[].stage | string |
stages[].invoice_count | number |
stages[].stage_total | string or number or null |
stages[].avg_age_days | number |
stages[].moved_in_last_7d | number |
GET /api/v1/reconciliation/stats
Get reconciliation stats
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
reconciliation | object |
reconciliation.total | number |
reconciliation.matched | number |
reconciliation.discrepancy | number |
reconciliation.no_po | number |
reconciliation.awaiting_po | number |
reconciliation.actionable_review | number |
reconciliation.pending_approval | number |
reconciliation.blocked | number |
reconciliation.approved | number |
reconciliation.hold | number |
reconciliation.rejected | number |
reconciliation.past_due | number |
reconciliation.discount_available | number |
reconciliation.approval_rules_count | number |
reconciliation.uncoded_invoice_count | number |
reconciliation.matched_amount | string or number or null |
reconciliation.discount_available_amount | string or number or null |
anomalies | object |
anomalies.total | number |
anomalies.critical | number |
anomalies.high | number |
period_days | number |
GET /api/v1/reconciliation/vendors
Get reconciliation vendors
data payload:
| Field | Type |
|---|---|
vendors | array of objects or array of string |
Requisitions
GET /api/v1/requisitions
List requisitions
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
requisitions | array of objects |
requisitions[].id | string |
requisitions[].company_id | string or null |
requisitions[].pr_number | string |
requisitions[].requester_email | string or null |
requisitions[].requester_name | string or null |
requisitions[].title | string |
requisitions[].justification | string or null |
requisitions[].vendor_id | string or null |
requisitions[].vendor_name_freetext | string or null |
requisitions[].vendor_canonical_name | string or null |
requisitions[].delivery_site_id | string or null |
requisitions[].delivery_site_name | string or null |
requisitions[].needed_by_date | string or null |
requisitions[].total_estimated_amount | string or number or null |
requisitions[].currency_code | string or null |
requisitions[].status | string |
requisitions[].original_freetext | string or null |
requisitions[].llm_parsed | boolean |
requisitions[].submitted_at | string or null |
requisitions[].approved_by | string or null |
requisitions[].approved_at | string or null |
requisitions[].rejected_by | string or null |
requisitions[].rejected_at | string or null |
requisitions[].rejection_reason | string or null |
requisitions[].changes_requested_by | string or null |
requisitions[].changes_requested_at | string or null |
requisitions[].changes_requested_reason | string or null |
requisitions[].generated_po_doc_id | string or null |
requisitions[].generated_po_number | string or null |
requisitions[].created_at | string or null |
requisitions[].updated_at | string or null |
requisitions[].filtered_total | number or string or null |
requisitions[].line_count | number or string or null |
GET /api/v1/requisitions/{id}
Get requisition
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
company_id | string or null |
pr_number | string |
requester_email | string or null |
requester_name | string or null |
title | string |
justification | string or null |
vendor_id | string or null |
vendor_name_freetext | string or null |
vendor_canonical_name | string or null |
delivery_site_id | string or null |
delivery_site_name | string or null |
needed_by_date | string or null |
total_estimated_amount | string or number or null |
currency_code | string or null |
status | string |
original_freetext | string or null |
llm_parsed | boolean |
submitted_at | string or null |
approved_by | string or null |
approved_at | string or null |
rejected_by | string or null |
rejected_at | string or null |
rejection_reason | string or null |
changes_requested_by | string or null |
changes_requested_at | string or null |
changes_requested_reason | string or null |
generated_po_doc_id | string or null |
generated_po_number | string or null |
created_at | string or null |
updated_at | string or null |
filtered_total | number or string or null |
line_count | number or string or null |
delivery_address | string or null |
delivery_city | string or null |
delivery_state | string or null |
po_awaiting_ack | boolean or null |
po_ack_date | string or null |
lines | array of objects |
lines[].id | string |
lines[].requisition_id | string |
lines[].line_no | number |
lines[].description | string |
lines[].item_id | string or null |
lines[].item_name | string or null |
lines[].item_category | string or null |
lines[].vendor_part_number | string or null |
lines[].quantity | string or number or null |
lines[].unit | string |
lines[].estimated_unit_price | string or number or null |
lines[].estimated_line_total | string or number or null |
lines[].gl_account_code | string or null |
lines[].contract_id | string or null |
lines[].contract_unit_price | string or number or null |
lines[].volume_tiers | any or null |
lines[].volume_tier_applied | string or null |
lines[].contract_min_qty | string or number or null |
lines[].contract_max_qty | string or number or null |
GET /api/v1/requisitions/contract-pricing
Get requisitions contract pricing
data payload:
| Field | Type |
|---|---|
found | boolean |
contract_id | string or null |
unit_price | number or string or null |
tier_applied | string or null |
volume_tiers | array of objects or null |
next_tier | object or null |
min_qty | number or string or null |
max_qty | number or string or null |
min_qty_warning | string or null |
max_qty_warning | string or null |
nte_warning | string or null |
nte_utilization_pct | number or string or null |
rebate_hint | string or null |
POST /api/v1/requisitions/parse
Create requisitions parse
data payload:
| Field | Type |
|---|---|
parsed | object |
parsed.title | string or null |
parsed.vendor_id | string or null |
parsed.vendor_name | string or null |
parsed.delivery_site_id | string or null |
parsed.needed_by_date | string or null |
parsed.urgency | string or null |
parsed.items | array of objects |
parsed.justification | string or null |
parsed.confidence | number or string or null |
original_text | string or null |
intelligence | object or null |
GET /api/v1/requisitions/stats
Get requisitions stats
data payload:
| Field | Type |
|---|---|
drafts | number |
pending | number |
approved | number |
rejected | number |
changes_requested | number |
po_generated | number |
cancelled | number |
this_month | number |
approved_this_month_amount | number |
Rfqs
GET /api/v1/rfqs
List rfqs
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
data | array of objects |
data[].id | string |
data[].rfq_number | string or null |
data[].title | string or null |
data[].rfq_type | string or null |
data[].status | string or null |
data[].response_deadline | string or null |
data[].budget_target | string or number or null |
data[].currency_code | string or null |
data[].notes | string or null |
data[].delivery_site_id | string or null |
data[].created_by | string or null |
data[].issued_by | string or null |
data[].issued_at | string or null |
data[].awarded_vendor_id | string or null |
data[].awarded_by | string or null |
data[].awarded_at | string or null |
data[].awarded_pr_id | string or null |
data[].awarded_pr_number | string or null |
data[].awarded_po_number | string or null |
data[].awarded_contract_id | string or null |
data[].award_type | string or null |
data[].cancelled_by | string or null |
data[].cancelled_at | string or null |
data[].cancelled_reason | string or null |
data[].created_at | string or null |
data[].vendor_count | number |
data[].response_count | number |
data[].line_count | number |
data[].lane_count | number |
rfqs | array of objects |
rfqs[].id | string |
rfqs[].rfq_number | string or null |
rfqs[].title | string or null |
rfqs[].rfq_type | string or null |
rfqs[].status | string or null |
rfqs[].response_deadline | string or null |
rfqs[].budget_target | string or number or null |
rfqs[].currency_code | string or null |
rfqs[].notes | string or null |
rfqs[].delivery_site_id | string or null |
rfqs[].created_by | string or null |
rfqs[].issued_by | string or null |
rfqs[].issued_at | string or null |
rfqs[].awarded_vendor_id | string or null |
rfqs[].awarded_by | string or null |
rfqs[].awarded_at | string or null |
rfqs[].awarded_pr_id | string or null |
rfqs[].awarded_pr_number | string or null |
rfqs[].awarded_po_number | string or null |
rfqs[].awarded_contract_id | string or null |
rfqs[].award_type | string or null |
rfqs[].cancelled_by | string or null |
rfqs[].cancelled_at | string or null |
rfqs[].cancelled_reason | string or null |
rfqs[].created_at | string or null |
rfqs[].vendor_count | number |
rfqs[].response_count | number |
rfqs[].line_count | number |
rfqs[].lane_count | number |
next_cursor | string or null |
has_more | boolean |
total | number or string or null |
GET /api/v1/rfqs/{id}
Get rfq
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
rfq_number | string or null |
title | string or null |
rfq_type | string or null |
status | string or null |
response_deadline | string or null |
budget_target | string or number or null |
currency_code | string or null |
notes | string or null |
delivery_site_id | string or null |
created_by | string or null |
issued_by | string or null |
issued_at | string or null |
awarded_vendor_id | string or null |
awarded_by | string or null |
awarded_at | string or null |
awarded_pr_id | string or null |
awarded_pr_number | string or null |
awarded_po_number | string or null |
awarded_contract_id | string or null |
award_type | string or null |
cancelled_by | string or null |
cancelled_at | string or null |
cancelled_reason | string or null |
created_at | string or null |
vendor_count | number |
response_count | number |
line_count | number |
lane_count | number |
lines | array of objects |
lines[].id | number or string |
lines[].rfq_id | string or null |
lines[].item_id | string or null |
lines[].description | string or null |
lines[].quantity | string or number or null |
lines[].unit | string or null |
lines[].target_unit_price | string or number or null |
lines[].estimated_unit_price | string or number or null |
lines[].delivery_site_id | string or null |
lines[].awarded_vendor_id | string or null |
lines[].awarded_vendor_name | string or null |
lines[].awarded_quantity | string or number or null |
lines[].award_amount | string or number or null |
lanes | array of objects |
lanes[].id | number or string |
lanes[].rfq_id | string or null |
lanes[].origin_city | string or null |
lanes[].origin_state | string or null |
lanes[].origin_zip | string or null |
lanes[].dest_city | string or null |
lanes[].dest_state | string or null |
lanes[].dest_zip | string or null |
lanes[].mode | string or null |
lanes[].freight_class | string or number or null |
lanes[].weight_min | string or number or null |
lanes[].weight_max | string or number or null |
lanes[].annual_volume_estimate | string or number or null |
lanes[].equipment_type | string or null |
lanes[].hazmat | boolean |
lanes[].accessorials_required | string or null |
lanes[].target_rate_per_cwt | string or number or null |
lanes[].target_flat_rate | string or number or null |
lanes[].notes | string or null |
vendors | array of objects |
vendors[].rfq_id | string or null |
vendors[].vendor_id | string |
vendors[].vendor_name | string or null |
vendors[].contact_email | string or null |
vendors[].contact_name | string or null |
vendors[].status | string or null |
vendors[].quote_doc_id | string or null |
vendors[].invited_at | string or null |
vendors[].responded_at | string or null |
vendors[].workflow_id | string or null |
vendors[].scac | string or null |
award_summary | object or null |
POST /api/v1/rfqs/{id}/add-vendors
Create rfq add vendors
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
rfq_number | string or null |
added_count | number |
skipped_count | number |
already_invited | array of string |
skipped_no_email | array of objects |
skipped_no_email[].vendor_id | string |
skipped_no_email[].reason | string |
vendors | array of objects |
vendors[].vendor_id | string |
vendors[].vendor_name | string |
vendors[].email | string |
vendors[].status | string |
vendors[].workflow_id | string or null |
POST /api/v1/rfqs/{id}/award
Create rfq award
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
rfq_number | string |
award_type | string |
awarded_vendor_id | string or null |
awarded_vendor | string or null |
pr_number | string or null |
pr_id | string or null |
po_number | string or null |
auto_approved | boolean or null |
total | number or string or null |
savings | number or string or null |
rate_card_id | string or null |
contract_id | string or null |
pos_created | array of objects |
pos_created[].vendor_id | string |
pos_created[].vendor_name | string or null |
pos_created[].pr_number | string |
pos_created[].po_number | string or null |
pos_created[].awarded_amount | number |
pos_created[].awarded_line_count | integer |
pos_created[].auto_approved | boolean |
partial_award | boolean |
POST /api/v1/rfqs/{id}/cancel-award
Create rfq cancel award
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
status | string |
prs_cancelled | array of objects |
prs_cancelled[].pr_id | string |
prs_cancelled[].pr_number | string |
prs_cancelled[].po_doc_id | string or null |
rate_cards_inactivated | array of objects |
rate_cards_inactivated[].rate_card_id | string |
contracts_terminated | array of objects |
contracts_terminated[].contract_id | string |
POST /api/v1/rfqs/{id}/close-responses
Create rfq close responses
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
status | string |
vendors_closed | number |
GET /api/v1/rfqs/{id}/compare
Get rfq compare
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
rfq | object |
rfq.id | string |
rfq.rfq_number | string or null |
rfq.title | string or null |
rfq.status | string or null |
rfq.rfq_type | string or null |
target_total | string or number or null |
line_items | array of objects |
line_items[].id | number or string |
line_items[].rfq_id | string or null |
line_items[].item_id | string or null |
line_items[].description | string or null |
line_items[].quantity | string or number or null |
line_items[].unit | string or null |
line_items[].target_unit_price | string or number or null |
line_items[].estimated_unit_price | string or number or null |
line_items[].delivery_site_id | string or null |
line_items[].awarded_vendor_id | string or null |
line_items[].awarded_vendor_name | string or null |
line_items[].awarded_quantity | string or number or null |
line_items[].award_amount | string or number or null |
lanes | array of objects |
lanes[].id | number or string |
lanes[].rfq_id | string or null |
lanes[].origin_city | string or null |
lanes[].origin_state | string or null |
lanes[].origin_zip | string or null |
lanes[].dest_city | string or null |
lanes[].dest_state | string or null |
lanes[].dest_zip | string or null |
lanes[].mode | string or null |
lanes[].freight_class | string or number or null |
lanes[].weight_min | string or number or null |
lanes[].weight_max | string or number or null |
lanes[].annual_volume_estimate | string or number or null |
lanes[].equipment_type | string or null |
lanes[].hazmat | boolean |
lanes[].accessorials_required | string or null |
lanes[].target_rate_per_cwt | string or number or null |
lanes[].target_flat_rate | string or number or null |
lanes[].notes | string or null |
bids | array of objects |
bids[].vendor_id | string |
bids[].vendor_name | string or null |
bids[].status | string or null |
bids[].quote_doc_id | string or null |
bids[].invited_at | string or null |
bids[].responded_at | string or null |
bids[].bid_total | string or number or null |
bids[].vs_target | string or number or null |
bids[].score | string or number or null |
bids[].score_breakdown | object |
bids[].raw_metrics | object |
bids[].recommended | boolean |
bids[].on_contract_line_count | integer |
bids[].effective_baseline_total | number or string or null |
bids[].quote_lines | array of objects |
bids[].awarded_line_count | integer |
bids[].awarded_amount | number or string or null |
lane_rates | array of objects |
lane_rates[].lane | string or null |
lane_rates[].origin | string or null |
lane_rates[].destination | string or null |
lane_rates[].mode | string or null |
weights_used | object |
POST /api/v1/rfqs/{id}/issue
Create rfq issue
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
rfq_number | string |
vendors_contacted | number |
skipped_vendors | array of objects |
skipped_vendors[].vendor_id | string |
skipped_vendors[].reason | string |
results | array of objects |
results[].vendor_id | string |
results[].vendor_name | string |
results[].email | string |
results[].status | string |
results[].workflow_id | string or null |
GET /api/v1/rfqs/{id}/issue-preview
Get rfq issue preview
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
rfq_id | string |
rfq_number | string or null |
rfq_status | string or null |
rfq_type | string or null |
sendable_count | number |
skipped_count | number |
sample | object or null |
recipients | array of objects |
recipients[].vendor_id | string |
recipients[].vendor_name | string or null |
recipients[].contact_email | string or null |
recipients[].contact_name | string or null |
recipients[].send_status | string |
GET /api/v1/rfqs/stats
Get rfqs stats
data payload:
| Field | Type |
|---|---|
draft | number |
issued | number |
evaluating | number |
awarded | number |
total | number |
overdue_quote_count | number |
sla_days | number |
GET /api/v1/rfqs/vendor-recommendations
Get rfqs vendor recommendations
data payload:
| Field | Type |
|---|---|
recommendations | array of objects |
recommendations[].vendor_id | string |
recommendations[].vendor_name | string or null |
recommendations[].items_supplied | number |
recommendations[].otif_strict_pct | string or number or null |
recommendations[].otif_on_time | string or number or null |
recommendations[].otif_gradable | string or number or null |
recommendations[].has_active_contract | boolean |
recommendations[].composite_score | string or number or null |
recommendations[].risk_score | string or number or null |
recommendations[].score | number |
Schemas
GET /api/v1/schemas
List schemas
data payload:
| Field | Type |
|---|---|
schemas | array of objects |
schemas[].id | string |
schemas[].doc_type | string |
schemas[].company_id | string or null |
schemas[].schema_version | number |
schemas[].field_definitions | array of objects |
schemas[].special_instructions | string or null |
schemas[].is_active | boolean |
schemas[].is_global | boolean |
schemas[].field_count | number |
schemas[].extraction_prompt_template | string or null |
schemas[].created_at | string or null |
schemas[].updated_at | string or null |
GET /api/v1/schemas/{doc_type}
Get schema
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doc_type | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
doc_type | string |
company_id | string or null |
schema_version | number |
field_definitions | array of objects |
special_instructions | string or null |
is_active | boolean |
is_global | boolean |
field_count | number |
extraction_prompt_template | string or null |
created_at | string or null |
updated_at | string or null |
GET /api/v1/schemas/types
Get schemas types
data payload:
| Field | Type |
|---|---|
doc_types | array of objects |
doc_types[].doc_type | string |
doc_types[].has_company_override | boolean |
doc_types[].has_global_default | boolean |
Settings
GET /api/v1/settings/rate-providers
Get settings rate providers
data payload:
| Field | Type |
|---|---|
providers | array of objects |
providers[].provider | string |
providers[].status | string |
providers[].connected_at | string or null |
providers[].last_check_at | string or null |
Shipments
GET /api/v1/shipments
List shipments with cursor pagination
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
status | query | string | no | — |
linked_status | query | string | no | Universal Connect filter — all |
search | query | string | no | — |
filter | query | string | no | Opaque base64url-encoded FilterSpec (Notion filter-builder), compiled server-side against the trusted SHIPMENT_FILTER_REGISTRY whitelist. |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
shipments | array of objects |
shipments[].id | string |
shipments[].unified_id | string |
shipments[].source | string or null |
shipments[].source_doc_type | string or null |
shipments[].source_doc_types | any |
shipments[].doc_count | number or string or null |
shipments[].linked_status | string or null |
shipments[].company_id | string or null |
shipments[].carrier_name | string or null |
shipments[].carrier_vendor_id | string or null |
shipments[].tracking_number | string or null |
shipments[].pro_number | string or null |
shipments[].bol_number | string or null |
shipments[].pod_number | string or null |
shipments[].booking_reference | string or null |
shipments[].pod_doc_id | string or null |
shipments[].po_number | string or null |
shipments[].linked_po_doc_id | string or null |
shipments[].shipment_number | string or null |
shipments[].status | string or null |
shipments[].origin_city | string or null |
shipments[].origin_state | string or null |
shipments[].dest_city | string or null |
shipments[].dest_state | string or null |
shipments[].mode | string or null |
shipments[].origin_zip | string or null |
shipments[].dest_zip | string or null |
shipments[].pickup_date | string or null |
shipments[].response_deadline | string or null |
shipments[].created_at | string or null |
shipments[].updated_at | string or null |
stats | object or null |
GET /api/v1/shipments/{id}
Get shipment
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
shipment_number | string or null |
title | string or null |
status | string or null |
mode | string or null |
origin_address | string or null |
origin_city | string or null |
origin_state | string or null |
origin_zip | string or null |
dest_address | string or null |
dest_city | string or null |
dest_state | string or null |
dest_zip | string or null |
total_weight | string or number or null |
total_pieces | number or string or null |
total_pallets | number or string or null |
freight_class | string or null |
budget_target | string or number or null |
currency_code | string or null |
special_requirements | string or null |
pickup_date | string or null |
delivery_date_required | string or null |
response_deadline | string or null |
awarded_carrier_id | string or null |
awarded_rate | string or number or null |
awarded_transit_days | number or string or null |
booking_reference | string or null |
tracking_number | string or null |
pro_number | string or null |
pickup_number | string or null |
pickup_window_start | string or null |
pickup_window_end | string or null |
actual_delivery_date | string or null |
receiver_name | string or null |
condition_notes | string or null |
pod_doc_id | string or null |
signature_status | string or null |
signature_confidence | number or string or null |
signature_signal | string or null |
is_multileg | boolean or null |
equipment_type | string or null |
shipper_name | string or null |
shipper_contact | string or null |
shipper_phone | string or null |
consignee_name | string or null |
consignee_contact | string or null |
consignee_phone | string or null |
temperature_min | number or string or null |
temperature_max | number or string or null |
accessorials | array of string |
notes | string or null |
carrier_name | string or null |
created_at | string or null |
issued_at | string or null |
booked_at | string or null |
cancelled_at | string or null |
created_by | string or null |
issued_by | string or null |
booked_by | string or null |
cancelled_by | string or null |
cancelled_reason | string or null |
items | array of objects |
items[].id | string or null |
items[].line_no | number or string or null |
items[].description | string or null |
items[].quantity | string or number or null |
items[].weight | string or number or null |
items[].length_in | string or number or null |
items[].width_in | string or number or null |
items[].height_in | string or number or null |
items[].freight_class | string or null |
items[].is_hazmat | boolean or null |
items[].po_number | string or null |
carriers | array of objects |
carriers[].id | string or null |
carriers[].carrier_id | string or null |
carriers[].carrier_name | string or null |
carriers[].contact_email | string or null |
carriers[].contact_name | string or null |
carriers[].status | string or null |
carriers[].quoted_rate | string or number or null |
carriers[].transit_days | number or string or null |
carriers[].service_level | string or null |
carriers[].quote_source | string or null |
carriers[].quote_expires_at | string or null |
carriers[].quote_doc_id | string or null |
carriers[].invited_at | string or null |
carriers[].responded_at | string or null |
legs | array of objects |
legs[].id | string or null |
legs[].leg_order | number or string or null |
legs[].mode | string or null |
legs[].origin_city | string or null |
legs[].origin_state | string or null |
legs[].dest_city | string or null |
legs[].dest_state | string or null |
legs[].carrier_display | string or null |
legs[].carrier_name | string or null |
legs[].status | string or null |
legs[].actual_cost | string or number or null |
legs[].quoted_rate | string or number or null |
tracking | object or null |
pickup_appointment | object or null |
GET /api/v1/shipments/{id}/amendments
Get shipment amendments
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data array — each row:
| Field | Type |
|---|---|
id | string |
shipment_id | string or null |
po_number | string or null |
amendment_type | string or null |
original_delivery_date | string or null |
new_delivery_date | string or null |
original_quantity | string or number or null |
new_quantity | string or number or null |
original_carrier | string or null |
new_carrier | string or null |
amendment_data | any or null |
source | string or null |
reason | string or null |
created_at | string or null |
child_shipments | array of objects or null |
GET /api/v1/shipments/{id}/freight-invoices
Get shipment freight invoices
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
invoices | array of objects |
invoices[].doc_id | string |
invoices[].document_number | string or null |
invoices[].document_date | string or null |
invoices[].total_amount | string or number or null |
invoices[].vendor_name | string or null |
invoices[].currency_code | string or null |
invoices[].pro_number | string or null |
invoices[].processing_status | string or null |
invoices[].freight_anomalies | array of objects or null |
shipment | object |
shipment.pro_number | string or null |
shipment.tracking_number | string or null |
shipment.awarded_rate | string or number or null |
shipment.shipment_number | string or null |
GET /api/v1/shipments/{id}/intelligence
Get shipment intelligence
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
intelligence | object or null |
generated_at | string or null |
GET /api/v1/shipments/{id}/linked-documents
Get shipment linked documents
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
shipment_id | string or null |
documents | array of objects |
documents[].doc_id | string |
documents[].link_type | string or null |
documents[].match_method | string or null |
documents[].confidence | string or number or null |
documents[].linked_at | string or null |
documents[].file_name | string or null |
documents[].doc_type | string or null |
documents[].processing_status | string or null |
documents[].uploaded_at | string or null |
documents[].generic_type | string or null |
documents[].tables | array of string |
linked_documents | array of objects |
linked_documents[].doc_id | string |
linked_documents[].link_type | string or null |
linked_documents[].match_method | string or null |
linked_documents[].confidence | string or number or null |
linked_documents[].linked_at | string or null |
linked_documents[].file_name | string or null |
linked_documents[].doc_type | string or null |
linked_documents[].processing_status | string or null |
linked_documents[].uploaded_at | string or null |
linked_documents[].generic_type | string or null |
linked_documents[].tables | array of string |
total | number or string or null |
GET /api/v1/shipments/{id}/tracking
Get shipment tracking
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
tracking | object or null |
GET /api/v1/shipments/facets
Get shipments facets
data payload:
| Field | Type |
|---|---|
facets | object |
GET /api/v1/shipments/stats
Get shipments stats
data payload:
| Field | Type |
|---|---|
draft | number |
issued | number |
evaluating | number |
booked | number |
in_transit | number |
delivered | number |
cancelled | number |
linked | number |
unlinked | number |
platform | number |
total | number |
Team
GET /api/v1/team/invitations
Get team invitations
data payload:
| Field | Type |
|---|---|
invitations | array of objects |
invitations[].id | string |
invitations[].invited_email | string |
invitations[].role | string |
invitations[].status | string |
invitations[].created_at | string or null |
invitations[].expires_at | string or null |
invitations[].invited_by_email | string or null |
GET /api/v1/team/members
Get team members
data payload:
| Field | Type |
|---|---|
members | array of objects |
members[].user_id | string |
members[].email | string |
members[].role | string |
members[].email_verified | boolean or null |
members[].created_at | string or null |
Test metrics
GET /api/v1/test-metrics/dashboard
Get test metrics dashboard
data payload:
| Field | Type |
|---|---|
overview | object |
overview.total_runs | number |
overview.avg_pass_rate | string or number or null |
overview.min_pass_rate | string or number or null |
overview.max_pass_rate | string or number or null |
overview.total_scenarios_run | number |
overview.total_passed | number |
overview.total_failed | number |
overview.avg_latency | string or number or null |
overview.total_cost | string or number or null |
trend | array of objects |
trend[].run_date | string |
trend[].avg_pass_rate | string or number or null |
trend[].avg_check_pass_rate | string or number or null |
trend[].run_count | number |
trend[].total_scenarios | number |
scenario_heatmap | array of objects |
scenario_heatmap[].scenario_name | string |
scenario_heatmap[].total_runs | number |
scenario_heatmap[].passed_count | number |
scenario_heatmap[].failed_count | number |
scenario_heatmap[].pass_rate | string or number or null |
scenario_heatmap[].avg_latency_ms | string or number or null |
category_breakdown | array of objects |
category_breakdown[].category | string |
category_breakdown[].total_runs | number |
category_breakdown[].passed_count | number |
category_breakdown[].failed_count | number |
category_breakdown[].pass_rate | string or number or null |
comparison | object |
comparison.current_pass_rate | string or number or null |
comparison.previous_pass_rate | string or number or null |
comparison.pass_rate_change | string or number or null |
comparison.current_total_scenarios | number |
comparison.previous_total_scenarios | number |
comparison.current_avg_latency | string or number or null |
comparison.previous_avg_latency | string or number or null |
scan_mode_breakdown | array of objects |
scan_mode_breakdown[].scan_mode | string or null |
scan_mode_breakdown[].has_emails | boolean |
scan_mode_breakdown[].total_runs | number |
scan_mode_breakdown[].passed | number |
scan_mode_breakdown[].total | number |
scan_mode_breakdown[].pass_rate | string or number or null |
scan_mode_breakdown[].avg_cost | string or number or null |
top_failures | array of objects |
top_failures[].description | string |
top_failures[].category | string |
top_failures[].failure_count | number |
days | number |
GET /api/v1/test-metrics/regressions
Get test metrics regressions
data payload:
| Field | Type |
|---|---|
regressions | array of objects |
regressions[].scenario_name | string |
regressions[].current_rate | string or number or null |
regressions[].previous_avg_rate | string or number or null |
regressions[].delta | string or number or null |
regressions[].current_run_date | string |
regressions[].run_count | number |
POST /api/v1/test-metrics/runs
Record a test run (returns 201 with the canonical success envelope)
Returns: Run recorded — canonical success envelope
GET /api/v1/test-metrics/scenario-failures
Get test metrics scenario failures
data payload:
| Field | Type |
|---|---|
scenario_name | string |
latest | object or null |
Vendors
GET /api/v1/vendors
List vendors with cursor pagination
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
search | query | string | no | — |
risk_level | query | string | no | — |
vendor_type | query | string | no | — |
category | query | string | no | — |
enriched | query | string | no | — |
industry | query | string | no | — |
has_anomalies | query | string | no | — |
naics | query | string | no | — |
activity_days | query | string | no | — |
spend_min | query | number | no | — |
spend_max | query | number | no | — |
open_po_min | query | number | no | — |
open_po_max | query | number | no | — |
employee_count_min | query | number | no | — |
employee_count_max | query | number | no | — |
filter | query | string | no | Opaque base64url-encoded FilterSpec (Notion filter-builder), compiled server-side against the trusted VENDOR_FILTER_REGISTRY whitelist. |
since | query | string | no | — |
sort | query | string | no | — |
order | query | string | no | — |
offset | query | integer | no | — |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
vendors | array of objects |
vendors[].vendor_id | string |
vendors[].canonical_name | string |
vendors[].display_name | string or null |
vendors[].display_name_is_ambiguous | boolean or null |
vendors[].disambiguator_label | string or null |
vendors[].aliases | array of string or null |
vendors[].tax_id | string or null |
vendors[].address | any or null |
vendors[].headquarters | string or null |
vendors[].industry | string or null |
vendors[].naics_code | string or null |
vendors[].naics_codes | array of string or null |
vendors[].employee_count | number or string or null |
vendors[].revenue_usd | string or number or null |
vendors[].founded_year | number or string or null |
vendors[].website | string or null |
vendors[].risk_score | string or number or null |
vendors[].risk_factors | any or null |
vendors[].confidence | string or number or null |
vendors[].last_enriched_at | string or null |
vendors[].additional_data | any or null |
vendors[].certifications | any or null |
vendors[].vendor_type | string or null |
vendors[].carrier_otif_strict_pct | string or number or null or null |
vendors[].avg_strict_variance_days | string or number or null or null |
vendors[].carrier_total_deliveries | number or string or null |
vendors[].vendor_categories | any or null |
vendors[].geographic_coverage | string or null |
vendors[].payment_terms_standard | string or null |
vendors[].key_brands | array of string or null |
vendors[].competitors | array of string or null |
vendors[].document_count | number or string or null |
vendors[].email_count | number or string or null |
vendors[].invoice_count | number or string or null |
vendors[].po_count | number or string or null |
vendors[].other_doc_count | number or string or null |
vendors[].order_count | number or string or null |
vendors[].contract_count | number or string or null |
vendors[].item_count | number or string or null |
vendors[].total_spend | string or number or null |
vendors[].spend_12mo | string or number or null |
vendors[].invoiced_90d | string or number or null |
vendors[].open_po_value | string or number or null |
vendors[].open_po_unreceived_value | string or number or null |
vendors[].first_doc_date | string or null |
vendors[].last_doc_date | string or null |
vendors[].last_activity_at | string or null |
vendors[].open_anomaly_count | number or string or null |
vendors[].critical_anomaly_count | number or string or null |
vendors[].open_findings_count | number or string or null |
vendors[].otif_pct | string or number or null |
vendors[].otif_strict_pct | string or number or null |
vendors[].otif_on_time | string or number or null |
vendors[].otif_gradable | string or number or null |
vendors[].ship_on_time_pct | string or number or null |
vendors[].total_spend_30d | string or number or null |
vendors[].total_spend_90d | string or number or null |
vendors[].total_spend_365d | string or number or null |
vendors[].on_time_pct_30d | string or number or null |
vendors[].on_time_pct_90d | string or number or null |
vendors[].on_time_pct_365d | string or number or null |
vendors[].deliveries_30d | number or string or null |
vendors[].deliveries_90d | number or string or null |
vendors[].deliveries_365d | number or string or null |
vendors[].avg_response_lag_30d | string or number or null or null |
vendors[].confirmed_count_30d | number or string or null |
vendors[].canonical_name_llm | string or null |
vendors[].canonical_legal_name | string or null |
vendors[].canonical_website | string or null |
vendors[].canonical_industry | string or null |
vendors[].canonical_industry_sector | string or null |
vendors[].canonical_parent | string or null |
vendors[].canonical_is_subsidiary | boolean or null |
vendors[].canonical_looks_hallucinated | boolean or null |
vendors[].canonical_naics | string or null |
vendors[].canonical_vendor_type | string or null |
vendors[].canonical_public_private | string or null |
vendors[].canonical_headquarters | string or null |
vendors[].vendor_segment | string or null |
vendors[].vendor_segment_reasoning | string or null |
vendors[].vendor_segment_classified_at | string or null |
vendors[].predicted_payment_terms_drift_days | string or number or null or null |
vendors[].predicted_response_lag_days | string or number or null or null |
vendors[].top_finding_severity | string or null |
vendors[].top_finding_type | string or null |
vendors[].top_finding_category | string or null |
vendors[].finding_count | integer or null |
stats | object or null |
view | object or null |
GET /api/v1/vendors/{vendor_id}
Get vendor
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
vendor_id | string |
canonical_name | string |
display_name | string or null |
display_name_is_ambiguous | boolean or null |
disambiguator_label | string or null |
aliases | array of string or null |
tax_id | string or null |
address | any or null |
headquarters | string or null |
industry | string or null |
naics_code | string or null |
naics_codes | array of string or null |
employee_count | number or string or null |
revenue_usd | string or number or null |
founded_year | number or string or null |
website | string or null |
risk_score | string or number or null |
risk_factors | any or null |
confidence | string or number or null |
last_enriched_at | string or null |
additional_data | any or null |
certifications | any or null |
vendor_type | string or null |
carrier_otif_strict_pct | string or number or null or null |
avg_strict_variance_days | string or number or null or null |
carrier_total_deliveries | number or string or null |
vendor_categories | any or null |
geographic_coverage | string or null |
payment_terms_standard | string or null |
key_brands | array of string or null |
competitors | array of string or null |
document_count | number or string or null |
email_count | number or string or null |
invoice_count | number or string or null |
po_count | number or string or null |
other_doc_count | number or string or null |
order_count | number or string or null |
contract_count | number or string or null |
item_count | number or string or null |
total_spend | string or number or null |
spend_12mo | string or number or null |
invoiced_90d | string or number or null |
open_po_value | string or number or null |
open_po_unreceived_value | string or number or null |
first_doc_date | string or null |
last_doc_date | string or null |
last_activity_at | string or null |
open_anomaly_count | number or string or null |
critical_anomaly_count | number or string or null |
open_findings_count | number or string or null |
otif_pct | string or number or null |
otif_strict_pct | string or number or null |
otif_on_time | string or number or null |
otif_gradable | string or number or null |
ship_on_time_pct | string or number or null |
total_spend_30d | string or number or null |
total_spend_90d | string or number or null |
total_spend_365d | string or number or null |
on_time_pct_30d | string or number or null |
on_time_pct_90d | string or number or null |
on_time_pct_365d | string or number or null |
deliveries_30d | number or string or null |
deliveries_90d | number or string or null |
deliveries_365d | number or string or null |
avg_response_lag_30d | string or number or null or null |
confirmed_count_30d | number or string or null |
canonical_name_llm | string or null |
canonical_legal_name | string or null |
canonical_website | string or null |
canonical_industry | string or null |
canonical_industry_sector | string or null |
canonical_parent | string or null |
canonical_is_subsidiary | boolean or null |
canonical_looks_hallucinated | boolean or null |
canonical_naics | string or null |
canonical_vendor_type | string or null |
canonical_public_private | string or null |
canonical_headquarters | string or null |
vendor_segment | string or null |
vendor_segment_reasoning | string or null |
vendor_segment_classified_at | string or null |
predicted_payment_terms_drift_days | string or number or null or null |
predicted_response_lag_days | string or number or null or null |
top_finding_severity | string or null |
top_finding_type | string or null |
top_finding_category | string or null |
finding_count | integer or null |
default_gl_account_code | string or null |
contact_email | string or null |
contact_name | string or null |
contact_phone | string or null |
created_at | string or null |
updated_at | string or null |
sources | any or null |
years_in_business | number or string or null |
public_private | string or null |
business_classifications | any or null |
financial_events | any or null |
ceo_name | string or null |
recent_news | any or null |
alerts | any or null |
sanctions_status | string or null |
sanctions_checked_lists | array of string or null |
adverse_media | any or null |
risk_categories | any or null |
certification_gaps | any or null |
positive_signals | any or null |
field_backing | object or null |
credentials | array of objects |
credentials[].label | string |
credentials[].category | string |
credentials[].source | string |
credentials[].evidence_refs | array of string |
credentials[].evidence_url | string or null |
credentials[].first_seen_at | string |
credentials[].last_seen_at | string |
shipment_docs | array of objects |
shipment_docs[].label | string |
shipment_docs[].category | string |
shipment_docs[].source | string |
shipment_docs[].evidence_refs | array of string |
shipment_docs[].evidence_url | string or null |
shipment_docs[].first_seen_at | string |
shipment_docs[].last_seen_at | string |
parent_vendor_id | string or null |
parent_vendor_name | string or null |
parent_link_method | string or null |
parent_link_confidence | string or number or null |
subsidiaries | array of objects or null |
composite_score | number or string or null |
observed_payment_terms | string or null |
observed_payment_terms_pct | number or string or null |
observed_currency | string or null |
observed_incoterms | string or null |
default_lead_time_days | number or string or null |
vendor_lt_avg_days | string or number or null |
vendor_lt_ewma_days | string or number or null |
vendor_lt_trend_pct | string or number or null |
vendor_lt_observation_count | number or string or null |
vendor_lt_last_observed | string or null |
vendor_lt_last_3 | array of number or null |
observed_lead_p10 | string or number or null |
observed_lead_median | string or number or null |
observed_lead_p90 | string or number or null |
observed_lead_count | number or string or null |
contacts | array of objects |
contacts[].id | string or number |
contacts[].vendor_id | string |
contacts[].contact_name | string or null |
contacts[].email | string or null |
contacts[].phone | string or null |
contacts[].title | string or null |
contacts[].department | string or null |
contacts[].fax | string or null |
contacts[].role | string or null |
contacts[].source | string or null |
contacts[].is_primary | boolean or null |
contacts[].email_count | number or null |
contacts[].source_counts | object or null |
contacts[].created_at | string or null |
contacts[].updated_at | string or null |
intelligence | object or null |
response_lag | object or null |
recent_lead_time_changes | array of objects |
recent_lead_time_changes[].po_doc_id | string or null |
recent_lead_time_changes[].po_number | string or null |
recent_lead_time_changes[].original_days | number or string or null |
recent_lead_time_changes[].new_days | number or string or null |
recent_lead_time_changes[].reason | string or null |
recent_lead_time_changes[].stated_at | string or null |
GET /api/v1/vendors/{vendor_id}/account-summary
Get vendor account summary
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
vendor_id | string |
buckets | object |
buckets.invoice | object |
buckets.credit_memo | object |
buckets.debit_note | object |
net_payable_usd | number |
unlinked_credit_count | number |
active_items_12mo | number |
spend_12mo_usd | number |
orders_count_12mo | number |
price_drift_90d_pct | number or null |
monthly_invoiced_12mo | array of number |
monthly_orders_12mo | array of number |
monthly_otif_12mo | array of number or null |
otif_pct_12mo | number or null |
otif_on_time_12mo | integer or null |
otif_measured_12mo | integer or null |
otif_received_12mo | integer or null |
otif_withheld_12mo | string or null |
otif_floor | integer or null |
otif_window_months | integer |
monthly_otif_latest_promise_12mo | array of number or null |
otif_latest_promise_pct_12mo | number or null |
related_party_held_usd | number or null |
otif_basis_12mo | object or null |
GET /api/v1/vendors/{vendor_id}/addresses
Get vendor addresses
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
addresses | object |
total_unique | integer |
contacts | object |
GET /api/v1/vendors/{vendor_id}/contacts
Get vendor contacts
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
contacts | array of objects |
contacts[].id | string or number |
contacts[].vendor_id | string |
contacts[].contact_name | string or null |
contacts[].email | string or null |
contacts[].phone | string or null |
contacts[].title | string or null |
contacts[].department | string or null |
contacts[].fax | string or null |
contacts[].role | string or null |
contacts[].source | string or null |
contacts[].is_primary | boolean or null |
contacts[].email_count | number or null |
contacts[].source_counts | object or null |
contacts[].created_at | string or null |
contacts[].updated_at | string or null |
GET /api/v1/vendors/{vendor_id}/document-data
Get vendor document data
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
documents | array of objects |
documents[].doc_id | string |
documents[].document_type | string or null |
documents[].document_number | string or null |
documents[].document_date | string or null |
documents[].total_amount | string or number or null |
documents[].currency | string or null |
documents[].status | string or null |
contact | object |
contact.emails | array of string |
contact.phones | array of string |
contact.websites | array of string |
payment | object |
payment.bank_names | array of string |
payment.bank_accounts | array of string |
payment.swift_codes | array of string |
payment.branch_names | array of string |
tax_ids | object |
tax_ids.gstin | array of string |
doc_count | number or string or null |
GET /api/v1/vendors/{vendor_id}/emails
Get vendor emails
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
emails | array of objects |
emails[].email_ingest_id | string |
emails[].subject | string or null |
emails[].sender_name | string or null |
emails[].sender_email | string or null |
emails[].sender_domain | string or null |
emails[].received_at | string or null |
emails[].body_preview | string or null |
emails[].communication_types | array of string or null |
emails[].urgency | string or null |
emails[].action_required | boolean or null |
emails[].comm_status | string or null |
GET /api/v1/vendors/{vendor_id}/exposure
Get vendor exposure
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
vendor_id | string |
total_spend_365d | number |
exposed_spend | number |
exposed_share_pct | number or null |
duty_owed_usd | number or null |
avoidable_301_usd | number or null |
exposed_by_country | array of objects |
exposed_by_country[].country | string |
exposed_by_country[].spend | number |
exposed_by_country[].share_pct | number or null |
exposed_by_country[].regime | string or null |
exposed_by_country[].duty_owed_usd | number or null |
exposed_by_country[].avoidable_301_usd | number or null |
GET /api/v1/vendors/{vendor_id}/intelligence
Get vendor intelligence
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
vendor_id | string |
severity | string or null |
summary | string or null |
body_markdown | string or null |
actions | array of string |
history | array of objects |
history[].date | string |
history[].event | string |
signals_used | array of string |
generated_at | string or null |
data_hash | string or null |
age_seconds | number or null |
is_stale | boolean or null |
cached | boolean or null |
GET /api/v1/vendors/{vendor_id}/invoices
Get vendor invoices
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
documents | array of objects |
documents[].doc_id | string |
documents[].document_type | string or null |
documents[].invoice_number | string or null |
documents[].document_number | string or null |
documents[].document_date | string or null |
documents[].due_date | string or null |
documents[].status | string or null |
documents[].total_amount | string or number or null |
documents[].base_total | string or number or null |
documents[].currency | string or null |
documents[].po_number | string or null |
documents[].buyer_po_number | string or null |
documents[].match_status | string or null |
documents[].has_anomaly | boolean or null |
invoices | array of objects |
invoices[].doc_id | string |
invoices[].document_type | string or null |
invoices[].invoice_number | string or null |
invoices[].document_number | string or null |
invoices[].document_date | string or null |
invoices[].due_date | string or null |
invoices[].status | string or null |
invoices[].total_amount | string or number or null |
invoices[].base_total | string or number or null |
invoices[].currency | string or null |
invoices[].po_number | string or null |
invoices[].buyer_po_number | string or null |
invoices[].match_status | string or null |
invoices[].has_anomaly | boolean or null |
GET /api/v1/vendors/{vendor_id}/items
Get vendor items
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
items | array of objects |
items[].item_id | string or null |
items[].vendor_part_number | string or null |
items[].description | string or null |
items[].buyer_part_number | string or null |
items[].sku | string or null |
items[].manufacturer_part_number | string or null |
items[].category | string or null |
items[].country_of_origin | string or null |
items[].hts_code | string or null |
items[].invoice_count | number or string or null |
items[].order_count | number or string or null |
items[].ordered_unit_price | string or number or null |
items[].last_ordered_at | string or null |
items[].avg_price | string or number or null |
items[].min_price | string or number or null |
items[].max_price | string or number or null |
items[].total_spend | string or number or null |
items[].first_purchased | string or null |
items[].last_purchased | string or null |
items[].price_trend_pct | string or number or null |
items[].on_time_pct | string or number or null |
items[].avg_lead_time_days | string or number or null |
items[].delivery_count | number or string or null |
items[].lead_p10 | string or number or null |
items[].lead_median | string or number or null |
items[].lead_p90 | string or number or null |
items[].lt_avg_days | string or number or null |
items[].lt_ewma_days | string or number or null |
items[].lt_trend_pct | string or number or null |
items[].lt_last_3 | array of number or null |
items[].lt_observation_count | number or string or null |
items[].sourcing_strategy | string or null |
items[].vendor_count | number or string or null |
view | object or null |
GET /api/v1/vendors/{vendor_id}/linked-documents
Get vendor linked documents
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
documents | array of objects |
documents[].doc_id | string |
documents[].document_type | string or null |
documents[].document_number | string or null |
documents[].document_date | string or null |
documents[].link_type | string or null |
documents[].total_amount | string or number or null |
count | number |
GET /api/v1/vendors/{vendor_id}/qualification
Get vendor qualification
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
id | string |
vendor_id | string |
created_by | string |
qualification_status | string |
qualification_score | number or null |
w9_collected | boolean |
w9_collected_at | string or null |
banking_verified | boolean |
banking_verified_by | string or null |
ofac_checked_at | string or null |
coi_collected | boolean |
coi_expires_at | string or null |
qualified_at | string or null |
expires_at | string or null |
notes | string or null |
GET /api/v1/vendors/{vendor_id}/recent-lead-time-changes
Get vendor recent lead time changes
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
data payload:
| Field | Type |
|---|---|
changes | array of objects |
changes[].po_doc_id | string or null |
changes[].po_number | string or null |
changes[].original_days | number or string or null |
changes[].new_days | number or string or null |
changes[].reason | string or null |
changes[].stated_at | string or null |
GET /api/v1/vendors/{vendor_id}/threads
Get vendor threads
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
threads | array of objects |
threads[].thread_id | string |
threads[].thread_kind | string |
threads[].primary_po_number | string or null |
threads[].status | string |
threads[].outcome | string or null |
threads[].summary | string or null |
threads[].has_anomaly | boolean |
threads[].delivered_in_full | boolean or null |
threads[].relationships | array of objects |
threads[].events | array of objects |
GET /api/v1/vendors/{vendor_id}/threads/unlinked
Get vendor threads unlinked
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
unlinked | array of objects |
unlinked[].key | string |
unlinked[].kind | string |
unlinked[].id | string |
unlinked[].title | string |
unlinked[].subtitle | string or null |
unlinked[].ts | string |
unlinked[].doc_type | string or null |
GET /api/v1/vendors/{vendor_id}/uploads
Get vendor uploads
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_id | path | string | yes | — |
cursor | query | string | no | Opaque base64url cursor; omit for first page. |
limit | query | integer | no | Page size (default 25, max 100). |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
uploads | array of objects |
uploads[].key | string |
uploads[].source | string |
uploads[].doc_source | string or null |
uploads[].ts | string or null |
uploads[].doc_type | string or null |
uploads[].doc_id | string or null |
uploads[].email_id | string or null |
uploads[].title | string |
uploads[].subtitle | string or null |
uploads[].po_number | string or null |
uploads[].amount | string or number or null |
uploads[].urgency | string or null |
uploads[].action_required | boolean or null |
GET /api/v1/vendors/collusion-clusters
Get vendors collusion clusters
data payload:
| Field | Type |
|---|---|
clusters | array of objects |
clusters[].id | string or number |
clusters[].vendor_ids | array of string |
clusters[].vendor_names | array of string |
clusters[].match_types | array of string |
clusters[].confidence | number or null |
clusters[].llm_summary | string or null |
clusters[].total_spend_90d | string or number or null |
clusters[].status | string or null |
clusters[].reviewed_by | string or null |
clusters[].reviewed_at | string or null |
clusters[].created_at | string or null |
clusters[].updated_at | string or null |
clusters[].evidence | any or null |
total | number |
GET /api/v1/vendors/enrichment-credits
Get vendors enrichment credits
data payload:
| Field | Type |
|---|---|
enrichments_used | number |
free_tier | number |
unlimited | boolean |
plan | string or null |
GET /api/v1/vendors/facets
Get vendors facets
data payload:
| Field | Type |
|---|---|
facets | object |
GET /api/v1/vendors/stats
Get vendors stats
data payload:
| Field | Type |
|---|---|
total_vendors | number |
enriched_count | number |
high_risk_count | number |
total_spend | string or number or null |
active_vendors | number |
total_vendors_in_db | number |
total_enriched_in_db | number |
total_high_risk_in_db | number |
avg_spend_per_vendor | number |
new_vendors | number |
risk_distribution | object |
risk_distribution.unknown | number |
risk_distribution.low | number |
risk_distribution.medium | number |
risk_distribution.high | number |
risk_distribution.critical | number |
top_vendors | array of objects |
top_vendors[].vendor_id | string |
top_vendors[].canonical_name | string |
top_vendors[].total_spend | string or number or null |
top_vendors[].document_count | number or null |
spend_concentration | object |
spend_concentration.top5_spend | number |
spend_concentration.total_spend | number |
spend_concentration.concentration_pct | number |
spend_concentration.top5_vendors | array of objects |
open_claims_count | number |
open_claims_amount | number |
period | string |
is_period_filtered | boolean |
trends | object |
trends.vendor_change | number |
trends.spend_change | number |
trends.spend_change_percent | number |
trends.prev_active_vendors | number |
trends.prev_total_spend | number |
GET /api/v1/vendors/summary
Get vendors summary
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
vendor_count | number |
total_spend | string or number or null |
invoiced_90d | string or number or null |
open_po_value | string or number or null |
with_anomalies | number |
Webhooks
Get notified instantly when things happen in your account.
Setup
- Go to Settings
- Enable webhooks
- Enter your URL:
https://your-server.com/webhooks/kynthar - Save, then send a test event (
webhook.test) to verify your endpoint
Events
| Event | When it fires |
|---|---|
document.received | A document arrived (upload, email, or API) and entered processing. |
document.processed | A document finished processing; extracted fields are available. |
document.failed | A document could not be processed. |
anomaly.detected | An anomaly was detected on a document (price, quantity, terms, or risk). |
order.status_changed | A purchase order's fulfillment status changed. |
shipment.received | A shipment was received against a purchase order. |
invoice.matched | An invoice was matched to its purchase order. |
webhook.test | Sent when you trigger a test delivery to verify your endpoint and signature handling. Not subscribable. |
What you receive
Every POST body is a versioned envelope (api_version: 2026-05-13):
{
"api_version": "2026-05-13",
"event_id": "evt_01HX...",
"event_type": "document.received",
"timestamp": "2026-05-13T15:30:00.000Z",
"data": { ... }
}
Your response
Return any 2xx within 10 seconds. Do heavy work async.
app.post('/webhooks/kynthar', (req, res) => {
res.status(200).send('OK'); // Respond immediately
// Process async
handleWebhook(req.body).catch(console.error);
});
Anything else is retried 5 times (1m, 5m, 30m, 2h, 12h backoff), then dead-lettered after 24h.
Event reference
Every example below is validated against the exact schema production
sends, and each X-Webhook-Signature header shows the real
signature for that example body — computed with the test secret
whsec_example_secret at timestamp 1715612400 — so you can verify
your handler against known-good vectors.
document.received — Document received
A document arrived (upload, email, or API) and entered processing.
Example delivery:
POST https://your-server.com/webhooks/kynthar
X-Webhook-Event: document.received
X-Webhook-Signature: t=1715612400,v1=cf1e15e6adf46d688b97f03b4917d2df419eb6bf52d2103d50f1a3e652d1ba50
{
"api_version": "2026-05-13",
"event_id": "evt_01HX3K5TJ0V2N8QW4RB6YD9SFM",
"event_type": "document.received",
"timestamp": "2026-05-13T15:30:00.000Z",
"data": {
"document_id": "01HX3K5TJ0V2N8QW4RB6YD9SFM",
"filename": "invoice-2026-0421.pdf",
"source": "email",
"received_at": "2026-05-13T15:30:00.000Z"
}
}
document.processed — Document processed
A document finished processing; extracted fields are available.
Example delivery:
POST https://your-server.com/webhooks/kynthar
X-Webhook-Event: document.processed
X-Webhook-Signature: t=1715612400,v1=68c3c4b67413c050514dd20006ef8044f080180d261084ee4db916b9b9a45492
{
"api_version": "2026-05-13",
"event_id": "evt_01HX3K5TJ0V2N8QW4RB6YD9SFM",
"event_type": "document.processed",
"timestamp": "2026-05-13T15:30:00.000Z",
"data": {
"document_id": "01HX3K5TJ0V2N8QW4RB6YD9SFM",
"document_type": "invoice",
"classification": "invoice",
"po_number": "PO-2026-0421",
"vendor_name": "Acme Industrial Supply",
"total_amount": 1250,
"currency_code": "USD",
"line_item_count": 12,
"processed_at": "2026-05-13T15:30:00.000Z"
}
}
document.failed — Document failed
A document could not be processed.
Example delivery:
POST https://your-server.com/webhooks/kynthar
X-Webhook-Event: document.failed
X-Webhook-Signature: t=1715612400,v1=49a652f9af61e0c5a0c365272f1587ace68efbb22e4f55eaaa43c66d246749b2
{
"api_version": "2026-05-13",
"event_id": "evt_01HX3K5TJ0V2N8QW4RB6YD9SFM",
"event_type": "document.failed",
"timestamp": "2026-05-13T15:30:00.000Z",
"data": {
"document_id": "01HX3K5TJ0V2N8QW4RB6YD9SFM",
"error_code": "EXTRACTION_FAILED",
"error_message": "Could not extract structured fields from the document.",
"stage": "PARSE",
"failed_at": "2026-05-13T15:30:00.000Z"
}
}
anomaly.detected — Anomaly detected
An anomaly was detected on a document (price, quantity, terms, or risk).
Example delivery:
POST https://your-server.com/webhooks/kynthar
X-Webhook-Event: anomaly.detected
X-Webhook-Signature: t=1715612400,v1=4ea3075c4ffc77a3a5357a5339ab96fc8f7bf23340c85dde7d2c5812bab36135
{
"api_version": "2026-05-13",
"event_id": "evt_01HX3K5TJ0V2N8QW4RB6YD9SFM",
"event_type": "anomaly.detected",
"timestamp": "2026-05-13T15:30:00.000Z",
"data": {
"anomaly_id": "01HX3K5TJ0V2N8QW4RB6YD9SFM",
"document_id": "01HX3K5TJ0V2N8QW4RB6YD9SFM",
"category": "price",
"severity": "high",
"title": "Invoice price exceeds PO price",
"description": "Line 1 bills $2,138.55/unit vs $2,087.31 on the PO.",
"detected_at": "2026-05-13T15:30:00.000Z"
}
}
order.status_changed — Order status changed
A purchase order's fulfillment status changed.
Example delivery:
POST https://your-server.com/webhooks/kynthar
X-Webhook-Event: order.status_changed
X-Webhook-Signature: t=1715612400,v1=38e379b2f00af4f9ea04c2306ee45f93fdcca6f6dcdec79467baaa602f1b0c73
{
"api_version": "2026-05-13",
"event_id": "evt_01HX3K5TJ0V2N8QW4RB6YD9SFM",
"event_type": "order.status_changed",
"timestamp": "2026-05-13T15:30:00.000Z",
"data": {
"order_id": "01HX3K5TJ0V2N8QW4RB6YD9SFM",
"po_number": "PO-2026-0421",
"previous_status": "confirmed",
"new_status": "shipped",
"changed_at": "2026-05-13T15:30:00.000Z"
}
}
shipment.received — Shipment received
A shipment was received against a purchase order.
Example delivery:
POST https://your-server.com/webhooks/kynthar
X-Webhook-Event: shipment.received
X-Webhook-Signature: t=1715612400,v1=2b54b8f27797d88b769b2820ab7bd21a3aa68ed17eb2586887aa51e03550cb40
{
"api_version": "2026-05-13",
"event_id": "evt_01HX3K5TJ0V2N8QW4RB6YD9SFM",
"event_type": "shipment.received",
"timestamp": "2026-05-13T15:30:00.000Z",
"data": {
"shipment_id": "01HX3K5TJ0V2N8QW4RB6YD9SFM",
"po_number": "PO-2026-0421",
"carrier": "FedEx Freight",
"tracking_number": "794583215982",
"received_at": "2026-05-13T15:30:00.000Z"
}
}
invoice.matched — Invoice matched
An invoice was matched to its purchase order.
Example delivery:
POST https://your-server.com/webhooks/kynthar
X-Webhook-Event: invoice.matched
X-Webhook-Signature: t=1715612400,v1=406fd4c569192a9203b93fb7c9f4706eaf9e20d39759371c8a2e52be7e324577
{
"api_version": "2026-05-13",
"event_id": "evt_01HX3K5TJ0V2N8QW4RB6YD9SFM",
"event_type": "invoice.matched",
"timestamp": "2026-05-13T15:30:00.000Z",
"data": {
"invoice_id": "01HX3K5TJ0V2N8QW4RB6YD9SFM",
"document_id": "01HX3K5TJ0V2N8QW4RB6YD9SFM",
"po_number": "PO-2026-0421",
"match_type": "exact",
"match_score": 0.98,
"matched_at": "2026-05-13T15:30:00.000Z"
}
}
webhook.test — Test event
Sent when you trigger a test delivery to verify your endpoint and signature handling. Not subscribable.
Example delivery:
POST https://your-server.com/webhooks/kynthar
X-Webhook-Event: webhook.test
X-Webhook-Signature: t=1715612400,v1=5e50b683e626c453f6f9586ec21a3c4568c1dd11b91aa451ace064d60c66032d
{
"api_version": "2026-05-13",
"event_id": "evt_01HX3K5TJ0V2N8QW4RB6YD9SFM",
"event_type": "webhook.test",
"timestamp": "2026-05-13T15:30:00.000Z",
"data": {
"message": "Test delivery from Kynthar.",
"triggered_at": "2026-05-13T15:30:00.000Z"
}
}
Verify signature (recommended)
X-Webhook-Signature is t=<unix seconds>,v1=<hex digest> — an HMAC-SHA256 of <timestamp>.<raw body> using your webhook secret. Reject stale timestamps (±300s) to block replays.
const crypto = require('crypto');
function verifyWebhook(rawBody, signatureHeader, secret) {
const parts = Object.fromEntries(
signatureHeader.split(',').map((p) => p.split('=', 2))
);
const t = parseInt(parts.t, 10);
if (!t || !parts.v1) return false;
// Replay protection (300s tolerance)
if (Math.abs(Date.now() / 1000 - t) > 300) return false;
const expected = crypto
.createHmac('sha256', secret)
.update(`${t}.${rawBody}`)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(parts.v1, 'hex'),
Buffer.from(expected, 'hex')
);
}
Rate limits
Requests are rate-limited per IP and metered per plan. When you
exceed a limit you get 429 with a registered error code in the
standard error envelope.
Questions?
Email: support@kynthar.com