/v1/mobile/calls/syncUpload calls from the phone
Batches of the phone’s call log (≤ 500), idempotent on the phone and its CallLog id — the app re-sends an overlap every time. Only calls provably on a work SIM are kept (unknown SIMs follow the company policy); dates before the backfill floor or in the future are refused; with `mobile.tracking_scope = crm_only` only CRM numbers land. Accepts the member’s app session or the phone’s device token. 401 = the phone was removed (drop the credentials) · 409 = register the phone again.
Access: Signed-in members only (web or Android session) — not for API keys.
Request body
device_idrequired- string
The installation id the phone registered with.
callsrequired- array of SyncCall
app_version- string or null
device_now- integer or null
The phone’s clock (epoch ms) when it sent the batch: call dates of a phone more than 2 minutes off are corrected.
want_notifications- boolean
Accepted for older builds; notifications are polled.
Response · 200
datarequired- SyncCallsResult
metarequired- object
curl -X POST 'https://api.propzolo.com/v1/mobile/calls/sync' \
-H 'Authorization: Bearer pz_live_…' \
-H 'Content-Type: application/json' \
-d '{"device_id":"string","calls":[{"device_call_id":"string","number":"string","name":"string","type":0,"date":0,"duration":0,"sim_slot":0,"subscription_id":"string","sim_label":"string","sim_number":"string","attempt_ms":null,"net":null}],"app_version":"string","device_now":0,"want_notifications":true}'{
"data": {
"received": 0,
"inserted": 0,
"duplicates": 0,
"matched": 0,
"unmatched": 0,
"skipped": 0,
"skipped_by": {
"personal_sim": 0,
"unknown_sim": 0,
"invalid_date": 0,
"before_backfill": 0,
"not_in_crm": 0,
"other_device": 0
},
"stored": 0,
"tracking_disabled": true,
"pending_outcomes": [
{
"id": "cmusrceel0000q7kaafxqi1om",
"device_call_id": "string",
"direction": "string",
"started_at": "2026-10-06T05:30:00.000Z",
"duration_sec": 0,
"lead": {
"id": "cmusrceel0000q7kaafxqi1om",
"ref": "string",
"name": "string"
},
"client": {
"id": "cmusrceel0000q7kaafxqi1om",
"client_name": "string"
}
}
],
"server_time": "2026-10-06T05:30:00.000Z",
"clock_offset_ms": 0
},
"meta": {}
}Errors
401No valid session or API key (missing, expired or revoked).403The caller lacks the permission, API-key scope or support grant this operation needs.409A unique value already exists, a concurrent change won, or the Idempotency-Key is still in use or was sent with a different request.422Invalid input; `error.fields` maps field paths to messages.429Too many requests; retry after the Retry-After header.500Unexpected error; quote `error.request_id` to support.

