Skip to main content
tickward timers can be embedded on any website as a live countdown inside an iframe. The embed page is anonymous and cookie-free, so it works on static sites, blogs, documentation pages, and site builders without any setup on the host page. A timer is embeddable exactly while it has an active share link. The embed URL uses the same share token as the share link, and revoking the share disables the embed: instead of breaking, the iframe switches to a neutral “Timer unavailable” card.

Quick start

The easiest path is the share dialog. Share a timer, open the Embed section, pick a layout and theme, and copy the generated snippet. You can also write the snippet by hand. The share link ends with the share token (for example https://your-tickward-origin/share/timer_abc123); the embed page lives at /embed/<shareToken> on the same origin:
<iframe
  src="https://your-tickward-origin/embed/timer_abc123?layout=horizontal"
  width="560"
  height="96"
  style="border:0"
  loading="lazy"
  title="Product launch countdown"
></iframe>
The embed fills 100% of the iframe and scales fluidly, so the width and height you set on the iframe define the rendered size. The title attribute is for accessibility on the host page; use the timer label.

Parameters

All query parameters are optional. Validation happens server-side with safe fallbacks: an invalid value falls back to its default instead of producing an error, so a hand-edited snippet keeps rendering. Unknown parameters are ignored.
ParameterValuesDefaultNotes
layouttext, minimal, compact, square, horizontalcompactSee the layout table below for recommended sizes.
themelight, dark, autolightauto follows the visitor’s prefers-color-scheme.
accent3- or 6-digit hex, no # (for example e85d2a)timer color, else theme colorApplied to the digits. When the shared timer has a color, that color is the default accent; an explicit accent always wins.
bgtransparent or 3-/6-digit hexcard backgroundtransparent removes the card background and border so the host page shows through. A hex value sets the page background behind the card.
fontmonoUI fontRenders the digits in a monospace font.
labelsoffonHides the unit captions (days, hours, min, sec).
targetoffonHides the absolute target-date line on layouts that show it.
scalenumber from 0.5 to 21Size multiplier on the fluid base size. Values outside the range are clamped.
For example, a dark, monospace, digits-only embed:
/embed/timer_abc123?layout=minimal&theme=dark&font=mono&labels=off&target=off

Layouts and sizes

Each layout has a recommended iframe size and a minimum width below which it stops shrinking. The share dialog uses these sizes for the generated snippet.
LayoutRecommended sizeMinimum width
text320 × 48220px
minimal360 × 64260px
compact288 × 140200px
square280 × 280180px
horizontal560 × 96360px
Embeds are fluid: they fill whatever box the iframe provides and scale the digits to fit, so you can deviate from the recommended sizes. Keep the iframe at or above the minimum width to avoid clipping. Note that scale multiplies the rendered size, so compact at scale=2 effectively needs twice the minimum width.

States

The embed page always responds with HTTP 200 and renders exactly one of these states, so it never shows a browser error page inside your site:
StateMeaning
CountingThe target is in the future; the embed counts down.
SinceThe target is in the past; the embed counts up and shows elapsed time with “since”.
Time’s upA countdown reached zero while the embed was on screen. Shown until the next load, which renders the count-up state.
Timer unavailableThe share token is invalid or the share link was revoked. A neutral card with no timer details.

JSON state endpoint

For consumers that render natively instead of embedding the iframe - code components in site builders, widgets, badges - the embed state is available as JSON:
GET /api/embed/<shareToken>
The endpoint is public and needs no API key; the share token is the capability. It responds with open CORS (Access-Control-Allow-Origin: *) so browsers can fetch it from any origin.
{
  "state": "counting",
  "now": "2026-06-11T12:00:00.000Z",
  "timer": {
    "label": "Product launch",
    "targetDate": "2026-06-23T18:00:00.000Z",
    "timezone": "Europe/Warsaw",
    "color": "#e85d2a",
    "description": "Launch event"
  }
}
  • state is counting, since, or unavailable. Treat unknown states as unavailable; the enum can grow.
  • now is the server time. Offset your countdown by the difference between now and the local clock instead of trusting the visitor’s clock.
  • timer is omitted when the state is unavailable. color and description are optional. For recurring timers, targetDate is the resolved next occurrence.
Responses are cached for 60 seconds (Cache-Control: public, max-age=60, stale-while-revalidate=300), and the endpoint is rate limited per client and token. Count down client-side from targetDate and re-fetch opportunistically - on mount and at most every few minutes. Do not poll the endpoint per second.

Attribution

Every embed layout includes a small attribution link to the home page of the deployment serving it. Native consumers of the JSON endpoint should preserve equivalent attribution.