Cubbie API
Programmatically manage your software stack, trigger analyses, and read recommendations.
Authentication
All API endpoints (except the health check) require an API key. You can create one from your Buyer Dashboard under the "API Keys" section.
Getting an API Key
- Create a free account if you do not have one.
- Navigate to your Buyer Dashboard.
- Scroll to the "API Keys" section and click "Create New Key."
- Copy the key immediately -- it is shown only once.
Authenticating Requests
Pass the key in the Authorization header:
Authorization: Bearer cb_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKeys follow the format cb_live_ followed by 32 hex characters. Keep your keys secret and never commit them to source control.
Base URL
https://cubbie.com/api/v1All endpoints return JSON with the shape { "ok": true, "data": ... } on success or { "ok": false, "error": { "message": "..." } } on failure.
Endpoints
Health check. No authentication required.
curl https://cubbie.com/api/v1/health{
"ok": true,
"data": {
"status": "ok",
"version": "1.0.0",
"timestamp": "2026-03-29T12:00:00.000Z"
}
}List all subscriptions for your organization.
curl -H "Authorization: Bearer cb_live_xxxx" \
https://cubbie.com/api/v1/subscriptions{
"ok": true,
"data": {
"items": [
{
"id": "uuid",
"vendor_name": "Slack",
"product_name": "Slack Business+",
"annualized_spend_cents": 1440000,
"renewal_date": "2027-01-15",
"status": "active"
}
]
}
}Add a subscription to your stack registry.
curl -X POST \
-H "Authorization: Bearer cb_live_xxxx" \
-H "Content-Type: application/json" \
-d '{"vendor_name":"Slack","product_name":"Slack Business+","annualized_spend_cents":1440000,"renewal_date":"2027-01-15"}' \
https://cubbie.com/api/v1/subscriptions{
"ok": true,
"data": {
"id": "uuid",
"vendor_name": "Slack",
"product_name": "Slack Business+",
"annualized_spend_cents": 1440000,
"status": "active"
}
}Retrieve a single subscription by its ID.
curl -H "Authorization: Bearer cb_live_xxxx" \
https://cubbie.com/api/v1/subscriptions/UUID{
"ok": true,
"data": {
"id": "uuid",
"vendor_name": "Slack",
"product_name": "Slack Business+",
"annualized_spend_cents": 1440000,
"renewal_date": "2027-01-15",
"status": "active"
}
}Update fields on an existing subscription.
curl -X PATCH \
-H "Authorization: Bearer cb_live_xxxx" \
-H "Content-Type: application/json" \
-d '{"annualized_spend_cents":1600000}' \
https://cubbie.com/api/v1/subscriptions/UUID{
"ok": true,
"data": {
"id": "uuid",
"vendor_name": "Slack",
"product_name": "Slack Business+",
"annualized_spend_cents": 1600000,
"status": "active"
}
}Delete a subscription from your stack registry.
curl -X DELETE \
-H "Authorization: Bearer cb_live_xxxx" \
https://cubbie.com/api/v1/subscriptions/UUID{
"ok": true,
"data": { "deleted": true }
}Bulk import up to 500 subscriptions at once.
curl -X POST \
-H "Authorization: Bearer cb_live_xxxx" \
-H "Content-Type: application/json" \
-d '{"items":[{"vendor_name":"Slack","product_name":"Slack Business+","annualized_spend_cents":1440000}]}' \
https://cubbie.com/api/v1/subscriptions/bulk{
"ok": true,
"data": { "created": 1, "failed": 0, "errors": [] }
}Trigger a full stack analysis for your organization. Returns gap analysis, benchmarks, and recommendations.
curl -X POST \
-H "Authorization: Bearer cb_live_xxxx" \
https://cubbie.com/api/v1/advisor/analyze{
"ok": true,
"data": {
"id": "uuid",
"gaps": [...],
"recommendations": [...]
}
}Retrieve current recommendations. Supports optional query params: status, priority.
curl -H "Authorization: Bearer cb_live_xxxx" \
https://cubbie.com/api/v1/advisor/recommendations{
"ok": true,
"data": {
"items": [
{
"id": "uuid",
"type": "add",
"category": "project-management",
"priority": "high",
"title": "Add a project management tool",
"rationale": "..."
}
]
}
}Report usage data for a subscription (active users, licensed seats, utilization).
curl -X POST \
-H "Authorization: Bearer cb_live_xxxx" \
-H "Content-Type: application/json" \
-d '{"subscription_id":"UUID","active_users":42,"total_licensed_seats":50,"utilization_pct":84}' \
https://cubbie.com/api/v1/usage{
"ok": true,
"data": {
"id": "uuid",
"created_at": "2026-03-29T12:00:00.000Z"
}
}Error Handling
Errors return a non-2xx status code and a JSON body with the error details:
{
"ok": false,
"error": {
"message": "Unauthorized",
"details": null
}
}| Status | Meaning |
|---|---|
400 | Invalid request body or parameters |
401 | Missing or invalid API key |
403 | Valid key but insufficient permissions |
404 | Resource not found |
429 | Rate limit exceeded |
500 | Internal server error |
Rate Limits
Each API key is limited to 1,000 requests per hour. When the limit is exceeded, the API returns a 429 Too Many Requests response.
The response includes a Retry-After header indicating how many seconds to wait before retrying.
SDKs
Official SDKs for Node.js, Python, and Ruby are coming soon. In the meantime, the API works with any HTTP client -- curl, fetch, requests, or your language of choice.
| Language | Status |
|---|---|
| Node.js | Coming soon |
| Python | Coming soon |
| Ruby | Coming soon |
| HTTP (any client) | Available now |
Ready to integrate?
Create a free account and start sending data to Cubbie in minutes.
Create Free Account