jeCheckDevelopers
Get an API key
Developers/Concepts

Pagination & sync

List endpoints are paginated and return a meta object next to data:

{
  "data": [ { "uuid": "…" }, { "uuid": "…" } ],
  "meta": { "page": 1, "per_page": 25, "total": 312, "has_more": true }
}
Parameter Default Max
page 1 — Page number, from 1
per_page 25 100 Items per page

Fetch everything

import os, requests

def fetch_all(path, **params):
    page = 1
    while True:
        r = requests.get(
            f"https://app.jecheck.io/api/ext/v1{path}",
            headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
            params={**params, "page": page, "per_page": 100},
        )
        r.raise_for_status()
        body = r.json()
        yield from body["data"]
        if not body["meta"]["has_more"]:
            break
        page += 1

tasks = list(fetch_all("/tasks", status="in_progress"))

Incremental sync with updated_since

Most lists accept updated_since (ISO 8601 timestamp). Store the time of your last successful sync and ask only for what changed:

curl "https://app.jecheck.io/api/ext/v1/tasks?updated_since=2026-11-03T09:00:00%2B05:00&sort=updated_desc&per_page=100" \
  -H "Authorization: Bearer $JECHECK_TOKEN"

Recommended loop:

  1. Remember sync_started = now() before the request.
  2. Page through updated_since=<last_sync>.
  3. Upsert every record by its id / uuid.
  4. Save last_sync = sync_started (not the time you finished — that avoids gaps).

Deleted records disappear from lists. To detect deletions run a periodic full sync of ids.

Filters

Filters are query parameters. Arrays can be passed either repeated or comma-separated — these are equivalent:

/tasks?status[]=new&status[]=in_progress
/tasks?status=new,in_progress

Dates are YYYY-MM-DD; moments are ISO 8601 with a time-zone offset. Analytics endpoints take period (7d, 30d, 90d, 12m or custom with from/to).