Skip to content

Machine Registrations

Paginated extraction of machine registrations for your machines — completed usage records for the machines your company owns, including registrations made on other companies’ projects (e.g. when your machine is rented out and used on a customer’s site). This is how machine owners feed utilization and billing systems without manual reports.

GET /v1/machine-registrations
  • Test: https://core-api.ditio.dev/reporting/v1/machine-registrations
  • Production: https://core-api.ditio.app/reporting/v1/machine-registrations
  • Scope: reportingapiv1 (same as Image Extraction)
  • Returns: a data array and a continuationToken for paging
ModeTriggerOrdered byUse for
FullFromDateTime + ToDateTime set (or neither)stop time (when usage ended)Initial load / re-sync of a work-date window
IncrementalModifiedSince setmodification timeCatching new and edited registrations since the last sync

Use incremental sync to stay up to date: it returns any registration created or changed since ModifiedSince, including edits to older records (which a date-window query would miss).

ParameterTypeRequiredDescription
FromDateTimedatetimeNoFull sync: start of the stop-time window. Must be set together with ToDateTime.
ToDateTimedatetimeNoFull sync: end of the stop-time window.
ModifiedSincedatetimeNoIncremental sync: return records modified at/after this instant.
ModifiedBeforedatetimeNoOptional upper bound for incremental sync. Requires ModifiedSince; must be greater than it.
ChunkLimitintNoTarget page size. Default 2500, range 1–10000. A page may slightly exceed it so that records sharing one exact timestamp are never split across pages.
ContinuationTokenstringNoOpaque token from a previous response — echo it back verbatim to get the next page.

Identical to the shared pattern (see Pagination):

  1. Call the endpoint with your initial filter (no ContinuationToken).
  2. If the response’s continuationToken is non-empty, pass it verbatim as ContinuationToken on the next call (keep all other parameters the same).
  3. Repeat until continuationToken is absent/empty.

Deleted registrations are reported during incremental sync as entries with isDeleted: true; upsert/delete by id on your side.

Because your machine may be used on another company’s project, a registration can involve people from a company other than yours. When that is the case, personal identifiers belonging to the other company are obscured: the operator’s name and id (driverName, driverId) and the created-by/modified-by fields are returned empty. Non-personal utilization data is always returned: machine, project (company name, project name/number), start/stop time, quantity, and the operator’s company (driverCompanyName) — so you can see which customer used the machine, without their employees’ personal data.

FieldDescription
idRegistration id
machineId, machineName, machineTypeName, resourceNumberThe machine
projectCompanyName, projectName, projectNumber, projectExternalNumberWhere it was used
driverCompanyNameThe operator’s company (always returned)
driverName, driverIdThe operator (obscured cross-company)
startDateTime, stopDateTime, qtyUsage
approvedApproval state
createdDateTime, modifiedDateTimeTimestamps
isDeleted, deletedDateTimeSet on deleted records during incremental sync
Terminal window
export DITIO_REPORTING_BASE="https://core-api.ditio.dev/reporting" # test
curl -s -G "$DITIO_REPORTING_BASE/v1/machine-registrations" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "ModifiedSince=2026-07-01T00:00:00Z" \
--data-urlencode "ChunkLimit=2500"
import os
import requests
REPORTING_BASE = os.environ.get(
"DITIO_REPORTING_BASE", "https://core-api.ditio.dev/reporting"
)
headers = {"Authorization": f"Bearer {token}"}
params = {"ModifiedSince": "2026-07-01T00:00:00Z", "ChunkLimit": 2500}
while True:
page = requests.get(
f"{REPORTING_BASE}/v1/machine-registrations",
headers=headers, params=params,
).json()
for registration in page["data"]:
if registration.get("isDeleted"):
delete_locally(registration["id"])
else:
upsert_locally(registration)
continuation = page.get("continuationToken")
if not continuation:
break
params["ContinuationToken"] = continuation