# Token Unlock Calendar - Upcoming Crypto Unlocks (`primevision/token-unlock-calendar`) Actor

Upcoming token unlock events (cliff & linear vesting) from DefiLlama, Dropstab and CoinMarketCap in one normalized calendar: token, date, amount, USD value, % of supply, allocation breakdown. Windows: today / 7 / 30 / 90 days. Webhook alerts, pay per row.

- **URL**: https://apify.com/primevision/token-unlock-calendar.md
- **Developed by:** [Prime Vision](https://apify.com/primevision) (community)
- **Categories:** Developer tools, News
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 unlock rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Token Unlock Calendar — Upcoming Crypto Unlocks

Get **upcoming token unlock events** — cliff and linear vesting — as clean structured data: token, unlock date, amount, **USD value**, **% of total supply**, and the **allocation breakdown** (team / investors / airdrop / farming…). Pick a window (**today / 7 / 30 / 90 days**), filter by minimum USD value or specific tokens, and pipe the rows into your bot, dashboard or alert channel.

Token unlocks are **scheduled, market-moving supply events**: when a large tranche vests, sell pressure often follows — and it is all known in advance. This actor turns that schedule into an API.

### Why this actor

- **Three independent sources, one schema.** Unlock schedules are aggregated from DefiLlama emissions, Dropstab vesting and CoinMarketCap unlocks (~1,500 tokens combined), merged per token per unlock day. Rows confirmed by multiple sources carry the full provenance list in `sources` — your cross-validation signal for free.
- **A calendar, not a data dump.** One row per token per unlock day with the total amount, USD value and per-allocation breakdown — including when different sources round the same cliff to different UTC days (deduplicated automatically). Tokens from different projects sharing a ticker are kept apart.
- **Market-impact fields built in.** Every row carries `value_usd` and `pct_of_total_supply`, so filtering for "unlocks that matter" is one input field (`minValueUsd`).
- **Cliff vs linear.** Cliff unlocks (the market-moving ones) are labelled and separable from daily linear emissions.
- **Pay per row, capped.** Pay-per-event pricing with a hard `maxItems` cap per run. Optional cross-run deduplication: on a daily schedule you are only charged for events you have not seen yet.
- **Push, don't poll.** Optional webhook URL — every delivered row is POSTed as JSON to your endpoint (n8n, Make, Zapier, Telegram bridge, your own bot).

### Output example

```json
{
  "id": "STRK:2026-08-14",
  "token": "Starknet",
  "symbol": "STRK",
  "unlock_date": "2026-08-14",
  "days_until": 25,
  "amount_tokens": 226356430.83,
  "value_usd": 6454211.45,
  "pct_of_total_supply": 2.26,
  "unlock_type": "cliff",
  "allocations": [
    { "name": "insiders",    "amount_tokens": 147214125.83, "value_usd": 4197588.26 },
    { "name": "privateSale", "amount_tokens": 60392305.0,   "value_usd": 1721995.28 },
    { "name": "liquidity",   "amount_tokens": 18750000.0,   "value_usd": 534627.91 }
  ],
  "sources": ["defillama", "dropstab", "cmc"],
  "info_url": "https://defillama.com/unlocks/starknet-bridge"
}
````

### Use cases

- **Trading around unlocks**: large cliff unlocks are among the best-documented recurring supply shocks; front-run the calendar instead of reading it on Crypto Twitter after the move.
- **Risk management**: screen your portfolio / market-making inventory for upcoming supply increases.
- **Alerting**: daily schedule + `dedupe` + webhook = a free-to-quiet unlock alert bot for Telegram/Discord/Slack.
- **Research & dashboards**: historical-forward dataset of unlock events with USD sizing and allocation categories.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `sources` | array | all 3 | `defillama`, `dropstab`, `cmc` |
| `window` | select | `next30` | `today`, `next7`, `next30`, `next90` |
| `minValueUsd` | int | 0 | Skip unlocks below this USD value — recommended `100000`+ (without a floor, small daily linear emissions dominate: ~6,000 rows/30 days vs ~900 at $100k) |
| `tokens` | array | — | Only these symbols (e.g. `ARB`, `APT`) |
| `maxItems` | int | 1000 | Hard cap on rows (soonest first) = spend cap |
| `dedupe` | bool | `false` | Charge only for never-delivered events (for schedules) |
| `notifyWebhookUrl` | string | — | POST every delivered row to this URL |

### Recommended setups

**Market-moving calendar** (dashboards, research): `window: next30`, `minValueUsd: 100000` — the complete 30-day calendar of unlocks that matter (~700–900 rows).

**Unlock alert bot** (Telegram/Discord via webhook): daily [Apify Schedule](https://docs.apify.com/schedules), `window: next7`, `minValueUsd: 1000000`, `dedupe: true` — you are only charged when a new market-moving unlock enters the 7-day window.

**Everything** (quant pipelines): `minValueUsd: 0`, `maxItems: 5000` — every tracked unlock row including small daily linear emissions.

### Pricing (pay-per-event)

You are charged per **unlock row delivered** plus a small actor-start fee. `maxItems` caps the spend of any single run; with `dedupe` enabled, quiet scheduled runs cost only the start fee.

### Data sources & reliability

Aggregated from three independent public sources: **DefiLlama emissions** (340+ protocols with documented vesting schedules, embedded prices and supplies), **Dropstab vesting** (580+ coins with full forward schedules and cliff/linear/nonlinear typing) and **CoinMarketCap unlocks** (1,200+ tokens). Each source is fetched independently — one source having issues never blocks the others; source errors are reported in the run log. The actor validates dataset shapes on every run and fails loudly (rather than returning silently empty results) if an upstream source changes.

***

**From the same author:** [Listing Radar — CEX New Listing & Delisting Monitor](https://apify.com/primevision/listing-radar) — official Binance/OKX/Bitget/KuCoin/Upbit announcement feeds, normalized, pay-per-event. Unlocks tell you *scheduled* supply shocks; listings tell you *unscheduled* demand shocks. Together they cover both calendars that move altcoin prices.

***

*Keywords: token unlock calendar api, upcoming token unlocks, vesting schedule api, token unlock data, crypto unlock tracker, cliff unlock alert, tokenomics vesting data, token emission schedule, unlock calendar bot, arbitrum unlock, token unlock webhook*

# Actor input Schema

## `sources` (type: `array`):

Which upstream sources to aggregate. Rows describing the same (token, day) are merged with provenance in the `sources` field.

## `window` (type: `string`):

How far ahead to look for unlock events.

## `minValueUsd` (type: `integer`):

Skip unlock events smaller than this USD value. Recommended: 100000+ — without a floor, small daily linear emissions flood the calendar (~6000 rows/30 days vs ~900 at $100k). Set 0 for everything.

## `tokens` (type: `array`):

Only include these token symbols (e.g. ARB, APT, OP). Leave empty for all tokens.

## `maxItems` (type: `integer`):

Hard cap on delivered rows (soonest unlocks first). Also caps your spend per run.

## `dedupe` (type: `boolean`):

When enabled (recommended for scheduled alerting), you are only charged for unlock events never delivered in previous runs. Keep it off to get the full calendar snapshot every run.

## `notifyWebhookUrl` (type: `string`):

If set, every delivered unlock row is POSTed to this URL as JSON — plug in Zapier/Make/n8n/Telegram-bridge for alerts.

## `proxy` (type: `object`):

Keep Apify Proxy enabled — some sources rate-limit datacenter IPs.

## Actor input object example

```json
{
  "sources": [
    "defillama",
    "dropstab",
    "cmc"
  ],
  "window": "next30",
  "minValueUsd": 100000,
  "tokens": [],
  "maxItems": 1000,
  "dedupe": false,
  "notifyWebhookUrl": "",
  "proxy": {
    "useApifyProxy": true
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sources": [
        "defillama",
        "dropstab",
        "cmc"
    ],
    "minValueUsd": 100000,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("primevision/token-unlock-calendar").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sources": [
        "defillama",
        "dropstab",
        "cmc",
    ],
    "minValueUsd": 100000,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("primevision/token-unlock-calendar").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "defillama",
    "dropstab",
    "cmc"
  ],
  "minValueUsd": 100000,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call primevision/token-unlock-calendar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=primevision/token-unlock-calendar",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Token Unlock Calendar - Upcoming Crypto Unlocks",
        "description": "Upcoming token unlock events (cliff & linear vesting) from DefiLlama, Dropstab and CoinMarketCap in one normalized calendar: token, date, amount, USD value, % of supply, allocation breakdown. Windows: today / 7 / 30 / 90 days. Webhook alerts, pay per row.",
        "version": "0.1",
        "x-build-id": "mJebrQucN3bnudBMx"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/primevision~token-unlock-calendar/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-primevision-token-unlock-calendar",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/primevision~token-unlock-calendar/runs": {
            "post": {
                "operationId": "runs-sync-primevision-token-unlock-calendar",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/primevision~token-unlock-calendar/run-sync": {
            "post": {
                "operationId": "run-sync-primevision-token-unlock-calendar",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sources": {
                        "title": "Data sources",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Which upstream sources to aggregate. Rows describing the same (token, day) are merged with provenance in the `sources` field.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "defillama",
                                "dropstab",
                                "cmc"
                            ],
                            "enumTitles": [
                                "DefiLlama emissions",
                                "Dropstab vesting",
                                "CoinMarketCap unlocks"
                            ]
                        },
                        "default": [
                            "defillama",
                            "dropstab",
                            "cmc"
                        ]
                    },
                    "window": {
                        "title": "Time window",
                        "enum": [
                            "today",
                            "next7",
                            "next30",
                            "next90"
                        ],
                        "type": "string",
                        "description": "How far ahead to look for unlock events.",
                        "default": "next30"
                    },
                    "minValueUsd": {
                        "title": "Minimum unlock value (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Skip unlock events smaller than this USD value. Recommended: 100000+ — without a floor, small daily linear emissions flood the calendar (~6000 rows/30 days vs ~900 at $100k). Set 0 for everything.",
                        "default": 0
                    },
                    "tokens": {
                        "title": "Token filter (optional)",
                        "type": "array",
                        "description": "Only include these token symbols (e.g. ARB, APT, OP). Leave empty for all tokens.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max rows",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Hard cap on delivered rows (soonest unlocks first). Also caps your spend per run.",
                        "default": 1000
                    },
                    "dedupe": {
                        "title": "Deduplicate across runs",
                        "type": "boolean",
                        "description": "When enabled (recommended for scheduled alerting), you are only charged for unlock events never delivered in previous runs. Keep it off to get the full calendar snapshot every run.",
                        "default": false
                    },
                    "notifyWebhookUrl": {
                        "title": "Webhook URL (optional)",
                        "type": "string",
                        "description": "If set, every delivered unlock row is POSTed to this URL as JSON — plug in Zapier/Make/n8n/Telegram-bridge for alerts.",
                        "default": ""
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Keep Apify Proxy enabled — some sources rate-limit datacenter IPs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
