Create, list, update, archive and delete countdown timers programmatically. Every API key is scoped to your organization — timers you manage via the API show up right alongside the ones you make in the dashboard.
Create a key from Settings → API Tokens. The plaintext value is only ever shown once, right after creation — store it somewhere safe. Pass it as a bearer token on every request via the Authorization header:
Authorization: Bearer ak_live_4f9c2a1b...Revoking a key from the dashboard takes effect immediately — requests using a revoked key get a 401.
POST/api/v1/timers
name and expiry_datetime are the only required fields — everything else, including the entire visual theme, falls back to sane defaults. A successful response returns the new timer's id:
{
"id": "5da851e7-f41d-4af8-bd87-f45611a6bd67"
}For all available fields and a full theme example, see Field reference below.
GET/api/v1/timers
Returns timers belonging to your organization, newest first by default. All parameters are optional query-string parameters.
[
{
"id": "5da851e7-f41d-4af8-bd87-f45611a6bd67",
"name": "Black Friday Sale",
"description": "",
"end_date_time": "2026-11-27T23:59:00-05:00[America/New_York]",
"is_archived": false,
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-02T00:00:00.000Z"
}
]| Parameter | Type | Description |
|---|---|---|
| query | string | Case-insensitive substring match on name. |
| status | "all" | "active" | "expired" (repeatable) | Defaults to all statuses. |
| archived | boolean | List archived timers instead of active ones. Defaults to false. |
| order_by | "name" | "created_at" | "updated_at" | "end_date_time" | Defaults to created_at. |
| order_direction | "asc" | "desc" | Defaults to desc. |
| limit | integer (1-100) | Defaults to 100. |
| offset | integer | Defaults to 0. |
GET/api/v1/timers/:id
Returns a timer's full configuration, including its theme — the same shape you'd send to create or update it.
{
"name": "Black Friday Sale",
"description": "",
"organization_id": "org_2abc123def456",
"expiry_datetime": "2026-11-27T23:59:00-05:00[America/New_York]",
"expiry_message": "Sale has ended!",
"language": "en",
"is_archived": false,
"theme": { "...": "same shape as the theme you sent on create" }
}PATCH/api/v1/timers/:id
Partial update — send only the fields you want to change. Anything you omit, including nested theme fields, is left exactly as it was. The response is the full timer config after the update:
{
"name": "Extended Black Friday Sale",
"description": "",
"organization_id": "org_2abc123def456",
"expiry_datetime": "2026-11-29T23:59:00-05:00[America/New_York]",
"expiry_message": "Sale has ended!",
"language": "en",
"is_archived": false,
"theme": { "...": "unchanged fields are left as they were" }
}DELETE/api/v1/timers/:id
Permanently deletes the timer. There's no undo — if you might want it back, use Archive instead.
A successful response is 204 No Content with an empty body.
Archiving hides a timer from your active list without deleting it — useful for sales that ended but you still want to reference later.
POST/api/v1/timers/:id/archive
{ "archived": true }POST/api/v1/timers/:id/restore
{ "restored": true }These are the body fields accepted by Create. Update accepts the exact same fields, all optional — only the ones you include are changed.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | The timer's name (1-200 characters). |
| expiry_datetime | string | Yes | Zoned datetime the timer counts down to, e.g. 2026-12-31T23:59:00+02:00[Europe/Athens]. |
| description | string | No | Internal note about the timer (not shown to recipients). |
| expiry_message | string | No | Message shown once the timer has expired. |
| language | string | No | Locale for rendered labels, e.g. "en". Defaults to "en". |
| fallback_image_key | string | No | R2 object key of a static image to show after expiry. Must already exist in your fallback images bucket. |
| theme | object | No | Visual overrides — see below. Any field you omit falls back to the default theme. |
All optional. Unknown keys are rejected with a 422 so typos don't silently fall back to defaults.
| Field | Type | Description |
|---|---|---|
| shape_type | "ft_01" | "ft_02" | "ft_03" | "ft_04" | "ft_05" | Which of the five timer visual templates to use. |
| font_size | "small" | "medium" | "large" | Digit font size. |
| font | string | Font name, or custom-font-<id> for a font you've uploaded under Fonts. |
| backdrop_fill | hex color | Background fill color, e.g. #0F172A. |
| no_backdrop | boolean | Render with a transparent background instead of backdrop_fill. |
| matte_color | hex color | Matte color shown around the timer shape. |
| digits.leading_zero | boolean | Pad single digits with a leading zero. |
| digits.color | hex color | Digit text color. |
| digits.fill | hex color | Digit background fill color. |
| digits.border_color | hex color | Optional digit border color. |
| labels.color | hex color | Color of the unit labels (days/hours/etc). |
| labels.display | boolean | Whether unit labels are shown. |
| separators.color | hex color | Color of the separators between units. |
| separators.display | boolean | Whether separators are shown. |
| days.display | boolean | Whether the days unit is shown. |
Error responses you may get from any /api/v1/timers endpoint, with an example body for each. Toggle Show Schema to see the shape instead of example values.
{
"error": "expiry_datetime must be a valid zoned datetime string"
}Requests are limited to 60 per minute, per organization (not per key — all keys belonging to the same organization share the same limit). Once you hit the limit, you'll get a 429 until the window resets.
flashtimer also exposes an MCP server at /api/mcp, so AI tools like Claude can create and manage your timers directly. It uses the same API key and rate limit as the REST API above — pass it as a bearer token via the Authorization header in your client's MCP config:
{
"mcpServers": {
"flashtimer": {
"url": "https://flashtimer.app/api/mcp",
"headers": {
"Authorization": "Bearer ak_live_4f9c2a1b..."
}
}
}
}| Tool | Description |
|---|---|
| create_timer | Creates a new timer. Same fields as POST /api/v1/timers. |
| list_timers | Lists your timers, with optional filtering, ordering, and pagination. |
| get_timer | Fetches the full configuration of a single timer by id. |
| archive_timer | Archives a timer so it stops showing as active. |
| restore_timer | Restores a previously archived timer. |
| generate_timer_with_ai | Creates a timer from a free-text prompt, e.g. "20% off, ends Friday, dark theme". |
| revise_timer_with_ai | Revises an existing timer's copy, styling, or schedule from a free-text instruction, e.g. "make it red and extend by 2 days". |
Add one or more webhook URLs to a timer and flashtimer will POST a JSON payload to each URL the moment that timer's countdown reaches zero. Use this to trigger Zapier Zaps, Make scenarios, or any custom automation endpoint — without writing any server-side code.
flashtimer sends this JSON body with Content-Type: application/json:
{
"event": "timer.expired",
"timer": {
"id": "5da851e7-f41d-4af8-bd87-f45611a6bd67",
"name": "Black Friday Sale",
"expiredAt": "2026-11-27T23:59:00.000Z",
"organizationId": "org_01jk..."
},
"timestamp": "2026-11-27T23:59:01.234Z"
}Both platforms expose a "catch webhook" trigger URL you can paste directly into the dialog:
Promise.allSettled — one slow or failing endpoint does not block the others.Connect Klaviyo so flashtimer can list your draft campaigns inside the Deploy → Send to ESP panel. You pick the campaign, flashtimer generates the embed snippet, and you paste it — no tab-switching needed.
pk_. Klaviyo shows it only once.<img> snippet pointing at the live timer GIF on chronos.flashtimer.app.Add a Custom HTML block in your email and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;width:100%;" />Connect Mailchimp to pull draft campaigns into the Send to ESP panel and generate a countdown embed in seconds.
.api.mailchimp.com in your API endpoint URL, e.g. us1.save (draft) are listed in the Send to ESP panel.Add a Code block in your campaign and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;width:100%;" />Connect Omnisend to list draft campaigns and embed countdown timers directly into your Omnisend emails.
Add an HTML block in your campaign and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%;" />Connect ActiveCampaign to see draft email campaigns and embed countdown timers — useful for time-sensitive automation sequences.
https://youracccount.api-us1.com) and your API Key are on that page.1) are listed in the Send to ESP panel.Add an HTML block in your campaign and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%;" />Connect Drip to embed countdown timers in your broadcasts and workflows. Requires your API token and your numeric Account ID.
app.getdrip.com/{accountId}/....Add a Custom HTML block in your broadcast and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%;" />Connect Brevo (formerly Sendinblue) to pull draft email campaigns into flashtimer and embed countdown timers with one click.
xkeysib-.Add a Raw HTML block in your campaign and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%;" />Connect Wix to pull your draft Email Marketing campaigns into flashtimer and generate countdown timer embeds with one click. Requires a Wix API key and your Site ID.
manage.wix.com/dashboard/{siteId}/....Add an HTML block in your email and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%;" />Connect Constant Contact using an OAuth access token from the developer portal to embed countdown timers in your emails.
Add a Custom Code block in your email and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%;" />Connect GetResponse to pull draft newsletters into flashtimer and embed countdown timers without leaving the timer editor.
draft) are listed in the Send to ESP panel.Add a Custom HTML block in your newsletter and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%;" />Connect MailerLite to pull draft email campaigns into flashtimer and embed countdown timers in one click. Requires a MailerLite Advanced plan for API access.
Add an HTML block in your campaign and paste:
<img src="https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67"
alt="Black Friday Sale"
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%;" />Connect Zapier to send timer events to any of Zapier's 7,000+ supported apps — Slack, Notion, Google Sheets, Airtable, Salesforce, and more. No code required. flashtimer POSTs a JSON payload to your Zap the moment you click Send to Platform on a timer.
https://hooks.zapier.com/hooks/catch/...).flashtimer sends this JSON to your Zap when you click Send to Platform:
{
"timerName": "Black Friday Sale",
"timerUrl": "https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67",
"gifUrl": "https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67",
"expiresAt": "2026-11-27T23:59:00-05:00[America/New_York]"
}timerUrl and gifUrl point at the live GIF — embed either directly in a Slack message or HTML email action.
Connect your Shopify store so flashtimer can read your active Price Rules and surface real sale end-dates directly in the timer editor. Instead of typing a deadline manually, you pick a discount rule and the countdown is set automatically.
read_price_rules — lets flashtimer list your discounts in the timer editor.read_discounts — required for webhook processing (fetching full discount details).write_webhooks — lets flashtimer register webhook listeners automatically.read_products — required for the Shopify Stock Monitor feature (list products and stock levels in the timer editor).read_inventory — required for the Stock Monitor to read per-location inventory quantities.shpat_) — Shopify shows it only once..myshopify.com domain from the admin URL.ends_at date appear in the timer editor under Pick a sale end date.ends_at: null (always-on) are shown as context but don't set a deadline.// Example discounts returned from Shopify
[
{ "id": "123456789", "title": "Black Friday 20% Off", "endsAt": "2026-11-28T00:00:00Z" },
{ "id": "987654321", "title": "Cyber Monday", "endsAt": "2026-12-01T00:00:00Z" },
{ "id": "111222333", "title": "Always-on member deal","endsAt": null }
]When you save your Shopify credentials, flashtimer automatically registers webhook listeners in your store for discounts/create, discounts/update, and discounts/delete. The legacy Price Rules API (price_rules/create, price_rules/update, price_rules/delete) is also supported for stores that haven't migrated to the modern Discounts API.
Webhook sync is off by default. Under Settings → Integrations → Shopify you'll find three toggles under Automation:
Every incoming webhook is verified with HMAC-SHA256 using your Shopify Custom App's API Secret Key. Add it to the Webhook Signing Secret field in the Shopify integration settings — without it, flashtimer will reject all incoming webhook calls. The API Secret Key is on the API credentials tab of your Custom App in Shopify Admin.
Webhooks are received at:
POST https://flashtimer.app/webhook/shopifyThe Stock Monitor lets you tie any timer to a Shopify product's inventory. When the product's total stock drops to or below a threshold you define, flashtimer automatically expires the timer — every email opened after the sell-out shows the expiry message instead of a live countdown.
Your Shopify Custom App must have two extra scopes beyond the base integration:
read_products — allows flashtimer to list your products and their stock levels.read_inventory — allows flashtimer to read per-location inventory quantities.read_products and read_inventory, then click Save.0 to expire only when completely sold out, or 10 for a low-stock trigger), and click Save.Connect Make (formerly Integromat) to send timer data to any of Make's 2,000+ supported apps and services — CRMs, project tools, databases, and more — using a visual no-code workflow. No code required.
{
"timerName": "Black Friday Sale",
"timerUrl": "https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67",
"gifUrl": "https://chronos.flashtimer.app/5da851e7-f41d-4af8-bd87-f45611a6bd67",
"expiresAt": "2026-11-27T23:59:00-05:00[America/New_York]"
}Connect your WooCommerce store to surface active sale end dates from your coupons directly in the timer editor. Instead of entering a deadline manually, pick a coupon and flashtimer fills it in automatically.
https://yourstore.com), Consumer key, and Consumer secret under Settings → Integrations → WooCommerce.date_expires are listed in the timer editor under Pick a sale end date.on_sale=true) are also surfaced alongside coupons, so you can link a timer to a product sale end date too.[
{ "id": 101, "name": "Black Friday 20% Off", "date_expires": "2026-11-28T00:00:00Z" },
{ "id": 102, "name": "Cyber Monday Flash", "date_expires": "2026-12-01T00:00:00Z" }
]When you save your WooCommerce credentials, flashtimer automatically registers webhook listeners in your store for coupon.created, coupon.updated, coupon.deleted, and coupon.restored via the WooCommerce REST API. Each webhook is signed with a per-org HMAC-SHA256 secret that flashtimer generates automatically — no manual configuration needed.
Webhook sync is off by default. Under Settings → Integrations → WooCommerce you'll find three toggles under Automation:
date_expires_gmt is added.Webhooks are received at:
POST https://flashtimer.app/webhook/woocommerce/{orgId}The orgId is your organization's unique identifier — flashtimer uses it to look up your credentials and route the webhook to the correct account. It's included automatically in the webhook URL registered in your WooCommerce store.
Connect your BigCommerce store to see active promotion and coupon end dates in the timer editor. flashtimer reads your store's promotions via the V2/V3 API so you can align countdowns to your discount expiry without switching tabs.
https://api.bigcommerce.com/stores/{storeHash}/v3/.expires date are listed in the timer editor.[
{ "id": 501, "name": "Black Friday Promo", "expires": "2026-11-28T00:00:00+00:00" },
{ "id": 502, "name": "Holiday Sale", "expires": "2026-12-26T00:00:00+00:00" }
]curl https://flashtimer.app/api/v1/timers \
-H "Authorization: Bearer ak_live_4f9c2a1b..."