Stack To Date API Documentation

View as Markdown

Programmatic access to product lifecycle data

Overview

The Stack To Date API provides access to software product lifecycle information and tech stack management. The API has two main sections:

  • Public API (v1): Public access to product release data, support timelines, and end-of-life information. No authentication required.
  • Tech Stack Management API: Create and manage technology stacks with API key authentication. Requires an API key for access.

This API is designed for integration with CLI tools, dashboards, and automation workflows.

Base URLs

Public API (v1):

/api/v1

Tech Stack Management API:

/api

Authentication

Public API (v1)

The public API endpoints require no authentication. All product lifecycle data is publicly accessible.

Tech Stack Management API

Tech Stack Management endpoints require authentication using API keys via Bearer token:

Authorization: Bearer YOUR_API_KEY

Create an API key in your dashboard

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.

GET
/api/v1/products

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

FieldTypeDescription
keystringThe unique identifier of the product
namestringThe display name of the product
categoriesarrayProduct categories (if available)
releasesarrayComplete array of release versions with lifecycle dates

Release Object Fields

FieldTypeDescription
releaseCyclestringVersion number or release cycle identifier
releaseDatedate (ISO 8601)Date when the version was released
supportdate (ISO 8601)Date when standard support ends (optional)
extendeddate (ISO 8601)Date when extended support ends (optional)
eoldate (ISO 8601)End-of-life date for the version
ltsbooleanWhether 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

ParameterTypeDescription
product_keystringThe 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

FieldTypeDescription
releaseCyclestringVersion number or release cycle identifier
releaseDatedate (ISO 8601)Date when the version was released
supportdate (ISO 8601)Date when standard support ends (optional)
extendeddate (ISO 8601)Date when extended support ends (optional)
eoldate (ISO 8601)End-of-life date for the version
ltsbooleanWhether 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.

POST
/api/tech_stacks

Authentication

HeaderValueDescription
AuthorizationBearer {token}Your 64-character API key token

Request Body

FieldTypeRequiredDescription
tech_stack[name]stringYesName of the tech stack (e.g., "Production Stack")
tech_stack[components][]arrayNoArray of component objects with name and version

Component Object Fields

FieldTypeRequiredDescription
namestringYesProduct key (e.g., "rails", "ruby", "postgresql")
versionstringYesVersion 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

HeaderValueDescription
AuthorizationBearer {token}Your 64-character API key token

URL Parameters

ParameterTypeDescription
idUUID stringThe unique identifier of the tech stack to update

Request Body

The request body should contain an array of component objects:

FieldTypeRequiredDescription
components[]arrayYesArray of component objects with name and version

Component Object Fields

FieldTypeRequiredDescription
namestringYesProduct key (e.g., "rails", "ruby", "postgresql")
versionstringYesVersion 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

HeaderValueDescription
AuthorizationBearer {token}Your 64-character API key token

URL Parameters

ParameterTypeDescription
idUUID stringThe 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)"'

Error Handling

404 Not Found

Returned when a product key does not exist or is not in the known products list.

{
  "error": "Product not found"
}

Example

curl /api/v1/products/non-existent-product

Rate Limiting

Currently, there are no rate limits on the Stack To Date API. However, we recommend:

  • Cache responses when possible
  • Use reasonable request intervals
  • Implement exponential backoff for retries

Data Format

All API responses use JSON format with ISO 8601 date formatting.

Date Format

All dates are returned in ISO 8601 format (YYYY-MM-DD):

"2025-12-31"

Null Handling

Fields that don't have data are omitted from the response rather than returned as null. This keeps responses compact and easier to parse.