Quick Start
Base URL: https://escalake.com/api/v1
Authentication: Bearer token (Authorization: Bearer YOUR_API_KEY)
Content-Type: application/json
Rate limit: 60 requests / minute per keyAPI keys are created in Settings → API Keys. Keys are shown once. Store them securely.
Authentication
All endpoints except /api/v1/health require a Bearer token in the Authorization header:
Authorization: Bearer escalake_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxRequests without a valid token return 401 Unauthorized. Invalid or expired tokens also return 401.
Rate limit exceeded returns 429 Too Many Requests with a Retry-After header.
Endpoints
/api/v1/healthNo authentication requiredSimple ping and uptime check. Returns the API status and current server timestamp. Use this endpoint to verify connectivity before making authenticated requests.
Example Response
{
"status": "ok",
"version": "v1",
"timestamp": "2026-05-16T12:00:00.000Z"
}/api/v1/seriesList index series visible to your workspace. Results are paginated using cursor-based pagination. Use the nextCursor value from a previous response to fetch the next page.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | No | Filter by provider (BLS, FRED, EIA, ECB, WORLD_BANK, IMF, EUROSTAT, ONS, STATCAN, ABS, BIS, BOJ, OECD, DBNOMICS, NASDAQ_DATA_LINK) |
limit | integer | No | Results per page. Default: 50. Max: 200. |
cursor | string | No | Pagination cursor from a previous response's pagination.nextCursor. |
Example Request
curl https://escalake.com/api/v1/series?provider=BLS&limit=10 \
-H "Authorization: Bearer escalake_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Example Response
{
"data": [
{
"id": "cser_01jz...",
"seriesCode": "CUUR0000SA0",
"name": "CPI All Urban Consumers",
"provider": "BLS",
"dataType": "INDEX",
"unit": "Index (1982-84=100)",
"frequency": "MONTHLY",
"createdAt": "2026-01-15T09:30:00.000Z"
}
],
"pagination": {
"limit": 10,
"hasMore": true,
"nextCursor": "eyJpZCI6ImNzZXJfMDF..."
}
}/api/v1/series/:seriesId/valuesGet time series data points for a specific index. Returns values in ascending date order. Use the from and to parameters to scope a date range, and version to filter by data revision status.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
seriesId | string (UUID) | Yes | The series UUID. |
from | string (YYYY-MM-DD) | No | Start date, inclusive. |
to | string (YYYY-MM-DD) | No | End date, inclusive. |
limit | integer | No | Max data points to return. Default: 500. Max: 2000. |
version | string | No | Filter by version tag: PRELIMINARY, FINAL, or REVISED. |
Example Request
curl "https://escalake.com/api/v1/series/cser_01jz.../values?from=2025-01-01&to=2025-12-31&version=FINAL" \
-H "Authorization: Bearer escalake_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Example Response
{
"series": {
"id": "cser_01jz...",
"seriesCode": "CUUR0000SA0",
"name": "CPI All Urban Consumers",
"unit": "Index (1982-84=100)",
"frequency": "MONTHLY"
},
"data": [
{
"asOfDate": "2025-01-01T00:00:00.000Z",
"value": "314.175",
"versionTag": "FINAL"
},
{
"asOfDate": "2025-02-01T00:00:00.000Z",
"value": "315.493",
"versionTag": "FINAL"
}
],
"total": 12
}/api/v1/pamsList price adjustment formulas (PAMs) in your workspace. Returns summary objects — use /api/v1/pams/:pamId for full formula detail including adjustment frequency and contract dates.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Results per page. Default: 50. Max: 200. |
cursor | string | No | Pagination cursor from a previous response. |
Example Request
curl https://escalake.com/api/v1/pams \
-H "Authorization: Bearer escalake_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Example Response
{
"data": [
{
"id": "pam_01jz...",
"name": "Steel Supply Agreement — CPI + PPI Blend",
"description": "60% CPI All Items, 40% PPI Metals",
"status": "ACTIVE",
"createdAt": "2026-01-10T08:00:00.000Z",
"updatedAt": "2026-04-01T14:22:00.000Z"
}
],
"pagination": {
"limit": 50,
"hasMore": false,
"nextCursor": null
}
}/api/v1/pams/:pamIdGet the full detail for a single price adjustment formula, including contract date range and adjustment frequency.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
pamId | string (UUID) | Yes | The formula UUID. |
Example Request
curl https://escalake.com/api/v1/pams/pam_01jz... \
-H "Authorization: Bearer escalake_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Example Response
{
"data": {
"id": "pam_01jz...",
"name": "Steel Supply Agreement — CPI + PPI Blend",
"description": "60% CPI All Items, 40% PPI Metals",
"status": "ACTIVE",
"contractStartDate": "2025-01-01T00:00:00.000Z",
"contractEndDate": "2027-12-31T00:00:00.000Z",
"adjustmentFrequency": "ANNUAL",
"createdAt": "2026-01-10T08:00:00.000Z",
"updatedAt": "2026-04-01T14:22:00.000Z"
}
}/api/v1/pams/:pamId/valuesGet computed price adjustment values for a formula. Each entry includes the adjustment percentage for that period and the running cumulative adjustment since the contract start date.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
pamId | string (UUID) | Yes | The formula UUID. |
from | string (YYYY-MM-DD) | No | Start date, inclusive. |
to | string (YYYY-MM-DD) | No | End date, inclusive. |
Example Request
curl "https://escalake.com/api/v1/pams/pam_01jz.../values?from=2025-01-01&to=2026-01-01" \
-H "Authorization: Bearer escalake_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Example Response
{
"data": [
{
"adjustmentDate": "2026-01-01T00:00:00.000Z",
"adjustmentPct": "3.42",
"cumulativePct": "3.42"
}
]
}Public Index API
A free, read-only API for the public index universe. It covers the same series that have a page under /indices. No account, no API key, no rate limit tier above what an anonymous IP gets. Search indices, read their published history, and compute an escalated price from one or more of them.
Base URL: https://escalake.com/api/public/v1
Auth: none
OpenAPI: https://escalake.com/api/public/v1/openapi.jsonEvery response includes a poweredBy attribution string and, where relevant, a page URL. Cite those when quoting a figure this API returned.
Public API Endpoints
/api/public/v1/indicesNo authentication requiredSearch the public index catalog by free text, provider, or category. Each result includes the latest published value and a page URL to cite.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | No | Free-text search against name, code, and description. |
provider | string | No | Filter by provider, e.g. BLS. |
category | string | No | Filter by category, e.g. "Construction Materials". |
limit | integer | No | Results per page. Default: 20. Max: 50. |
offset | integer | No | Row offset for pagination. Default: 0. |
Example Request
curl "https://escalake.com/api/public/v1/indices?q=steel&limit=5"Example Response
{
"data": [
{
"id": "pcu331110331110",
"name": "US PPI — Iron and Steel Mills",
"provider": "BLS",
"seriesCode": "PCU331110331110",
"category": "Industrial Metals & Parts",
"unit": "Index (1982=100)",
"frequency": "MONTHLY",
"latestValue": 268.4,
"latestDate": "2026-08-01",
"url": "https://escalake.com/indices/pcu331110331110"
}
],
"pagination": { "limit": 5, "offset": 0, "total": 12, "hasMore": true },
"poweredBy": "Powered by Escalake (https://escalake.com). Free public index data. Not investment or legal advice."
}/api/public/v1/indices/:slug/observationsNo authentication requiredGet published data points for one index over a date range. Defaults to the last 5 years. Row count and date range are capped.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
slug | string | Yes | Index slug from GET /api/public/v1/indices. |
from | string (YYYY-MM-DD) | No | Start date, inclusive. |
to | string (YYYY-MM-DD) | No | End date, inclusive. |
limit | integer | No | Max data points. Default: 250. Max: 500. |
Example Request
curl "https://escalake.com/api/public/v1/indices/pcu331110331110/observations?from=2025-01-01&to=2025-12-31"Example Response
{
"index": {
"id": "pcu331110331110",
"name": "US PPI — Iron and Steel Mills",
"provider": "BLS",
"seriesCode": "PCU331110331110",
"unit": "Index (1982=100)",
"frequency": "MONTHLY",
"url": "https://escalake.com/indices/pcu331110331110"
},
"data": [
{ "date": "2025-01-01", "value": 261.2 },
{ "date": "2025-02-01", "value": 262.9 }
],
"count": 12,
"poweredBy": "Powered by Escalake (https://escalake.com). Free public index data. Not investment or legal advice."
}/api/public/v1/escalateNo authentication requiredCompute an escalated price from one or more public indices: a base price, a base date, a target date, per-index weights, an optional fixed (non-escalating) portion, and an optional cap/floor. Returns the adjusted price and the exact index values used.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
basePrice | number | Yes | Contract or scope amount before escalation. |
baseDate | string (YYYY-MM-DD) | Yes | Base period date. |
targetDate | string (YYYY-MM-DD) | Yes | Date to escalate to. |
indices | array of { slug, weight } | Yes | Up to 5 indices. Weights are normalized against each other. |
fixedPortion | number (0-1) | No | Fraction of basePrice that never escalates. Default: 0. |
capPercent | number | No | Optional ceiling on the escalation percentage. |
floorPercent | number | No | Optional floor on the escalation percentage. |
Example Request
curl -X POST https://escalake.com/api/public/v1/escalate \
-H "Content-Type: application/json" \
-d '{
"basePrice": 100000,
"baseDate": "2024-01-01",
"targetDate": "2025-01-01",
"indices": [{ "slug": "pcu331110331110", "weight": 1 }],
"fixedPortion": 0.2
}'Example Response
{
"basePrice": 100000,
"adjustedPrice": 105230.5,
"deltaAmount": 5230.5,
"fixedPortion": 0.2,
"rawChangePercent": 5.23,
"appliedChangePercent": 5.23,
"capApplied": false,
"floorApplied": false,
"indices": [
{
"slug": "pcu331110331110",
"name": "US PPI — Iron and Steel Mills",
"url": "https://escalake.com/indices/pcu331110331110",
"weight": 1,
"baseDate": "2024-01-01",
"baseValue": 255.1,
"targetDate": "2025-01-01",
"targetValue": 261.2,
"changePercent": 2.39
}
],
"calculatorUrl": "https://escalake.com/tools/escalation-calculator",
"poweredBy": "Powered by Escalake (https://escalake.com). Free public index data. Not investment or legal advice."
}MCP Server
The same three capabilities above are also exposed as an MCP (Model Context Protocol) server over Streamable HTTP, so an AI assistant or agent can call Escalake directly instead of reading this page: search_indices, get_index_observations, and compute_escalated_price. No authentication, no account.
MCP endpoint: https://escalake.com/api/mcp
Transport: Streamable HTTPClaude (claude.ai or Desktop)
Settings → Connectors → Add → "Add custom connector", then paste the URL above.
Cursor
Add to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"escalake": {
"url": "https://escalake.com/api/mcp"
}
}
}ChatGPT
Settings → Apps & Connectors → Advanced → enable Developer mode, then add the URL above as a custom MCP server.
Error Responses
All errors return a JSON object with a single error field containing a human-readable message:
{ "error": "Human-readable error message" }| Status | Meaning |
|---|---|
200 OK | Request succeeded. |
400 Bad Request | Invalid query parameters or request body. |
401 Unauthorized | Missing, invalid, or expired API key. |
404 Not Found | The requested resource does not exist or is not accessible to your workspace. |
429 Too Many Requests | Rate limit exceeded. Check the Retry-After header for the wait time in seconds. |
500 Internal Server Error | An unexpected error occurred on our end. Retry with exponential backoff; if the issue persists, contact support. |
Support
Need help? Email admin@escalake.com or open an issue on GitHub.