Skip to main content
Use Timely through Corsair: one client, typed API calls, and incoming webhooks. Timely only offers OAuth 2.0; there are no API keys or personal access tokens. Register an app under Settings → API Access in Timely (https://app.timelyapp.com/<workspace id>/oauth_applications), then store its client ID and secret. Timely access tokens do not expire; refresh tokens rotate on every use. Every call is scoped to a workspace. Operations take an optional accountId; without one the plugin uses timely({ accountId }), then the account’s stored account_id, then the only workspace the token can reach. When the user belongs to several workspaces, pass accountId (from accounts.list). What you get:
  • 36 typed API operations
  • 12 incoming webhook event types

Setup

1

Install

2

Add the plugin

corsair.ts
With multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.
3

Choose authentication

4

Connect a tenant

Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.

Example API calls

List this week’s time entries
Log 1h 30m on a project
See the full list on the API page.

Webhooks

Timely sends a thin reference (entity_id, entity_type, date), not the full entry. Fetch the entry with timeEntries.get. Create the Timely webhook with a secret_token and store the same value as the account’s webhook_signature: unsigned deliveries are rejected.
Mount your framework handler once (see Frameworks), then point the provider at that URL. Full event list: Webhooks. Concepts: Webhooks, Hooks.

What’s next

API reference

Every timely.api.* operation with input and output types.

Webhooks

Event paths, payloads, and webhookHooks examples.

Connect / OAuth

createLink, Hub delivery, and tenant connect flows.

Use with agents

Expose this plugin’s operations as MCP tools.