{"openapi":"3.0.3","info":{"title":"Screenish API","version":"1.0.0","description":"Work-time, activity counts, membership and assessment verdicts for one Screenish account.\n\nWhat never leaves through this API: screenshot images, application names, window titles, biometric data (Data Processing Agreement clause 3.5). Face checks are reported as pass/fail, activity reviews as a severity and a time window.\n\nAuthenticate with an API key created on the dashboard's API & Integrations page: `Authorization: Bearer sk_live_...`. Keys work only while the account has an active subscription. Rate limit: 120 requests per minute per key (headers X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset; 429 with Retry-After beyond).","contact":{"email":"info@screenish.com"}},"servers":[{"url":"https://www.screenish.com/api/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"sk_live_..."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}},"Account":{"type":"object","properties":{"account_id":{"type":"integer"},"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":"string"},"company":{"type":"string"},"currency":{"type":"string"},"timezone":{"type":"string"},"key":{"type":"object","properties":{"label":{"type":"string"},"scopes":{"type":"string"}}}}},"Member":{"type":"object","properties":{"member_id":{"type":"integer"},"employment_id":{"type":"integer","description":"The employment of this member with this account."},"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":"string"},"status":{"type":"string","enum":["active","invited","deactivated"]},"member_since":{"type":"string"}}},"Project":{"type":"object","properties":{"project_id":{"type":"integer"},"project_name":{"type":"string"},"created":{"type":"string"},"members":{"type":"array","items":{"type":"integer"},"description":"member_id values assigned to the project"}}},"Entry":{"type":"object","description":"One 10-minute tracked or manual entry.","properties":{"entry_id":{"type":"integer"},"member_id":{"type":"integer"},"employment_id":{"type":"integer"},"project_id":{"type":"integer"},"started_at":{"type":"integer","description":"unix seconds"},"ended_at":{"type":"integer"},"minutes":{"type":"integer"},"approved":{"type":"boolean"},"manual":{"type":"boolean"},"idle_seconds":{"type":"integer"},"activity":{"type":"object","description":"Input counts; null means the client did not report that counter.","properties":{"total":{"type":"integer","nullable":true},"mouse_moves":{"type":"integer","nullable":true},"clicks":{"type":"integer","nullable":true},"scrolls":{"type":"integer","nullable":true},"key_presses":{"type":"integer","nullable":true}}},"notes":{"type":"string","description":"Only with include=notes."}}},"TimesheetRow":{"type":"object","description":"Minutes per member, project and day.","properties":{"member_id":{"type":"integer"},"project_id":{"type":"integer"},"date":{"type":"string","format":"date"},"minutes":{"type":"integer"},"approved_minutes":{"type":"integer"},"manual_minutes":{"type":"integer"},"idle_minutes":{"type":"integer"}}},"ActivityRow":{"type":"object","description":"Minutes and input counts per member and day.","properties":{"member_id":{"type":"integer"},"date":{"type":"string","format":"date"},"minutes":{"type":"integer"},"manual_minutes":{"type":"integer"},"idle_minutes":{"type":"integer"},"activity":{"type":"object","description":"Input counts; null means the client did not report that counter.","properties":{"total":{"type":"integer","nullable":true},"mouse_moves":{"type":"integer","nullable":true},"clicks":{"type":"integer","nullable":true},"scrolls":{"type":"integer","nullable":true},"key_presses":{"type":"integer","nullable":true}}}}},"Alert":{"type":"object","description":"An activity review window: a stretch of time flagged for human review. Severity only, never the detector detail.","properties":{"alert_id":{"type":"integer"},"member_id":{"type":"integer"},"severity":{"type":"string","enum":["watch","low","elevated","high"]},"from":{"type":"integer"},"to":{"type":"integer"},"date":{"type":"string","format":"date"},"status":{"type":"string","enum":["open","resolved"]}}},"FaceCheck":{"type":"object","description":"A face verification outcome. Verdict only.","properties":{"check_id":{"type":"integer"},"member_id":{"type":"integer"},"employment_id":{"type":"integer"},"result":{"type":"string","enum":["pass","fail"]},"at":{"type":"integer"}}},"Hook":{"type":"object","properties":{"id":{"type":"integer"},"kind":{"type":"string"},"label":{"type":"string"},"host":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"disabled_at":{"type":"string","nullable":true},"disabled_reason":{"type":"string","nullable":true},"failure_streak":{"type":"integer"},"last_delivery_at":{"type":"string","nullable":true},"last_status":{"type":"integer","nullable":true},"created":{"type":"string"},"created_via":{"type":"string"},"revoked_at":{"type":"string","nullable":true}}},"Event":{"type":"object","description":"The webhook envelope. Verify X-Screenish-Signature = sha256=HMAC_SHA256(secret, X-Screenish-Timestamp + \".\" + raw body).","properties":{"id":{"type":"string","example":"evt_9dc051d1441de588b9154160"},"event":{"type":"string"},"occurred_at":{"type":"integer"},"account_id":{"type":"integer"},"data":{"type":"object"}}}}},"paths":{"/me":{"get":{"summary":"The account this key belongs to","security":[{"bearerAuth":[]}],"responses":[{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Account"}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]}},"/members":{"get":{"summary":"Team members","parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["active","invited","deactivated","all"],"default":"active"}}],"responses":[{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Member"}},"meta":{"type":"object","properties":{"total":{"type":"integer"}}}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]}},"/projects":{"get":{"summary":"Projects and their assigned members","parameters":[],"responses":[{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"meta":{"type":"object","properties":{"total":{"type":"integer"}}}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]}},"/time-entries":{"get":{"summary":"10-minute entries, paginated","parameters":[{"name":"from","in":"query","schema":{"type":"string"},"description":"Start, unix seconds or YYYY-MM-DD in the account time zone. Default: 7 days ago."},{"name":"to","in":"query","schema":{"type":"string"},"description":"End (exclusive), unix seconds or YYYY-MM-DD. Default: now. At most 92 days after \"from\"."},{"name":"member_id","in":"query","schema":{"type":"integer"},"description":"Only this member."},{"name":"project_id","in":"query","schema":{"type":"integer"},"description":"Only this project."},{"name":"approved","in":"query","schema":{"type":"string","enum":["1","0","all"],"default":"all"}},{"name":"include","in":"query","schema":{"type":"string","enum":["notes"]},"description":"Add the free-text notes field."},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","default":50,"maximum":200}}],"responses":[{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Entry"}},"meta":{"type":"object","properties":{"total":{"type":"integer"},"page":{"type":"integer"},"per_page":{"type":"integer"},"from":{"type":"integer"},"to":{"type":"integer"},"timezone":{"type":"string"}}}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]},"post":{"summary":"Create manual time (write scope)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["member_id","project_id","started_at","minutes"],"properties":{"member_id":{"type":"integer"},"project_id":{"type":"integer"},"started_at":{"type":"integer","description":"unix seconds, rounded down to 10 minutes"},"minutes":{"type":"integer","description":"multiple of 10, at most 600"},"notes":{"type":"string"}}}}}},"responses":[{"description":"Created; overlapping slots are skipped and counted in meta.skipped_overlapping"},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"},{"description":"Member not active in this account, or not assigned to the project"}]}},"/timesheets":{"get":{"summary":"Minutes per member, project and day","parameters":[{"name":"from","in":"query","schema":{"type":"string"},"description":"Start, unix seconds or YYYY-MM-DD in the account time zone. Default: 7 days ago."},{"name":"to","in":"query","schema":{"type":"string"},"description":"End (exclusive), unix seconds or YYYY-MM-DD. Default: now. At most 92 days after \"from\"."},{"name":"member_id","in":"query","schema":{"type":"integer"},"description":"Only this member."},{"name":"project_id","in":"query","schema":{"type":"integer"},"description":"Only this project."},{"name":"approved","in":"query","schema":{"type":"string","enum":["1","0","all"],"default":"1"}},{"name":"format","in":"query","schema":{"type":"string","enum":["json","csv"],"default":"json"},"description":"csv returns a file; see preset."},{"name":"preset","in":"query","schema":{"type":"string","enum":["generic","qbtime","feed"],"default":"generic"},"description":"CSV layout: generic (hours as decimals), qbtime (QuickBooks Time timesheet import), feed (ids and names)."}],"responses":[{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TimesheetRow"}},"meta":{"type":"object","properties":{"total":{"type":"integer"},"from":{"type":"integer"},"to":{"type":"integer"},"timezone":{"type":"string"},"approved":{"type":"string"}}}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]}},"/activity":{"get":{"summary":"Minutes and input counts per member and day","parameters":[{"name":"from","in":"query","schema":{"type":"string"},"description":"Start, unix seconds or YYYY-MM-DD in the account time zone. Default: 7 days ago."},{"name":"to","in":"query","schema":{"type":"string"},"description":"End (exclusive), unix seconds or YYYY-MM-DD. Default: now. At most 92 days after \"from\"."},{"name":"member_id","in":"query","schema":{"type":"integer"},"description":"Only this member."}],"responses":[{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ActivityRow"}},"meta":{"type":"object","properties":{"total":{"type":"integer"},"from":{"type":"integer"},"to":{"type":"integer"},"timezone":{"type":"string"}}}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]}},"/alerts":{"get":{"summary":"Activity review windows (severity and time only)","parameters":[{"name":"from","in":"query","schema":{"type":"string"},"description":"Start, unix seconds or YYYY-MM-DD in the account time zone. Default: 7 days ago."},{"name":"to","in":"query","schema":{"type":"string"},"description":"End (exclusive), unix seconds or YYYY-MM-DD. Default: now. At most 92 days after \"from\"."},{"name":"member_id","in":"query","schema":{"type":"integer"},"description":"Only this member."},{"name":"status","in":"query","schema":{"type":"string","enum":["open","resolved","all"],"default":"open"}}],"responses":[{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Alert"}},"meta":{"type":"object","properties":{"total":{"type":"integer"}}}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]}},"/face-checks":{"get":{"summary":"Face verification verdicts","parameters":[{"name":"from","in":"query","schema":{"type":"string"},"description":"Start, unix seconds or YYYY-MM-DD in the account time zone. Default: 7 days ago."},{"name":"to","in":"query","schema":{"type":"string"},"description":"End (exclusive), unix seconds or YYYY-MM-DD. Default: now. At most 92 days after \"from\"."},{"name":"member_id","in":"query","schema":{"type":"integer"},"description":"Only this member."},{"name":"result","in":"query","schema":{"type":"string","enum":["fail","pass","all"],"default":"fail"}}],"responses":[{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FaceCheck"}},"meta":{"type":"object","properties":{"total":{"type":"integer"}}}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]}},"/events":{"get":{"summary":"Webhook event catalogue","responses":{"200":{"description":"OK"}}}},"/hooks":{"get":{"summary":"Registered webhooks","responses":[{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Hook"}}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]},"post":{"summary":"Register a webhook (write scope, REST Hooks)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["target_url","events"],"properties":{"target_url":{"type":"string","description":"https, public address (the REST Hooks name; \"url\" is accepted too)"},"events":{"type":"array","items":{"type":"string"}},"label":{"type":"string"}}}}}},"responses":[{"description":"Created. The response carries signing_secret once.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Hook"},"signing_secret":{"type":"string"}}}}}},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"}]}},"/hooks/{id}":{"delete":{"summary":"Remove a webhook (write scope)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":[{"description":"Removed"},{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},{"description":"Missing, unknown or revoked key"},{"description":"Not enabled, no active subscription, address not allowed, or insufficient scope"},{"description":"Rate limit reached; see Retry-After"},{"description":"Not in this account"}]}}},"webhooks":{"event":{"post":{"summary":"Delivery of any subscribed event","description":"Headers: X-Screenish-Event, X-Screenish-Delivery, X-Screenish-Timestamp, X-Screenish-Signature. Answer 2xx within 10 seconds; failures are retried after 1m, 5m, 30m, 2h and 6h, then abandoned. Events: time.started, time.stopped, entry.recorded, integrity.alert, face.check_failed, member.invited, member.deactivated, member.restored, approval.changed, summary.daily.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"responses":{"200":{"description":"Acknowledged"}}}}}}