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
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[].description | string |
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 |
Auth
GET /api/v1/auth/company-settings
Get auth company settings
data payload:
| Field | Type |
|---|---|
company_id | string |
company_name | string |
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[].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.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/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 |
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 |
Chat home
GET /api/v1/chat-home/kpi-summary
Get chat home kpi summary
data payload:
| Field | Type |
|---|---|
spend_12mo_usd | number or null |
monthly_spend_12mo | array of number or null or null |
open_po_count | number or null |
active_vendor_count | number or null |
otif_pct_12mo | number or null |
monthly_otif_12mo | array of number or null or null |
open_exception_count | number or null |
avg_lead_time_days | number or null |
monthly_lead_time_12mo | array of number or null or null |
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[].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 |
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 |
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 |
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[].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 |
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[].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 |
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[].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 |
summary | object |
summary.total_carriers | number or string or null |
summary.avg_otif | string or number 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-health
Get contract health
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
summary | object |
summary.active_contracts | number or string or null |
summary.expiring_90d | number or string or null |
summary.nte_warnings | number or string or null |
summary.total_contract_value | string or number or null |
summary.total_spend_against_contracts | string or number or null |
summary.overall_utilization_pct | string or number or null |
expiring_contracts | array of objects |
expiring_contracts[].contract_id | string |
expiring_contracts[].contract_number | string or null |
expiring_contracts[].vendor_name | string |
expiring_contracts[].expiration_date | string or null |
expiring_contracts[].days_remaining | number or string or null |
expiring_contracts[].total_value_limit | string or number or null |
expiring_contracts[].cumulative_spend | string or number or null |
expiring_contracts[].auto_renewal | boolean or null |
expiring_contracts[].notice_period_days | number or string or null |
nte_warnings | array of objects |
nte_warnings[].contract_id | string |
nte_warnings[].contract_number | string or null |
nte_warnings[].vendor_name | string |
nte_warnings[].total_value_limit | string or number or null |
nte_warnings[].cumulative_spend | string or number or null |
nte_warnings[].utilization_pct | string or number or null |
nte_warnings[].expiration_date | string or null |
underutilized | array of objects |
underutilized[].contract_id | string |
underutilized[].contract_number | string or null |
underutilized[].vendor_name | string |
underutilized[].total_value_limit | string or number or null |
underutilized[].cumulative_spend | string or number or null |
underutilized[].utilization_pct | string or number or null |
underutilized[].days_remaining | number or string or null |
underutilized[].time_elapsed_pct | string or number or null |
price_creep | array of objects |
price_creep[].vendor_id | string or null |
price_creep[].vendor_name | string |
price_creep[].vendor_part_number | string or null |
price_creep[].min_price | string or number or null |
price_creep[].max_price | string or number or null |
price_creep[].increase_pct | string or number or null |
price_creep[].month_count | number or string or null |
price_creep[].total_invoices | number or string or null |
otif_trend | array of objects |
otif_trend[].month | string |
otif_trend[].total_deliveries | number or string or null |
otif_trend[].otif_count | number or string or null |
otif_trend[].otif_pct | string or number or null |
compliance_trend | array of objects |
compliance_trend[].month | string |
compliance_trend[].total_validations | number or string or null |
compliance_trend[].compliant | number or string or null |
compliance_trend[].compliance_pct | string or number or null |
spend_concentration | array of objects |
spend_concentration[].vendor_id | string or null |
spend_concentration[].vendor_name | string |
spend_concentration[].total_spend | string or number or null |
spend_concentration[].spend_pct | string or number or null |
spend_concentration[].has_contract | boolean 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 |
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 |
otif_pct | string or number or null |
otif_deliveries | number or string or null |
value_surfaced | string or number 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
Get OTIF
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.on_time_count | number or string or null |
summary.in_full_count | number or string 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 |
alerts | any |
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[].avg_days_variance | string or number 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[].total | number or string 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 |
total_duty_usd | string or number or null or null |
blended_effective_rate_pct | string or number or null 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[].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 |
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[].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_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 |
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[].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 or null |
metric_backing | object or null |
totals | object |
totals.total_value | string or number or null |
totals.verified_value | string or number or null |
totals.price_variance | string or number or null |
totals.overbilling | string or number or null |
totals.duplicates_prevented | string or number or null |
totals.fraud_prevented | string or number or null |
totals.price_outliers | string or number or null |
totals.discounts | string or number or null |
totals.sourcing_opps | string or number or null |
totals.risk_exposure | string or number or null |
totals.otif_impact | string or number or null |
totals.total_events | number or string or null |
totals.total_docs | number or string or null |
monthly | array of objects |
monthly[].month | string |
monthly[].total | string or number or null |
monthly[].price_variance | string or number or null |
monthly[].overbilling | string or number or null |
monthly[].duplicates | string or number or null |
monthly[].fraud | string or number or null |
monthly[].outliers | string or number or null |
monthly[].discounts | string or number or null |
monthly[].sourcing | string or number or null |
monthly[].risk | string or number or null |
monthly[].otif | string or number or null |
monthly[].events | number or string or null |
monthly[].docs | number or string or null |
GET /api/v1/analytics/vendor-scorecards
Vendor scorecards (paginated)
| 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). |
sort | query | string | no | Scorecard sort column (default composite_score). |
include | query | string | no | Hierarchy view — per-vendor leaves, parent rollups, or both. |
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[].vendor_name | string |
vendors[].composite_score | number or string or null |
vendors[].otif_pct | string or number or null |
vendors[].on_time_pct | string or number or null |
vendors[].in_full_pct | string or number or null |
vendors[].total_deliveries | number or string or null |
vendors[].avg_days_variance | string or number or null |
vendors[].anomaly_count | number or string or null |
vendors[].critical_anomaly_count | number or string or null |
vendors[].total_spend | string or number or null |
vendors[].invoice_count | number or string or null |
vendors[].risk_score | string or number or null |
vendors[].industry | string or null |
vendors[].active_contracts | number or string or null |
vendors[].nearest_expiration | string or null |
vendors[].claims_count | number or string or null |
vendors[].claims_open_count | number or string or null |
vendors[].claims_amount_open | string or number or null |
vendors[].avg_price_trend_pct | string or number or null |
vendors[].price_tracked_items | number or string or null |
vendors[].vendor_categories | array of string or null |
vendors[].primary_category | string or null |
vendors[].vendor_type | string or null |
vendors[].country | string or null |
vendors[].state_or_region | string or null |
vendors[].city | string or null |
vendors[].postal_code | string or null |
vendors[].open_po_count | number or string or null |
vendors[].open_po_value | string or number or null |
vendors[].parent_vendor_id | string or null |
vendors[].is_rollup | boolean or null |
vendors[].subsidiary_count | number or string or null |
vendors[].subsidiary_ids | array of string or null |
GET /api/v1/analytics/vendor-trends
Per-vendor monthly trend series
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_ids | query | string | no | Comma-separated vendor ids. |
months | query | string | no | Trailing window in months. |
data payload:
| Field | Type |
|---|---|
trends | object |
GET /api/v1/analytics/vendor-trends/aggregate
Aggregated monthly trend series
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
vendor_ids | query | string | no | Comma-separated vendor ids. |
months | query | string | no | Trailing window in months. |
data payload:
| Field | Type |
|---|---|
monthly | array of objects |
monthly[].month | string or null |
monthly[].total_spend | string or number or null |
monthly[].total_documents | number or string or null |
monthly[].total_deliveries | number or string or null |
monthly[].otif_pct | string or number or null |
monthly[].on_time_pct | string or number or null |
monthly[].in_full_pct | string or number 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.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 |
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 |
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 |
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 |
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[].exposure_basis | string |
signals[].confidence | number or null |
signals[].as_of_date | string or null |
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 (impact-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 | — |
vendor_id | query | string | no | — |
bucket | query | string | no | material = exclude $0 procedural noise; procedural = only it. |
search | query | string | no | — |
Returns: Paginated — pass cursor/limit (see Pagination above).
data payload:
| Field | Type |
|---|---|
findings | array of objects |
findings[].finding_id | string |
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[].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_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 |
currency_code | string or null |
auto_resolved_last_7d | number or string or null |
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 |
total_claimed | string or number or null |
total_recovered | string or number or null |
total_approved | string or number or null |
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 |
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_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[].email_direction | string or null |
items[].email_class | string or null |
items[].filed_reason | 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 |
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 |
|---|---|
currency_code | string or null |
items | array of objects |
items[].item_id | string |
items[].currency_code | string or null |
items[].description | string or null |
items[].category | string or null |
items[].category_metric_backing | object or null |
items[].subcategory | string or null |
items[].sku | string or null |
items[].mpn | string or null |
items[].uom | 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 | 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[].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[].open_anomaly_count | number or string or null |
items[].critical_anomaly_count | number or string or null |
items[].intelligence | object or null |
stats | object |
stats.currency_code | string or null |
stats.total_items | number or string or null |
stats.total_spend | number or string or null |
stats.total_spend_lifetime | number or string or null |
stats.total_spend_ttm | number or string or null |
stats.sole_source_count | number or string or null |
stats.dual_source_count | number or string or null |
stats.multi_source_count | number or string or null |
stats.active_contract_count | number or string or null |
stats.high_variance_count | number or string or null |
categories | array of string |
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 |
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 |
total_spend | number or string or null |
avg_price | number or string or null |
last_price_update | string 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[].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 |
has_active_contract | boolean or null |
active_contract_count | number or string or null |
intelligence | object or null |
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 |
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 |
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[].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 |
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 |
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[].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.due_soon | 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[].latest_expected_date | string or null |
purchase_orders[].latest_promise_source | string or null |
purchase_orders[].receipt_pct | string or number 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.action_required | number |
stats.overdue | number |
stats.due_soon | number |
stats.pending | number |
stats.confirmed | number |
stats.shipped | number |
stats.in_transit | number |
stats.delivered | number |
stats.partial_ship | number |
stats.partial_receipt | number |
stats.on_hold | number |
stats.backordered | number |
stats.cancelled | number |
stats.disputed | number |
stats.closed_short | number |
stats.closed_complete | number |
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_placed_date | string or null |
confirmation_received_date | string 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 |
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_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_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[].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[].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[].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 |
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 |
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 |
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 |
action_required | number |
overdue | number |
due_soon | number |
pending | number |
confirmed | number |
shipped | number |
in_transit | number |
delivered | number |
partial_ship | number |
partial_receipt | number |
on_hold | number |
backordered | number |
cancelled | number |
disputed | number |
closed_short | number |
closed_complete | number |
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 |
|---|---|
validation_runs | array of objects |
validation_runs[].doc_id | string |
validation_runs[].doc_type | string or null |
validation_runs[].document_number | string or null |
validation_runs[].vendor_name | string or null |
validation_runs[].vendor_id | string or null |
validation_runs[].document_date | string or null |
validation_runs[].due_date | string or null |
validation_runs[].total_amount | string or number or null |
validation_runs[].subtotal | string or number or null |
validation_runs[].tax_amount | string or number or null |
validation_runs[].tax_rate | string or number or null |
validation_runs[].shipping_amount | string or number or null |
validation_runs[].match | object or null |
validation_runs[].anomaly_count | number or string or null |
validation_runs[].critical_anomaly_count | number or string or null |
validation_runs[].high_anomaly_count | number or string or null |
validation_runs[].current_status | string or null |
validation_runs[].matched_po_number | string or null |
validation_runs[].buyer_po_number | string or null |
validation_runs[].discount_status | string or null |
validation_runs[].discount_percent | number or string or null |
validation_runs[].discount_deadline | string or null |
validation_runs[].sanctions_status | string or null |
validation_runs[].payment_status | string or null |
validation_runs[].uploaded_at | string |
validation_runs[].baseline_total | string or number or null |
validation_runs[].previously_invoiced | string or number or null |
validation_runs[].hold_reason | string or null |
validation_runs[].linked_invoice_doc_id | string or null |
validation_runs[].linked_invoice_number | string or null |
validation_runs[].credit_memo_match_method | string 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_confidence | number or string or null |
five_way_match | object 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 |
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 |
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.missed_discount_12mo | number |
summary.missed_discount_count_12mo | number |
GET /api/v1/reconciliation/payment-funnel
Get reconciliation payment funnel
data payload:
| Field | Type |
|---|---|
currency_code | string or null |
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.close_readiness | object |
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[].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 |
shipments[].source_doc_type | string or null |
shipments[].doc_count | number |
shipments[].source_doc_types | array of string or null |
shipments[].linked_status | string |
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[].mode | string or null |
shipments[].origin_city | string or null |
shipments[].origin_state | string or null |
shipments[].origin_zip | string or null |
shipments[].dest_city | string or null |
shipments[].dest_state | string or null |
shipments[].dest_zip | string or null |
shipments[].pickup_date | string or null |
shipments[].created_at | string or null |
shipments[].updated_at | string or null |
shipments[].tracking_number | string or null |
shipments[].pro_number | string or null |
shipments[].response_deadline | string or null |
shipments[].pod_doc_id | string or null |
shipments[].booking_reference | string or null |
shipments[].carrier_name | string or null |
shipments[].carrier_vendor_id | string or null |
total | number |
limit | number |
offset | number |
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/stats
Get shipments stats
data payload:
| Field | Type |
|---|---|
total | number |
draft | number |
issued | number |
evaluating | number |
booked | number |
in_transit | number |
delivered | number |
cancelled | number |
linked | number |
unlinked | number |
platform | 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 |
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[].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[].otif_pct | string or number or null |
vendors[].otif_strict_pct | 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 |
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 |
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 |
otif_pct | string or number or null |
otif_strict_pct | 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[].captured_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 |
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 |
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[].captured_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[].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/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 |
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