---
title: "The device's check-in: alive, capturing, and the policy when it moved"
method: POST
path: "/v1/device/check-in"
tags: ["devices"]
---

# The device's check-in: alive, capturing, and the policy when it moved

`POST /v1/device/check-in`

## Request

- Base URL: `https://api.sixminute.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.sixminute.ai/v1/device/check-in`
- Auth: HTTP bearer

A device route, as the context upload; `Origin` is refused. Sent every 60 seconds while the app runs and once at quit. The credential's call stamps the device's last call and version. Answers the firm's policy with its `policy_version` when the device's differs, else `policy: null`. A check-in with `open_days: true` is answered `open_days`, the person's open days on this device for the timesheet pet: empty where none is open or the pet is off for them. A check-in that does not ask is answered without it.

## Request body

- object
  - `seq` integer, required
  - `now` string, date-time, required
  - `zone` string, required
  - `capturing` boolean, required
  - `counters` object[], required
    - `day` string, required
    - `samples_received` integer, required
    - `observations_written` integer, required
    - `snapshots_written` integer, required
    - `samples_idle` integer, required
    - `samples_excluded` integer, required
    - `samples_empty` integer, required
    - `samples_out_of_order` integer, required
    - `samples_late` integer, required
    - `marks_late` integer, required
    - `samples_dropped` integer, required
    - `browser_breaker_trips` integer, required
    - `clock_steps` integer, required
    - `active_ms` integer, required
    - `idle_ms` integer, required
    - `excluded_ms` integer, required
    - `locked_ms` integer, required
    - `outbox_dropped` integer, required
    - `outbox_aged_out` integer, required
    - `outbox_signed_out` integer, required
    - `sampler_dropped` object, required
      - `channel_full` integer, required
      - `too_long` integer, required
      - `unreadable` integer, required
    - `sampler_restarts` integer, required
    - `ended` boolean
    - `app_ms` integer
    - `app_sessions` integer
  - `version` string, required
  - `platform` 'windows' | 'macos', required
  - `permissions` object, nullable, required
    - `accessibility` 'granted' | 'denied' | 'unknown', required
    - `automation` 'granted' | 'denied' | 'unknown', required
    - `screen` 'granted' | 'denied' | 'unknown', required
  - `sampler` 'starting' | 'ok' | 'failing' | 'refused', required
  - `update` 'current' | 'available' | 'required', required
  - `policy_version` string, nullable, required
  - `events` union[], required
    - union
      - object
        - `id` string, uuid, required
        - `at` string, date-time, required
        - `name` 'capture.started', required
        - `trigger` 'button' | 'tray' | 'always_on' | 'launch' | 'sign_in', required
      - object
        - `id` string, uuid, required
        - `at` string, date-time, required
        - `name` 'capture.stopped', required
        - `trigger` 'button' | 'tray' | 'sign_out', required
      - object
        - `id` string, uuid, required
        - `at` string, date-time, required
        - `name` 'user.signed_out', required
        - `trigger` 'menu' | 'tray' | 'revoked', required
      - object
        - `id` string, uuid, required
        - `at` string, date-time, required
        - `name` 'permission.changed', required
        - `permission` 'accessibility' | 'automation' | 'screen', required
        - `granted` boolean, required
      - object
        - `id` string, uuid, required
        - `at` string, date-time, required
        - `name` 'update.failed', required
        - `stage` 'check' | 'download' | 'verify' | 'install', required
        - `reason` 'offline' | 'timeout' | 'http_4xx' | 'http_5xx' | 'manifest' | 'signature' | 'download' | 'install' | 'other'
      - object
        - `id` string, uuid, required
        - `at` string, date-time, required
        - `name` 'setting.changed', required
        - `setting` 'always_on' | 'launch_at_login' | 'theme' | 'exclusions', required
      - object
        - `id` string, uuid, required
        - `at` string, date-time, required
        - `name` 'raw_archive.switched', required
        - `on` boolean, required
        - `reason` 'person' | 'expired' | 'signed_out' | 'tenant_changed' | 'not_allowed' | 'refused' | 'disk_low', required
  - `open_days` true

## Response `200`

The policy, when the device's is not current.

- object
  - `policy` object, nullable, required
    - `excluded_bundles` string[], required
    - `raw_archive` boolean, required
    - `swallow_short_pauses` boolean, nullable, required
    - `unit_minutes` integer, required
    - `time_zone` string, nullable
    - `context_retention_days` integer, required
    - `minimum_version` string, nullable, required
    - `always_on` 'member_choice' | 'enforced'
    - `policy_version` string, required
  - `open_days` string[]

## Other responses

- `400`: The body, query or path did not validate; `errors` lists the fields.
- `401`: No bearer token, or one that does not verify or has expired.
- `403`: The token verified but may not do this: no organisation, not provisioned, wrong role, or a device problem.

## Changes

- **2026-11-04** `605577eadc10`: 2 info
  - added the new optional request property `open_days`
  - added the optional property `open_days` to the response with the `200` status

[Operation history](https://skmtc.dev/sixminute/apis/sixminute-api/changes/v1/device/check-in/post.md)

---

[API](https://skmtc.dev/sixminute/apis/sixminute-api.md) - [All operations](https://skmtc.dev/sixminute/apis/sixminute-api/llms.txt) - [OpenAPI document](https://skmtc.dev/sixminute/apis/sixminute-api/revisions/605577eadc10?raw)
