Public Endpoints (v1)
All public endpoints are unauthenticated and return product lifecycle data.
List All Known Products with Releases
Get a comprehensive list of all available products including their complete release history and lifecycle dates.
Response
[
{
"key": "ruby",
"name": "Ruby",
"categories": [],
"releases": [
{
"releaseCycle": "4.0",
"releaseDate": "2025-12-24",
"eol": "2029-03-30",
"lts": false
},
{
"releaseCycle": "3.4",
"releaseDate": "2024-12-23",
"eol": "2028-03-30",
"lts": false
}
]
},
{
"key": "python",
"name": "Python",
"categories": [],
"releases": [
{
"releaseCycle": "3.14",
"releaseDate": "2025-10-06",
"support": "2027-09-30",
"eol": "2030-10-30",
"lts": false
},
{
"releaseCycle": "3.13",
"releaseDate": "2024-10-06",
"support": "2026-09-30",
"eol": "2029-10-30",
"lts": false
}
]
}
]
Response Fields
| Field | Type | Description |
| key | string | The unique identifier of the product |
| name | string | The display name of the product |
| categories | array | Product categories (if available) |
| releases | array | Complete array of release versions with lifecycle dates |
Release Object Fields
| Field | Type | Description |
| releaseCycle | string | Version number or release cycle identifier |
| releaseDate | date (ISO 8601) | Date when the version was released |
| support | date (ISO 8601) | Date when standard support ends (optional) |
| extended | date (ISO 8601) | Date when extended support ends (optional) |
| eol | date (ISO 8601) | End-of-life date for the version |
| lts | boolean | Whether this is a long-term support release |
Query Parameters
None
Examples
Get all products with releases
curl /api/v1/products
Get releases for a specific product
curl /api/v1/products | jq '.[] | select(.key == "ruby")'
Get all versions of Python
curl /api/v1/products | jq '.[] | select(.key == "python") | .releases'
Get releases for a specific product
curl /api/v1/products/python
Get Single Product Release Information
Get release versions and lifecycle dates for a single product (alternative to filtering the products endpoint).
GET
/api/v1/products/{product_key}
URL Parameters
| Parameter | Type | Description |
| product_key | string | The unique identifier of the product (e.g., "ruby", "python", "postgresql") |
Response
[
{
"releaseCycle": "3.14",
"releaseDate": "2025-10-06",
"support": "2027-09-30",
"eol": "2030-10-30",
"lts": false
},
{
"releaseCycle": "3.13",
"releaseDate": "2024-10-06",
"support": "2026-09-30",
"eol": "2029-10-30",
"lts": false
}
]
Response Fields
| Field | Type | Description |
| releaseCycle | string | Version number or release cycle identifier |
| releaseDate | date (ISO 8601) | Date when the version was released |
| support | date (ISO 8601) | Date when standard support ends (optional) |
| extended | date (ISO 8601) | Date when extended support ends (optional) |
| eol | date (ISO 8601) | End-of-life date for the version |
| lts | boolean | Whether this is a long-term support release |
Examples
Get Ruby Releases
curl /api/v1/products/ruby
Get Python Releases
curl /api/v1/products/python
Using with jq
curl /api/v1/products/postgresql | jq '.[] | select(.releaseCycle == "15")'
Tech Stack Management API (Authenticated)
The Tech Stack Management API allows authenticated users to create and manage their technology stacks programmatically. This API requires authentication using API keys.
Authentication
Tech Stack Management endpoints require authentication via Bearer token in the Authorization header:
Authorization: Bearer YOUR_API_KEY
You can create API keys in the
API Keys dashboard
API keys are personal credentials with the following properties:
- Each user can create up to 5 API keys
- Keys have a 64-character hex format
- Last usage timestamp is tracked for monitoring
Create Tech Stack with Components
Create a new tech stack with technology components in a single atomic operation.
Authentication
| Header | Value | Description |
| Authorization | Bearer {token} | Your 64-character API key token |
Request Body
| Field | Type | Required | Description |
| tech_stack[name] | string | Yes | Name of the tech stack (e.g., "Production Stack") |
| tech_stack[components][] | array | No | Array of component objects with name and version |
Component Object Fields
| Field | Type | Required | Description |
| name | string | Yes | Product key (e.g., "rails", "ruby", "postgresql") |
| version | string | Yes | Version identifier (e.g., "8.0", "3.3") |
Response (201 Created)
{
"success": true,
"message": "Tech stack created successfully",
"tech_stack": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Production Stack",
"components": [
{
"id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"name": "rails",
"version": "8.0"
},
{
"id": "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
"name": "ruby",
"version": "3.3"
}
]
}
}
Error Responses
401 Unauthorized (Missing or Invalid API Key)
{
"success": false,
"message": "Unauthorized - Invalid or missing API key"
}
422 Unprocessable Entity (Validation Error)
{
"success": false,
"message": "Error creating tech stack: Validation failed: ...",
"errors": [
"Name product 'invalid-product' does not exist",
"Version '999.999' does not exist for product 'rails'"
]
}
Examples
Create tech stack with components
curl -X POST /api/tech_stacks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tech_stack": {
"name": "Production Stack",
"components": [
{"name": "rails", "version": "8.0"},
{"name": "ruby", "version": "3.3"},
{"name": "postgresql", "version": "16"}
]
}
}'
Create tech stack without components (add later)
curl -X POST /api/tech_stacks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tech_stack": {
"name": "Staging Stack",
"components": []
}
}'
Update Tech Stack Components
Replace all components of an existing tech stack. This operation is atomic - all components are replaced as a single transaction.
PUT
/api/tech_stacks/{id}/components
Authentication
| Header | Value | Description |
| Authorization | Bearer {token} | Your 64-character API key token |
URL Parameters
| Parameter | Type | Description |
| id | UUID string | The unique identifier of the tech stack to update |
Request Body
The request body should contain an array of component objects:
| Field | Type | Required | Description |
| components[] | array | Yes | Array of component objects with name and version |
Component Object Fields
| Field | Type | Required | Description |
| name | string | Yes | Product key (e.g., "rails", "ruby", "postgresql") |
| version | string | Yes | Version identifier (e.g., "8.0", "3.3") |
Important Notes
- All existing components will be replaced with the new list
- If you provide an empty array, all components will be removed
- The operation is atomic - either all components are updated or none are
- Component validation is performed before any updates are made
Response (200 OK)
{
"success": true,
"message": "Components updated successfully",
"tech_stack": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Production Stack",
"components": [
{
"id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"name": "rails",
"version": "8.1"
},
{
"id": "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
"name": "ruby",
"version": "3.4"
}
]
}
}
Error Responses
401 Unauthorized (Missing or Invalid API Key)
{
"success": false,
"message": "Unauthorized - Invalid or missing API key"
}
404 Not Found (Tech Stack Not Found or Not Owned)
{
"success": false,
"message": "Component not found: ..."
}
422 Unprocessable Entity (Validation Error)
{
"success": false,
"message": "Error updating components: Validation failed: ...",
"errors": [
"Name product 'invalid-product' does not exist",
"Version '999.999' does not exist for product 'rails'"
]
}
Examples
Update components to new versions
curl -X PUT /api/tech_stacks/550e8400-e29b-41d4-a716-446655440000/components \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"components": [
{"name": "rails", "version": "8.1"},
{"name": "ruby", "version": "3.4"},
{"name": "postgresql", "version": "17"}
]
}'
Remove all components (empty array)
curl -X PUT /api/tech_stacks/550e8400-e29b-41d4-a716-446655440000/components \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"components": []}'
Update components and parse output with jq
curl -X PUT /api/tech_stacks/550e8400-e29b-41d4-a716-446655440000/components \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"components": [{"name": "rails", "version": "8.0"}]}' | \
jq '.tech_stack.components'
Fetch Tech Stack
Get the details of a specific tech stack, including all its components.
GET
/api/tech_stacks/{id}
Authentication
| Header | Value | Description |
| Authorization | Bearer {token} | Your 64-character API key token |
URL Parameters
| Parameter | Type | Description |
| id | UUID string | The unique identifier of the tech stack |
Response (200 OK)
{
"success": true,
"tech_stack": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Production Stack",
"components": [
{
"id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"name": "rails",
"version": "8.0"
},
{
"id": "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
"name": "ruby",
"version": "3.3"
}
]
}
}
Error Responses
401 Unauthorized (Missing or Invalid API Key)
{
"success": false,
"message": "Unauthorized - Invalid or missing API key"
}
404 Not Found (Tech Stack Not Found or Not Owned)
{
"success": false,
"message": "Tech stack not found"
}
Examples
Fetch a tech stack
curl -X GET /api/tech_stacks/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer YOUR_API_KEY"
Fetch and format with jq
curl -X GET /api/tech_stacks/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer YOUR_API_KEY" | \
jq '.tech_stack.components[] | "\(.name):\(.version)"'