Add a vendor to the AI vendor inventory.
- Authentication
Authorization: Bearer vk_…- Required scope
- write:vendor
- Rate limit
- Per key.
X-RateLimit-* on every response; a 429 carries Retry-After. - Idempotency
- Send an
Idempotency-Key; a retry with the same key replays the first response for 24h.
Request body (application/json, required)
Request body of POST /vendor/inventory| Field | Type | Description |
|---|
| ai_role? | string | null | The vendor’s role in the AI stack. |
|---|
| annual_cost_usd? | number | null (0–…) | Annual contract value, USD. |
|---|
| category | string | What the vendor supplies. |
|---|
| contract_end? | string | null | Contract end date. |
|---|
| contract_start? | string | null | Contract start date. |
|---|
| initial_recommendation? | string | nullone of: consolidate, negotiate, maintain, exit, onboard, null | Recommendation at intake. |
|---|
| initial_risk_band | stringone of: CRITICAL, HIGH, MEDIUM, LOW | Risk band at intake. |
|---|
| notes? | string | null | Working notes. |
|---|
| renewal_owner_role? | string | null | Role accountable for the renewal. |
|---|
| status? | stringone of: active, under_review, negotiating, sunsetting, exited, blocked | Review status. Defaults to active. |
|---|
| vendor_key | string | Stable identifier, unique in the organisation (e.g. "openai"). |
|---|
| vendor_name | string | Vendor name. |
|---|
{
"ai_role": "example_ai_role",
"annual_cost_usd": 0,
"category": "example_category",
"contract_end": "example_contract_end",
"contract_start": "example_contract_start",
"initial_recommendation": "consolidate",
"initial_risk_band": "CRITICAL",
"notes": "example_notes",
"renewal_owner_role": "example_renewal_owner_role",
"status": "active",
"vendor_key": "example_vendor_key",
"vendor_name": "example_vendor_name"
}
Examples
curl
curl -X POST "https://www.vouliiq.com/api/v1/vendor/inventory" \
-H "Authorization: Bearer $VOULI_API_KEY" \
-H "Vouli-Version: 2026-09-12" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"ai_role":"example_ai_role","annual_cost_usd":0,"category":"example_category","contract_end":"example_contract_end","contract_start":"example_contract_start","initial_recommendation":"consolidate","initial_risk_band":"CRITICAL","notes":"example_notes","renewal_owner_role":"example_renewal_owner_role","status":"active","vendor_key":"example_vendor_key","vendor_name":"example_vendor_name"}'
TypeScript
// Not wrapped by the SDK: a plain HTTP call.
const res = await fetch('https://www.vouliiq.com/api/v1/vendor/inventory', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VOULI_API_KEY}`,
'Vouli-Version': '2026-09-12',
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
ai_role: 'example_ai_role',
annual_cost_usd: 0,
category: 'example_category',
contract_end: 'example_contract_end',
contract_start: 'example_contract_start',
initial_recommendation: 'consolidate',
initial_risk_band: 'CRITICAL',
notes: 'example_notes',
renewal_owner_role: 'example_renewal_owner_role',
status: 'active',
vendor_key: 'example_vendor_key',
vendor_name: 'example_vendor_name',
}),
});
console.log(res.status, await res.json());
Python
# Not wrapped by the SDK: a plain HTTP call.
import json
import os
import urllib.request
import uuid
req = urllib.request.Request(
"https://www.vouliiq.com/api/v1/vendor/inventory",
method="POST",
headers={"Authorization": f"Bearer {os.environ['VOULI_API_KEY']}", "Vouli-Version": "2026-09-12", "Idempotency-Key": str(uuid.uuid4()), "Content-Type": "application/json"},
data=json.dumps({
"ai_role": "example_ai_role",
"annual_cost_usd": 0,
"category": "example_category",
"contract_end": "example_contract_end",
"contract_start": "example_contract_start",
"initial_recommendation": "consolidate",
"initial_risk_band": "CRITICAL",
"notes": "example_notes",
"renewal_owner_role": "example_renewal_owner_role",
"status": "active",
"vendor_key": "example_vendor_key",
"vendor_name": "example_vendor_name",
}).encode(),
)
with urllib.request.urlopen(req) as res:
print(res.status, json.loads(res.read()))