{"openapi":"3.0.3","info":{"title":"HealthWizard Sync API","description":"docs/api-contract.md's Sync Endpoints (push/pull/snapshot/conflicts/status) — explicit domain workflows, not generic CRUD.","version":"1.0.0"},"paths":{"/api/v1/care-share/{guid}/summary":{"get":{"summary":"Aggregate summary card for one consented patient — docs/web/doctor-portal-plan.md W3d","description":"Doctor session only. {guid} is the patient's health.user_profile guid (as returned by GET /api/v1/care-share). Needs an active doctor_patient_link AND an unrevoked/unexpired patient_data_share with scope 'summary' or 'full_record'; any other caller gets 404, identical to an unknown guid.","operationId":"careShareSummary","tags":["Care Share"],"parameters":[{"name":"guid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The patient's summary card","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientSummary"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Caller is not a doctor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown patient, or the caller is not linked-and-summary-consented — same response either way","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/caregiver/alerts":{"get":{"summary":"Your alert-delivery history as a caregiver — docs/web/caregiver-portal-plan.md W2c","description":"Every health.notification_event delivered to you as recipient (reminders escalated to you, safety alerts), across all patients who escalate to you, newest first, capped at 200. Scoped strictly to rid_user_profile_recipient = you.","operationId":"caregiverListAlerts","tags":["Caregiver"],"responses":{"200":{"description":"The caller's alert history","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaregiverAlertsResponse"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/caregiver/dependents":{"get":{"summary":"List the login-less dependents you manage","description":"By default, every enabled health.caregiver link where you are the caregiver and the linked profile has rid_login NULL. Adult patients who invited you are on GET /api/v1/caregiver/patients instead.","operationId":"caregiverListDependents","tags":["Caregiver"],"parameters":[{"name":"include_disabled","in":"query","description":"Set to true to also include dependents you previously disabled, e.g. to re-enable one.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"The caller's dependents","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DependentProfilesResponse"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]},"post":{"summary":"Create a login-less dependent profile you manage","description":"One transaction provisions health.user_profile (rid_login NULL), entity.actor + entity.actor_duty('patient') with no entity.actor_login, and a claimed health.caregiver link (can_view + can_edit) back to the caller. Afterwards, sync push/pull with acting_profile_guid set to dependent_profile_guid reaches the dependent with no accept step.","operationId":"caregiverCreateDependent","tags":["Caregiver"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DependentProfileRequest"}}}},"responses":{"200":{"description":"The new dependent and its caregiver link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DependentProfileResponse"}}}},"400":{"description":"Missing name, invalid relationship, or the caller has no health.user_profile yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/caregiver/dependents/{guid}/disable":{"post":{"summary":"Soft-delete a dependent you manage","description":"{guid} is the dependent's health.user_profile guid. Marks both the health.caregiver link and the health.user_profile disabled. A caller who does not manage that dependent through an enabled link gets 404, identical to an unknown guid.","operationId":"caregiverDisableDependent","tags":["Caregiver"],"parameters":[{"name":"guid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Disabled"},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown dependent, or the caller does not manage it — same response either way","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/caregiver/dependents/{guid}/enable":{"post":{"summary":"Reverse a previous dependent soft-delete","description":"{guid} is the dependent's health.user_profile guid. Marks both the health.caregiver link and the health.user_profile enabled again. A caller who does not manage that dependent gets 404, identical to an unknown guid.","operationId":"caregiverEnableDependent","tags":["Caregiver"],"parameters":[{"name":"guid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Enabled"},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown dependent, or the caller does not manage it — same response either way","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/caregiver/patients":{"get":{"summary":"List patients who have linked you as a caregiver — docs/web/caregiver-portal-plan.md W2a","description":"Every enabled, claimed health.caregiver row where you are the caregiver. can_view is reported, not filtered — a can_view=false row still lists (as 'no data access'). An unclaimed/disabled row, or a login with no user_profile, yields nothing.","operationId":"caregiverListPatients","tags":["Caregiver"],"responses":{"200":{"description":"The caller's linked patients","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaregiverPatientsResponse"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/caregiver/patients/{guid}/summary":{"get":{"summary":"At-a-glance summary card for one linked patient — docs/web/caregiver-portal-plan.md W2c","description":"Caregiver session. {guid} is the patient's health.user_profile guid (as returned by GET /api/v1/caregiver/patients). Needs an enabled health.caregiver row with can_view; any other caller gets 404, identical to an unknown guid. Same card shape as the doctor portal's summary.","operationId":"caregiverPatientSummary","tags":["Caregiver"],"parameters":[{"name":"guid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The patient's summary card","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientSummary"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown patient, or the caller is not linked with can_view — same response either way","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/caregiver/{guid}/accept":{"post":{"summary":"Claim a caregiver invite by matching your own login email","description":"{guid} is the inviting health.caregiver row's own guid. Sets rid_user_profile_caregiver to the caller's profile — B5 task 14's consent-grant flow.","operationId":"caregiverAcceptInvite","tags":["Caregiver"],"parameters":[{"name":"guid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptCaregiverInviteResponse"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown invite, already claimed, disabled, or the caller's login email doesn't match — same response either way","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/documents":{"post":{"summary":"Upload a document (blob + metadata) — docs/backend/plan.md B6 task 17","description":"multipart/form-data. File bytes never travel as a JSON sync payload; the stored org.filepointer id is server-internal and never returned — every client-facing identity is the returned document guid.","operationId":"documentUpload","tags":["Documents"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"captured_at":{"type":"string","format":"date-time"},"document_type":{"type":"string","description":"prescription|lab_result|referral|insurance|discharge|other (free text, not enforced)"},"file":{"type":"string","format":"binary"},"note":{"type":"string"},"title":{"type":"string"}},"required":["file","title"]}}}},"responses":{"201":{"description":"Stored","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMetadata"}}}},"400":{"description":"Missing title/file, oversized file, or unsupported content type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/documents/{guid}":{"get":{"summary":"Download a document's stored bytes — docs/backend/plan.md B6 task 17","operationId":"documentDownload","tags":["Documents"],"parameters":[{"name":"guid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The stored file bytes, Content-Type/Content-Disposition set from storage"},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown document, or it belongs to another account — same response either way","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/medicine-identifications":{"post":{"summary":"Identify a medicine from a package photo — docs/api-contract.md 'Medicine photo identification' (Issue #98 / Phase 4)","description":"multipart/form-data. Dedicated authenticated workflow — never generic sync, never creates or changes a medication. Image bytes and OCR text are excluded from all logs, metrics and error strings. client_capture_guid is a UUID v4 idempotency key: a replay returns the same result shape.","operationId":"medicineIdentify","tags":["Medicine"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"barcode_values":{"type":"string","description":"JSON array of on-device barcode strings"},"client_capture_guid":{"type":"string","format":"uuid","description":"UUID v4 idempotency key"},"image":{"type":"string","format":"binary","description":"One package image ≤ 20 MiB; image/jpeg|png|webp|heic"},"ocr_text":{"type":"string","description":"On-device package text ≤ 64 KiB"}},"required":["client_capture_guid"]}}}},"responses":{"200":{"description":"Ranked catalogue candidates + status (matched|ambiguous|unreadable|catalogue_unavailable)"},"400":{"description":"validation — bad client_capture_guid, no usable input, oversized ocr_text","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"unsupported_media — image is not JPEG/PNG/WebP/HEIC","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"retryable — identification temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/sync/conflicts":{"get":{"summary":"List the caller's pending sync conflicts","description":"Every still-pending conflict for the caller's own devices, oldest first, with both client and server payloads.","operationId":"syncListConflicts","tags":["Sync"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConflictsResponse"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/sync/conflicts/{guid}/resolve":{"post":{"summary":"Explicitly resolve a pending sync conflict","description":"{guid} is the conflict's own mobilesync.conflict.guid, not the entity's guid.","operationId":"syncResolveConflict","tags":["Sync"],"parameters":[{"name":"guid","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictResolveRequest"}}}},"responses":{"200":{"description":"Resolved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictResolveResponse"}}}},"400":{"description":"Invalid resolution, missing merged_payload, or already resolved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown conflict, or it belongs to another account — same response either way","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/sync/pull":{"get":{"summary":"Incremental owner-scoped changes and tombstones since cursor","operationId":"syncPull","tags":["Sync"],"parameters":[{"name":"cursor","in":"query","description":"Opaque cursor from a previous pull/snapshot response; omit to start from the beginning","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max rows this page; default 200, max 500","schema":{"type":"integer"}},{"name":"acting_profile_guid","in":"query","description":"Omit to pull your own data. Set to a patient's health.user_profile.guid to pull that patient's data instead as a linked caregiver with can_view — B5 task 14.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of changes; loop until has_more is false","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PullResponse"}}}},"400":{"description":"Malformed cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"acting_profile_guid is not an authorized caregiver grant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/sync/push":{"post":{"summary":"Push a bounded, ordered, idempotent batch of client operations","operationId":"syncPush","tags":["Sync"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushRequest"}}}},"responses":{"200":{"description":"Per-operation results — no ambiguous partial success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushResponse"}}}},"400":{"description":"Malformed request or oversized batch, rejected whole","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"device_guid registered to a different account/disabled, or acting_profile_guid is not an authorized caregiver grant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/sync/snapshot":{"get":{"summary":"Transactionally consistent full restore, plus a cursor matching that point","operationId":"syncSnapshot","tags":["Sync"],"responses":{"200":{"description":"Every one of the caller's own rows, as of one consistent instant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotResponse"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/sync/status":{"get":{"summary":"Pending conflict count and server time","operationId":"syncStatus","tags":["Sync"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"401":{"description":"No active session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"BearerAuth":[]}]}}},"components":{"schemas":{"AcceptCaregiverInviteResponse":{"type":"object","properties":{"accepted_at":{"type":"string","format":"date-time"},"caregiver_guid":{"type":"string"}}},"CaregiverAlert":{"type":"object","description":"One health.notification_event the caller received as recipient (docs/web/caregiver-portal-plan.md W2c).","properties":{"acknowledged_at":{"type":"string","format":"date-time"},"channel":{"type":"string","description":"push|sms|email|in_app"},"created_at":{"type":"string","format":"date-time"},"delivered_at":{"type":"string","format":"date-time"},"delivery_status":{"type":"string","description":"queued|sent|failed|opened|snoozed"},"detail":{"type":"string"},"guid":{"type":"string"},"kind":{"type":"string","description":"safety_alert | reminder"},"occurred_at":{"type":"string","format":"date-time"},"patient_guid":{"type":"string"},"patient_name":{"type":"string"},"severity":{"type":"string","description":"safety_alert only: low|medium|high|critical"},"title":{"type":"string"}}},"CaregiverAlertsResponse":{"type":"object","properties":{"alerts":{"type":"array","items":{"$ref":"#/components/schemas/CaregiverAlert"}}}},"CaregiverPatient":{"type":"object","description":"One patient who has linked the caller as a caregiver (docs/web/caregiver-portal-plan.md W2a).","properties":{"can_edit":{"type":"boolean"},"can_receive_alerts":{"type":"boolean"},"can_view":{"type":"boolean"},"caregiver_guid":{"type":"string"},"linked_at":{"type":"string","format":"date-time"},"patient_guid":{"type":"string"},"patient_name":{"type":"string"},"patient_profile_id":{"type":"integer"},"relationship":{"type":"string"}}},"CaregiverPatientsResponse":{"type":"object","properties":{"patients":{"type":"array","items":{"$ref":"#/components/schemas/CaregiverPatient"}}}},"Change":{"type":"object","properties":{"action":{"type":"string","enum":["upsert","delete"]},"entity":{"type":"string"},"entity_guid":{"type":"string"},"payload":{"type":"object","description":"Omitted for a delete"},"updatedat":{"type":"string","format":"date-time"}}},"ConflictPayload":{"type":"object","properties":{"server_payload":{"type":"object"},"server_updatedat":{"type":"string","format":"date-time"}}},"ConflictResolveRequest":{"type":"object","properties":{"merged_payload":{"type":"object","description":"Required only when resolution is merged"},"resolution":{"type":"string","enum":["client_won","server_won","merged","discarded"]}},"required":["resolution"]},"ConflictResolveResponse":{"type":"object","properties":{"conflict_guid":{"type":"string"},"resolution":{"type":"string"},"resolved_at":{"type":"string","format":"date-time"}}},"DependentProfile":{"type":"object","description":"One login-less profile the caller manages through an enabled health.caregiver link.","properties":{"can_edit":{"type":"boolean"},"caregiver_guid":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"dependent_profile_guid":{"type":"string"},"disabled":{"type":"boolean"},"email":{"type":"string"},"name":{"type":"string"},"relationship":{"type":"string"}}},"DependentProfileRequest":{"type":"object","description":"Create a login-less dependent profile (child/elderly) the caller manages.","properties":{"display_name":{"type":"string"},"email":{"type":"string","description":"optional; lets a later signup with this address auto-link (claim) this dependent profile"},"first_name":{"type":"string"},"last_name":{"type":"string"},"locale":{"type":"string","description":"optional; defaults to en-ZA"},"operation_guid":{"type":"string","description":"Caller-generated; a retried offline create with the same value returns the original profile instead of creating a duplicate."},"relationship":{"type":"string","description":"optional; caller's relationship to the dependent: spouse|parent|child|sibling|friend|doctor|nurse|professional_caregiver|other"},"timezone":{"type":"string","description":"optional IANA id; defaults to Africa/Johannesburg"}},"required":["operation_guid"]},"DependentProfileResponse":{"type":"object","properties":{"caregiver_guid":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"dependent_profile_guid":{"type":"string"}}},"DependentProfilesResponse":{"type":"object","properties":{"dependents":{"type":"array","items":{"$ref":"#/components/schemas/DependentProfile"}}}},"DocumentMetadata":{"type":"object","properties":{"captured_at":{"type":"string","format":"date-time"},"content_type":{"type":"string"},"document_type":{"type":"string"},"file_size":{"type":"integer"},"filename":{"type":"string"},"guid":{"type":"string"},"note":{"type":"string"},"title":{"type":"string"}}},"Error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}},"ListConflictsResponse":{"type":"object","properties":{"conflicts":{"type":"array","items":{"$ref":"#/components/schemas/PendingConflict"}}}},"OperationResult":{"type":"object","properties":{"conflict":{"$ref":"#/components/schemas/ConflictPayload"},"entity":{"type":"string"},"entity_guid":{"type":"string"},"error_code":{"type":"string","enum":["unknown_entity","validation","append_only_immutable","ref_not_found","unsupported_field"]},"error_message":{"type":"string"},"operation_guid":{"type":"string"},"status":{"type":"string","enum":["applied","conflict","rejected"]}}},"PatientSummary":{"type":"object","description":"Doctor-facing at-a-glance card for one consented patient (docs/web/doctor-portal-plan.md W3d). Requires a 'summary' or 'full_record' patient_data_share.","properties":{"active_medications":{"type":"integer"},"age_years":{"type":"integer"},"blood_type":{"type":"string"},"date_of_birth":{"type":"string","format":"date"},"diabetes_type":{"type":"string"},"height_cm":{"type":"number"},"latest_glucose":{"type":"object","description":"measured_at, value, unit, context — omitted when there are no readings"},"latest_insulin":{"type":"object","description":"administered_at, dose_units, dose_type, status — omitted when there are no doses"},"next_appointment":{"type":"object","description":"scheduled_at, appointment_type, status, location — the next scheduled/confirmed appointment, omitted when none"},"patient_guid":{"type":"string"},"patient_name":{"type":"string"},"sex":{"type":"string"},"vitals":{"type":"array","description":"Latest reading per vital_type","items":{"type":"object","properties":{"measured_at":{"type":"string","format":"date-time"},"unit":{"type":"string"},"value":{"type":"string"},"vital_type":{"type":"string"}}}},"weight_kg":{"type":"number"}}},"PendingConflict":{"type":"object","properties":{"client_payload":{"type":"object","description":"The payload the client last sent"},"client_updatedat":{"type":"string","format":"date-time"},"createdat":{"type":"string","format":"date-time"},"entity_guid":{"type":"string"},"entity_table":{"type":"string"},"guid":{"type":"string"},"server_payload":{"type":"object","description":"The server's current view of the row"},"server_updatedat":{"type":"string","format":"date-time"}}},"PullResponse":{"type":"object","properties":{"changes":{"type":"array","items":{"$ref":"#/components/schemas/Change"}},"has_more":{"type":"boolean"},"next_cursor":{"type":"string","description":"Opaque; pass back verbatim to resume"},"server_time_utc":{"type":"string","format":"date-time"}}},"PushOperation":{"type":"object","properties":{"action":{"type":"string","enum":["upsert","delete"]},"base_updatedat":{"type":"string","format":"date-time","description":"Server updatedat last seen by the client; omitted for creates"},"entity":{"type":"string","description":"Schema-qualified table name, e.g. health.blood_glucose_log"},"entity_guid":{"type":"string"},"operation_guid":{"type":"string"},"payload":{"type":"object"}},"required":["operation_guid","entity","entity_guid","action"]},"PushRequest":{"type":"object","properties":{"acting_profile_guid":{"type":"string","description":"Omit to push as yourself. Set to a patient's health.user_profile.guid to push on their behalf as a linked caregiver with can_edit — B5 task 14."},"base_cursor":{"type":"string"},"device_guid":{"type":"string"},"operations":{"type":"array","items":{"$ref":"#/components/schemas/PushOperation"}}},"required":["device_guid","operations"]},"PushResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/OperationResult"}}}},"SnapshotResponse":{"type":"object","properties":{"changes":{"type":"array","items":{"$ref":"#/components/schemas/Change"}},"cursor":{"type":"string","description":"Opaque pull cursor matching this snapshot's point"},"server_time_utc":{"type":"string","format":"date-time"}}},"StatusResponse":{"type":"object","properties":{"pending_conflicts":{"type":"integer"},"server_time_utc":{"type":"string","format":"date-time"}}}},"securitySchemes":{"BearerAuth":{"type":"http","description":"Access token from POST /api/login or /api/register","scheme":"bearer"}}},"security":[{"BearerAuth":[]}]}
