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

  1. Create a free account if you do not have one.
  2. Navigate to your Buyer Dashboard.
  3. Scroll to the "API Keys" section and click "Create New Key."
  4. Copy the key immediately -- it is shown only once.

Authenticating Requests

Pass the key in the Authorization header:

Authorization: Bearer cb_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Keys 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/v1

All endpoints return JSON with the shape { "ok": true, "data": ... } on success or { "ok": false, "error": { "message": "..." } } on failure.

Endpoints

GET/api/v1/health

Health check. No authentication required.

Example Request
curl https://cubbie.com/api/v1/health
Example Response
{ "ok": true, "data": { "status": "ok", "version": "1.0.0", "timestamp": "2026-03-29T12:00:00.000Z" } }
GET/api/v1/subscriptions

List all subscriptions for your organization.

Example Request
curl -H "Authorization: Bearer cb_live_xxxx" \ https://cubbie.com/api/v1/subscriptions
Example Response
{ "ok": true, "data": { "items": [ { "id": "uuid", "vendor_name": "Slack", "product_name": "Slack Business+", "annualized_spend_cents": 1440000, "renewal_date": "2027-01-15", "status": "active" } ] } }
POST/api/v1/subscriptions

Add a subscription to your stack registry.

Example Request
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
Example Response
{ "ok": true, "data": { "id": "uuid", "vendor_name": "Slack", "product_name": "Slack Business+", "annualized_spend_cents": 1440000, "status": "active" } }
GET/api/v1/subscriptions/:id

Retrieve a single subscription by its ID.

Example Request
curl -H "Authorization: Bearer cb_live_xxxx" \ https://cubbie.com/api/v1/subscriptions/UUID
Example Response
{ "ok": true, "data": { "id": "uuid", "vendor_name": "Slack", "product_name": "Slack Business+", "annualized_spend_cents": 1440000, "renewal_date": "2027-01-15", "status": "active" } }
PATCH/api/v1/subscriptions/:id

Update fields on an existing subscription.

Example Request
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
Example Response
{ "ok": true, "data": { "id": "uuid", "vendor_name": "Slack", "product_name": "Slack Business+", "annualized_spend_cents": 1600000, "status": "active" } }
DELETE/api/v1/subscriptions/:id

Delete a subscription from your stack registry.

Example Request
curl -X DELETE \ -H "Authorization: Bearer cb_live_xxxx" \ https://cubbie.com/api/v1/subscriptions/UUID
Example Response
{ "ok": true, "data": { "deleted": true } }
POST/api/v1/subscriptions/bulk

Bulk import up to 500 subscriptions at once.

Example Request
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
Example Response
{ "ok": true, "data": { "created": 1, "failed": 0, "errors": [] } }
POST/api/v1/advisor/analyze

Trigger a full stack analysis for your organization. Returns gap analysis, benchmarks, and recommendations.

Example Request
curl -X POST \ -H "Authorization: Bearer cb_live_xxxx" \ https://cubbie.com/api/v1/advisor/analyze
Example Response
{ "ok": true, "data": { "id": "uuid", "gaps": [...], "recommendations": [...] } }
GET/api/v1/advisor/recommendations

Retrieve current recommendations. Supports optional query params: status, priority.

Example Request
curl -H "Authorization: Bearer cb_live_xxxx" \ https://cubbie.com/api/v1/advisor/recommendations
Example Response
{ "ok": true, "data": { "items": [ { "id": "uuid", "type": "add", "category": "project-management", "priority": "high", "title": "Add a project management tool", "rationale": "..." } ] } }
POST/api/v1/usage

Report usage data for a subscription (active users, licensed seats, utilization).

Example Request
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
Example Response
{ "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 } }
StatusMeaning
400Invalid request body or parameters
401Missing or invalid API key
403Valid key but insufficient permissions
404Resource not found
429Rate limit exceeded
500Internal 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.

LanguageStatus
Node.jsComing soon
PythonComing soon
RubyComing soon
HTTP (any client)Available now

Ready to integrate?

Create a free account and start sending data to Cubbie in minutes.

Create Free Account