API Documentation
Comprehensive guide to accessing Microsoft Fabric roadmap data through our RSS and JSON endpoints.
GET RSS Feed
Endpoints: /rss and /rss.xml
Description: Returns an RSS 2.0 feed of recently modified releases with optional filtering.
Parameters
product_name- Filter by exact product name (case-sensitive)release_type- Filter by exact release typerelease_status- Filter by exact release statuslimit- Maximum number of items (1-25, default: 25)
Examples
RSS: Administration, Governance and Security
/rss?product_name=Administration%2C+Governance+and+Security&limit=10RSS: Data Engineering
/rss?product_name=Data+Engineering&limit=10RSS: Data Factory
/rss?product_name=Data+Factory&limit=10RSS: Data Science
/rss?product_name=Data+Science&limit=10RSS: Data Warehouse
/rss?product_name=Data+Warehouse&limit=10RSS: General availability
/rss?release_type=General+availability&limit=10RSS: Public preview
/rss?release_type=Public+preview&limit=10RSS: Planned
/rss?release_status=Planned&limit=10RSS: Shipped
/rss?release_status=Shipped&limit=10GET JSON API
Endpoint: /api/releases
Description: Returns a paginated envelope of releases. Always sorted by last_modified (desc), then release_date. Supports filtering, full-text style partial search (simple ILIKE %q%) and page-based navigation. All collection responses are wrapped; a single-item lookup via release_item_id returns just the object (legacy compatibility) without the envelope.
Parameters
product_name- Exact match on product namerelease_type- Exact match on release typerelease_status- Exact match on release statusmodified_within_days- Items modified within last N days (1–30)q- Case-insensitive substring search acrossfeature_name,feature_description,product_namepage- 1-based page number (default 1)page_size- Items per page (default 50, max 200, min 1)release_item_id- If provided, bypasses pagination and returns a single release object
Notes:
qtrimming applied; empty/whitespace-only search is ignored.- When
release_item_idis supplied, all other filter / paging parameters are ignored. - Stable, stateless pagination: combine your filters +
page/page_size; uselinks.nextuntil it becomesnull. - Returns
Linkresponse header withrel="next"/rel="prev"when applicable.
Examples
JSON: Administration, Governance and Security
/api/releases?product_name=Administration%2C+Governance+and+SecurityJSON: Data Engineering
/api/releases?product_name=Data+EngineeringJSON: Data Factory
/api/releases?product_name=Data+FactoryJSON: Data Science
/api/releases?product_name=Data+ScienceJSON: Data Warehouse
/api/releases?product_name=Data+WarehouseJSON: General availability
/api/releases?release_type=General+availabilityJSON: Public preview
/api/releases?release_type=Public+previewJSON: Planned
/api/releases?release_status=PlannedJSON: Shipped
/api/releases?release_status=ShippedJSON: modified_within_days=7
/api/releases?modified_within_days=7JSON: modified_within_days=14
/api/releases?modified_within_days=14JSON: modified_within_days=30
/api/releases?modified_within_days=30Search (q)
/api/releases?q=lake&page_size=25Page 3 with filters
/api/releases?product_name=Power BI&release_status=GA&page=3&page_size=50Single Item
/api/releases?release_item_id=YOUR-ID-HEREResponse Format & Schemas
Collection responses (/api/releases without release_item_id) are wrapped in an envelope that includes pagination metadata and HATEOAS-style links.
Collection Envelope
{
"data": [
{
"release_item_id": "uuid",
"feature_name": "string",
"release_date": "YYYY-MM-DD|null",
"release_type": "string",
"release_status": "string",
"product_id": "uuid|null",
"product_name": "string",
"feature_description": "string|null",
"last_modified": "YYYY-MM-DD"
}
// ... up to page_size items
],
"pagination": {
"page": 1,
"page_size": 50,
"total_items": 1234,
"total_pages": 25,
"has_next": true,
"has_prev": false,
"next_page": 2,
"prev_page": null
},
"links": {
"self": "/api/releases?product_name=Power%20BI&page=1&page_size=50",
"first": "/api/releases?product_name=Power%20BI&page=1&page_size=50",
"last": "/api/releases?product_name=Power%20BI&page=25&page_size=50",
"next": "/api/releases?product_name=Power%20BI&page=2&page_size=50",
"prev": null
}
}
Single Item (release_item_id)
{
"release_item_id": "uuid",
"feature_name": "string",
"release_date": "YYYY-MM-DD|null",
"release_type": "string",
"release_status": "string",
"product_id": "uuid|null",
"product_name": "string",
"feature_description": "string|null",
"last_modified": "YYYY-MM-DD"
}
History Endpoint /api/releases/history/<release_item_id>
[
{
"changed_columns": ["FeatureDescription", "ReleaseDate"],
"last_modified": "2025-01-12"
},
// ... newest first
]
Filter Options /api/filter-options
{
"product_names": ["Power BI", "Data Factory", ...],
"release_types": ["Public Preview", "GA", ...],
"release_statuses": ["In Development", "Launched", ...]
}
Email Subscription
POST /api/subscribe JSON body:
{
"email": "user@example.com",
"products": ["Power BI"], // optional array
"types": ["GA"], // optional array
"statuses": ["Launched"] // optional array
}
Verification link sent if new/unverified. Other related endpoints:
GET /api/verify-email?token=...(JSON result)GET /verify-email?token=...(HTML page)GET /unsubscribe?token=...(HTML page)
HTTP Caching
All JSON & RSS endpoints emit:
- ETag - Weak hash for conditional GET (send
If-None-Matchto receive 304) - Last-Modified - Based on build time (collection) or entity timestamp
- Cache-Control -
public, max-age=1800, stale-while-revalidate=900(30 min fresh, 15 min serve-stale)
Server-side Redis cache keeps a 24h fresh + 24h stale copy; client-facing headers use shorter periods for responsiveness.
Caching & Performance
Summary of server-side caching layers:
- Redis Fresh Window: 24h (immediate responses)
- Redis Stale Window: +24h (served while background refresh occurs)
- Key Dimensions (collection): product_name, release_type, release_status, modified_within_days, q, page, page_size
- Key Dimensions (single item): release_item_id
- Background Refresh: Locking avoids thundering herd; stale responses annotated with
X-Cache: STALE - Client Cache: Shorter 30m TTL encourages conditional revalidation with
ETag