Connect SCREENish to your tools
SCREENish gives your account four ways out: a REST API, signed webhooks, chat alerts (Slack, Microsoft Teams, Discord, Google Chat), and subscription feeds for calendars and spreadsheets. Every one of them is created on the dashboard under API & Integrations and can be revoked there at any moment. The full machine-readable description is at /api/v1/openapi.json.
This page is the reference. If you are setting a connection up by hand rather than writing code, each one has a step-by-step guide with the buttons to press: Connecting SCREENish to your other tools.
API keys
Create a key on the dashboard (API & Integrations → API keys). It is shown once. Send it as a bearer token:
curl -H "Authorization: Bearer sk_live_..." https://www.screenish.com/api/v1/me
- Scopes. Read keys read everything below. Read + write keys can also create manual time entries and manage webhook subscriptions.
- Address allow-list. Optionally restrict a key to your servers' IPv4/IPv6 addresses or CIDR ranges; elsewhere it answers 403.
- Limits. 120 requests per minute per key (
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset); beyond that 429 withRetry-After. Periods span at most 92 days; lists page at up to 200 rows. - Keys live with the subscription. A key works while the account has an active subscription and is deleted when the account closes. Every use is recorded (time, address, endpoint, filters, records returned) and visible to the account owner.
- Never in the URL. A key sent as a query parameter is refused, even when valid.
Endpoints
| Endpoint | What it returns |
|---|---|
GET /api/v1/me | The account this key belongs to. |
GET /api/v1/members?status=active|invited|deactivated|all | Team members with member_id, name, e-mail and status. |
GET /api/v1/projects | Projects and the member_id values assigned to each. |
GET /api/v1/time-entries?from&to&member_id&project_id&approved&include=notes&page&per_page | 10-minute entries: start, end, approved, manual, idle seconds, activity counts. Notes only with include=notes. |
POST /api/v1/time-entries (write) | Manual time: {member_id, project_id, started_at, minutes, notes}. Overlapping slots are skipped and counted. |
GET /api/v1/timesheets?from&to&member_id&project_id&approved=1|0|all | Minutes per member, project and day. Add format=csv&preset=generic|qbtime for a file. |
GET /api/v1/activity?from&to&member_id | Minutes, idle and input counts per member and day. |
GET /api/v1/alerts?from&to&status=open|resolved|all | Activity review windows: severity, time window, date, status. |
GET /api/v1/face-checks?from&to&result=fail|pass|all | Face verification verdicts. |
GET /api/v1/events | The webhook event catalogue. |
GET|POST /api/v1/hooks, DELETE /api/v1/hooks/{id} (write) | Webhook subscriptions (REST Hooks, as Zapier and Make expect). |
Dates: from and to accept unix seconds or YYYY-MM-DD in the account's time zone. Responses are {"data": ..., "meta": ...}; errors are {"error": "code", "message": "..."} with a real HTTP status.
Webhooks
Step by step for a chat channel: Slack, Microsoft Teams, Discord and Google Chat.
Register a destination on the dashboard (a custom URL, or a Slack, Teams, Discord or Google Chat incoming webhook) and choose events. Custom destinations receive the JSON envelope; chat destinations receive a readable message. Only public https addresses are accepted.
| Event | When |
|---|---|
time.started | A member starts tracking. |
time.stopped | A member has been inactive for 15 minutes. |
entry.recorded | Every 10-minute entry (high volume). |
integrity.alert | An activity review window is opened: severity and time window only. |
face.check_failed | A face check fails: verdict only. |
member.invited, member.deactivated, member.restored | Team changes. |
approval.changed | Entries were approved or unapproved. |
summary.daily | Yesterday's minutes per member, at 08:00 in the account's time zone. |
{
"id": "evt_9dc051d1441de588b9154160",
"event": "integrity.alert",
"occurred_at": 1789596780,
"account_id": 123,
"data": { "alert_id": 3, "member_id": 9, "severity": "high", "from": 1789590000, "to": 1789591200, "date": "2026-09-17" }
}
Verify every delivery. Each request carries X-Screenish-Timestamp and X-Screenish-Signature: sha256=<hex>, where the hex is HMAC-SHA256 over timestamp + "." + raw body with the signing secret shown once when the webhook was created. Reject a delivery whose signature does not match or whose timestamp is older than five minutes.
// Node.js
const crypto = require('crypto');
function verify(secret, headers, rawBody) {
const ts = headers['x-screenish-timestamp'];
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(ts + '.' + rawBody).digest('hex');
const given = headers['x-screenish-signature'] || '';
return Math.abs(Date.now() / 1000 - Number(ts)) < 300
&& expected.length === given.length
&& crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(given));
}
# Python
import hmac, hashlib, time
def verify(secret, headers, raw_body):
ts = headers['X-Screenish-Timestamp']
expected = 'sha256=' + hmac.new(secret.encode(), (ts + '.').encode() + raw_body, hashlib.sha256).hexdigest()
return abs(time.time() - int(ts)) < 300 and hmac.compare_digest(expected, headers.get('X-Screenish-Signature', ''))
Answer with any 2xx within 10 seconds. Failures are retried after 1, 5 and 30 minutes, then 2 and 6 hours, and abandoned after five attempts; a destination that keeps failing is paused and the dashboard says why. A destination receives at most 120 deliveries a minute.
Zapier, Make, n8n
Step by step: Zapier, Make and n8n.
Any of them works today through a custom webhook (their "catch hook" trigger receives the envelope above) plus the REST API for lookups and actions. Create the webhook on the dashboard, or let your automation register it itself with POST /api/v1/hooks ({"target_url": "https://...", "events": ["time.stopped"]}) using a read + write key.
Calendar and spreadsheet feeds
Step by step: calendar events, a live spreadsheet.
A feed is a private link that calendar and spreadsheet applications refresh on their own. Create one on the dashboard and revoke it when it is no longer needed; anyone holding the link can read the feed.
- Calendar (ICS): each tracked block becomes an event named after the member and the project, with its duration. Google Calendar: Other calendars → From URL. Outlook: Add calendar → Subscribe from web. Apple Calendar: File → New Calendar Subscription.
- Spreadsheet (CSV): minutes per member, project and day. Google Sheets:
=IMPORTDATA("https://www.screenish.com/feed/csv/<token>"). Excel: Data → From Web. Add?from=YYYY-MM-DD&to=YYYY-MM-DDfor a period, or?preset=qbtimefor the QuickBooks Time layout. - JSON: the same rows for your own tools.
Jira, ClickUp and Trello
Step by step: Jira, ClickUp, Trello.
Connect a tool on the dashboard with its own credentials (a Jira API token and site, a ClickUp personal token, a Trello key and token) and map each SCREENish project to an issue key, a task id or a card id. Once an hour, approved minutes per member, project and day are pushed as a Jira worklog, a ClickUp time entry or a Trello comment named after the member and the project; a changed day updates the same object rather than creating another. Optionally an activity review opens an issue, task or card with the member's name, the severity and the time window. Credentials are stored encrypted, a "Test" button verifies them, and a tool that keeps refusing pauses the connection until you look.
Accounting exports
Step by step: QuickBooks Time and payroll exports.
The dashboard's export button (and GET /api/v1/timesheets?format=csv) produces a timesheet file for a period. The QuickBooks Time preset follows its timesheet import layout (first name, last name, date, hours, customer, service item, notes, billable); the generic preset carries hours as decimals for any payroll or accounting import that maps columns. Neither file carries pay rates.
Questions
Write to info@screenish.com. Changes to the API are announced with notice; the current version is v1.