Skip to main content

HomeCareBilling API

Read and write an agency's billing records. Authenticate with an agency API key as a bearer token. Every POST made with an API key needs an Idempotency-Key header, except one that only reads (validating a claims file); each operation that needs it lists it. Rate limits, per API key unless stated: 600 requests a minute; 1200 a minute across all of one agency's keys and AI app connections; 300 writes a minute and 20000 a day, and 50000 writes a day across all of one agency's keys and AI app connections; 30 claims-file upload attempts and 120 claims-file checks an hour; and 10 requests in progress at once on each server, of which 2 may be sending a body over 1 MB. Past a limit the answer is 429 rate_limited with a Retry-After header in seconds.

Version 1 · Base URL https://www.homecarebilling.co · openapi.json · changelog

Agency

GET /api/v1/agency

The agency profile

The agency's name, address, NPI, Tax ID and claim defaults.

  • 200 The profile object
    data AgencyProfile, required
  • default An error, in the shared envelope. Error

PATCH /api/v1/agency

Change the agency profile

Sets only the fields sent. Needs agency_settings.manage (403 forbidden otherwise). An NPI or Tax ID in the wrong form or held by another agency, a blank name, a week start day other than saturday, sunday or monday, or a default_procedure_codes key other than personal_care and homemaker or a value that is no procedure code ("U2") answers 422 validation_failed naming the field. open_shifts sets the open shifts rules, only the keys sent, in the same transaction as the profile; a refused rule answers 422 naming open_shifts.<field> and saves no part of the body.

Request body (required) application/json AgencyProfileUpdate

The fields to change

  • 200 The profile object
    data AgencyProfile, required
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Agency administration

GET /api/v1/api-keys

List the agency's API keys

Live keys first, then newest first; never a secret. Needs Agency settings → View (403 forbidden otherwise).

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of keys object
    data array of object, required
    data[].created_at string
    When it was created (UTC).
    data[].created_by_id string
    The admin who created it.
    data[].id string, required
    The record's id.
    data[].last_used_at string
    Its last request (UTC).
    data[].name string, required
    The key's name.
    data[].revoked_at string
    When it was revoked (UTC).
    data[].role string, required
    What the key may do.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/api-keys

Create an API key

Settings → API keys creates one and shows its secret once. The role is mapped onto the agency's Owner and Staff roles; one the agency deleted answers 422 role_unavailable. An API key or AI connection gets 403 web_only: someone holding Agency settings → Manage does this signed in to the web app, in Settings.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The key

name string, required
A name for the integration.
role string, required
What the key may do.
  • 201 The key and its secret, once object
    data object, required
    data.created_at string
    When it was created (UTC).
    data.created_by_id string
    The admin who created it.
    data.id string, required
    The record's id.
    data.last_used_at string
    Its last request (UTC).
    data.name string, required
    The key's name.
    data.revoked_at string
    When it was revoked (UTC).
    data.role string, required
    What the key may do.
    secret string, required
    The secret, shown this once.
  • 403 Code web_only: Forbidden, as the operation's description says. Error
  • 422 Code role_unavailable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/api-keys/{id}

Revoke an API key

Settings → API keys revokes one; it stops working on its next request. An API key or AI connection gets 403 web_only: someone holding Agency settings → Manage does this signed in to the web app, in Settings.

Parameter In Required Description
id path yes
  • 200 The key object
    data object, required
    data.created_at string
    When it was created (UTC).
    data.created_by_id string
    The admin who created it.
    data.id string, required
    The record's id.
    data.last_used_at string
    Its last request (UTC).
    data.name string, required
    The key's name.
    data.revoked_at string
    When it was revoked (UTC).
    data.role string, required
    What the key may do.
  • 403 Code web_only: Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/connected-apps

List AI app connections

Live connections, newest first, as /connected-apps lists them: the agency's for a credential whose member holds agency_settings.manage, else the member's own.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of connections object
    data array of object, required
    data[].app_name string, required
    The AI app.
    data[].connected_at string
    When it was connected (UTC).
    data[].id string, required
    The record's id.
    data[].last_used_at string
    Its last request (UTC).
    data[].scopes array of string
    What it may do.
    data[].user_email string
    Their email.
    data[].user_id string, required
    The member who connected it.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

DELETE /api/v1/connected-apps/{id}

Revoke an AI app connection

Signs the app out at once, as /connected-apps does. A member revokes their own; a member holding agency_settings.manage any of the agency's. Any other id answers 404; one already revoked 422 already_revoked.

Parameter In Required Description
id path yes
  • 200 The revoked connection object
    data object, required
    data.id string, required
    The record's id.
    data.revoked_at string, required
    When it was revoked (UTC).
  • 404 Not Found, as the operation's description says. Error
  • 422 Code already_revoked: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/invitations

List pending invitations

Invitations not yet accepted, revoked or expired, newest first. Needs Team → View (403 forbidden otherwise).

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of invitations object
    data array of object, required
    data[].email string, required
    Who was invited.
    data[].expires_at string
    When the link stops working (UTC).
    data[].id string, required
    The record's id.
    data[].invited_at string
    When it was sent (UTC).
    data[].invited_by_id string
    The member who invited.
    data[].role string, required
    The role they join with.
    data[].status string, required
    Where it stands.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/invitations

Invite someone to the agency

Emails an invitation link, valid seven days, as the Team screen's Invite does; the credential's user is named as who invited. An address already a member answers 422 already_member, one with a pending invitation 422 pending_invitation. The role is mapped onto the agency's Owner and Staff roles; one the agency deleted answers 422 role_unavailable, and the invitation's role is the one read back after the write. Needs Team → Manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

Who and as what

email string, required
Their email address.
role string, required
The role they join with.
  • 201 The invitation object
    data object, required
    data.email string, required
    Who was invited.
    data.expires_at string
    When the link stops working (UTC).
    data.id string, required
    The record's id.
    data.invited_at string
    When it was sent (UTC).
    data.invited_by_id string
    The member who invited.
    data.role string, required
    The role they join with.
    data.status string, required
    Where it stands.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Codes already_member, pending_invitation, role_unavailable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/invitations/{id}

Revoke a pending invitation

The link stops working, as the Team screen's Revoke does. One no longer pending answers 422 not_pending. Needs Team → Manage (403 forbidden otherwise).

Parameter In Required Description
id path yes
  • 200 The invitation object
    data object, required
    data.email string, required
    Who was invited.
    data.expires_at string
    When the link stops working (UTC).
    data.id string, required
    The record's id.
    data.invited_at string
    When it was sent (UTC).
    data.invited_by_id string
    The member who invited.
    data.role string, required
    The role they join with.
    data.status string, required
    Where it stands.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code not_pending: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/users

List the agency's members

Every member, by email, as the Settings Team screen lists them. Needs Team → View (403 forbidden otherwise).

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of members object
    data array of object, required
    data[].email string, required
    Their sign-in email.
    data[].id string, required
    The member's user id.
    data[].joined_at string
    When they joined (UTC).
    data[].last_seen_at string
    When they last signed in here (UTC).
    data[].name string
    Their display name; null shows the email.
    data[].role string, required
    Their role in this agency.
    data[].status string, required
    Whether they may sign in here.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/users/{id}

Deactivate a member

Deactivates the member and revokes every API key, AI connection and webhook endpoint they hold here, as the Team screen does. Your own membership answers 422 cannot_deactivate_self; the last active admin of an agency with other members 422 last_admin; another change to the agency's members in progress 409 busy. Needs Team → Manage (403 forbidden otherwise).

Parameter In Required Description
id path yes
  • 200 The member object
    data object, required
    data.email string, required
    Their sign-in email.
    data.id string, required
    The member's user id.
    data.joined_at string
    When they joined (UTC).
    data.last_seen_at string
    When they last signed in here (UTC).
    data.name string
    Their display name; null shows the email.
    data.role string, required
    Their role in this agency.
    data.status string, required
    Whether they may sign in here.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes cannot_deactivate_self, last_admin: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/users/{id}

Rename a member or change their role

Sets the name, the role or both, as the Team screen does, in one transaction. A blank name clears it. Your own role answers 422 cannot_change_own_role; demoting the last active admin of an agency with other members 422 last_admin; another change to the agency's members in progress 409 busy. The role is mapped onto the agency's Owner and Staff roles (admin to Owner, billing_staff to Staff); one the agency deleted answers 422 role_unavailable. The current role is a no-op, and the member's other roles are kept, so a demotion their custom roles would undo answers 422 role_held_by_custom_role and changes nothing; the member's role in the answer is the one read back after the write. Needs Team → Manage (403 forbidden otherwise).

Parameter In Required Description
id path yes

Request body (required) application/json object

What to change

name string
Their display name; null or blank clears it, showing the email.
role string
Their role.
  • 200 The member object
    data object, required
    data.email string, required
    Their sign-in email.
    data.id string, required
    The member's user id.
    data.joined_at string
    When they joined (UTC).
    data.last_seen_at string
    When they last signed in here (UTC).
    data.name string
    Their display name; null shows the email.
    data.role string, required
    Their role in this agency.
    data.status string, required
    Whether they may sign in here.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes cannot_change_own_role, last_admin, role_held_by_custom_role, role_unavailable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/users/{id}/reactivate

Reactivate a member

Lets a deactivated member sign in again, as the Team screen does. Their revoked keys and connections stay revoked. Needs Team → Manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The member object
    data object, required
    data.email string, required
    Their sign-in email.
    data.id string, required
    The member's user id.
    data.joined_at string
    When they joined (UTC).
    data.last_seen_at string
    When they last signed in here (UTC).
    data.name string
    Their display name; null shows the email.
    data.role string, required
    Their role in this agency.
    data.status string, required
    Whether they may sign in here.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/webhook-deliveries/{id}/resend

Send a delivery again

The same event, a fresh attempt series, as the delivery log's Resend does. One still being sent answers 409 in_flight. Needs Agency settings → Manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The delivery object
    data object, required
    data.attempts integer
    Attempts so far.
    data.created_at string
    When the event was queued (UTC).
    data.delivered_at string
    When it was delivered (UTC).
    data.endpoint_id string, required
    The endpoint it went to.
    data.event_id string
    The event's id, the same on every attempt.
    data.event_type string, required
    The event type.
    data.id string, required
    The record's id.
    data.last_error string
    The last failure.
    data.last_status_code integer
    The last HTTP status the endpoint answered.
    data.status string, required
    Where it stands.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code in_flight: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/webhook-endpoints

List the agency's webhook endpoints

Newest first; never a signing secret. Needs Agency settings → View (403 forbidden otherwise).

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of endpoints object
    data array of object, required
    data[].active boolean, required
    Whether events are sent.
    data[].created_at string
    When it was registered (UTC).
    data[].events array of string, required
    Event types sent.
    data[].id string, required
    The record's id.
    data[].url string, required
    Where events are posted.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/webhook-endpoints

Register a webhook endpoint

Settings → Webhooks registers one and shows its signing secret once. An API key or AI connection gets 403 web_only: someone holding Agency settings → Manage does this signed in to the web app, in Settings.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The endpoint

events array of string, required
Event types to send.
url string, required
An https URL.
  • 201 The endpoint and its secret, once object
    data object, required
    data.active boolean, required
    Whether events are sent.
    data.created_at string
    When it was registered (UTC).
    data.events array of string, required
    Event types sent.
    data.id string, required
    The record's id.
    data.url string, required
    Where events are posted.
    secret string, required
    The signing secret, shown this once.
  • 403 Code web_only: Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/webhook-endpoints/{id}

Remove a webhook endpoint

Settings → Webhooks removes one and its delivery log. An API key or AI connection gets 403 web_only: someone holding Agency settings → Manage does this signed in to the web app, in Settings.

Parameter In Required Description
id path yes
  • 200 The endpoint object
    data object, required
    data.active boolean, required
    Whether events are sent.
    data.created_at string
    When it was registered (UTC).
    data.events array of string, required
    Event types sent.
    data.id string, required
    The record's id.
    data.url string, required
    Where events are posted.
  • 403 Code web_only: Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/webhook-endpoints/{id}

Change a webhook endpoint

Settings → Webhooks changes its events or pauses it. An API key or AI connection gets 403 web_only: someone holding Agency settings → Manage does this signed in to the web app, in Settings.

Parameter In Required Description
id path yes

Request body (required) application/json object

What to change

active boolean
Whether events are sent.
events array of string
Event types to send.
  • 200 The endpoint object
    data object, required
    data.active boolean, required
    Whether events are sent.
    data.created_at string
    When it was registered (UTC).
    data.events array of string, required
    Event types sent.
    data.id string, required
    The record's id.
    data.url string, required
    Where events are posted.
  • 403 Code web_only: Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/webhook-endpoints/{id}/deliveries

List an endpoint's deliveries

Newest first, as the delivery log shows them, without payloads. An endpoint of another agency answers 404. Needs Agency settings → View (403 forbidden otherwise).

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of deliveries object
    data array of object, required
    data[].attempts integer
    Attempts so far.
    data[].created_at string
    When the event was queued (UTC).
    data[].delivered_at string
    When it was delivered (UTC).
    data[].endpoint_id string, required
    The endpoint it went to.
    data[].event_id string
    The event's id, the same on every attempt.
    data[].event_type string, required
    The event type.
    data[].id string, required
    The record's id.
    data[].last_error string
    The last failure.
    data[].last_status_code integer
    The last HTTP status the endpoint answered.
    data[].status string, required
    Where it stands.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Agency settings

DELETE /api/v1/consents/{purpose}

Revoke a consent

As the tab's revoke does. Revoking external_ai_clients disconnects every AI client; revoking api_access revokes every agency API key, this one included; revoking paper_capture stops scanned forms being read with AI; revoking docusign_agency leaves a connected DocuSign account connected but stops a new one being connected. Nothing current to revoke answers the consent as it stands. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
purpose path yes external_ai_clients (AI Access), api_access (API Keys), paper_capture (Paper forms: reading scanned forms with AI) or docusign_agency (DocuSign: sending records for signature through the agency's own DocuSign account).
  • 200 The consent object
    data object, required
    data.accepted boolean, required
    Whether a current consent stands.
    data.accepted_at string
    When it was accepted.
    data.accepted_by_id string
    The member who accepted it.
    data.accepted_disclosure_version integer
    The disclosure version accepted; null when none stands.
    data.disclosure_version integer, required
    The disclosure's current version.
    data.lapsed boolean, required
    Accepted, but the disclosure changed since: accept it again.
    data.purpose string, required
    The consent.
    data.text string, required
    The disclosure a member holding agency_settings.manage accepts.
    data.title string, required
    The disclosure's title.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/consents/{purpose}

Read a consent

The agency's consent and the disclosure it accepts, as the AI Access, API Keys or Paper forms tab shows them. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
purpose path yes external_ai_clients (AI Access), api_access (API Keys), paper_capture (Paper forms: reading scanned forms with AI) or docusign_agency (DocuSign: sending records for signature through the agency's own DocuSign account).
  • 200 The consent object
    data object, required
    data.accepted boolean, required
    Whether a current consent stands.
    data.accepted_at string
    When it was accepted.
    data.accepted_by_id string
    The member who accepted it.
    data.accepted_disclosure_version integer
    The disclosure version accepted; null when none stands.
    data.disclosure_version integer, required
    The disclosure's current version.
    data.lapsed boolean, required
    Accepted, but the disclosure changed since: accept it again.
    data.purpose string, required
    The consent.
    data.text string, required
    The disclosure a member holding agency_settings.manage accepts.
    data.title string, required
    The disclosure's title.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/consents/{purpose}

Accept a consent

Accepts the current disclosure, as the tab's Accept does; accepting one already current changes nothing. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
purpose path yes external_ai_clients (AI Access), api_access (API Keys), paper_capture (Paper forms: reading scanned forms with AI) or docusign_agency (DocuSign: sending records for signature through the agency's own DocuSign account).
  • 200 The consent object
    data object, required
    data.accepted boolean, required
    Whether a current consent stands.
    data.accepted_at string
    When it was accepted.
    data.accepted_by_id string
    The member who accepted it.
    data.accepted_disclosure_version integer
    The disclosure version accepted; null when none stands.
    data.disclosure_version integer, required
    The disclosure's current version.
    data.lapsed boolean, required
    Accepted, but the disclosure changed since: accept it again.
    data.purpose string, required
    The consent.
    data.text string, required
    The disclosure a member holding agency_settings.manage accepts.
    data.title string, required
    The disclosure's title.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/me/reminder-preferences

Read your reminder preferences

The caller's own preferences, as /settings/reminders shows them. Any member, for themselves.

  • 200 The preferences object
    data object, required
    data.birthday_lead_days integer, required
    Days of notice before a birthday, 0 to 30.
    data.default_reminder_time string, required
    The time of day reminders are due, as HH:MM:SS in the agency's timezone.
    data.email_digest_enabled boolean, required
    Whether reminders are emailed as a digest.
    data.paused_until string, required
    Reminder email paused until then, an ISO 8601 time in the future; null resumes it.
    data.recert_lead_days integer, required
    Days of notice before a recert, 0 to 180.
    data.supervisor_visit_cadence_mode string, required
    How the next supervisory visit is counted.
    data.supervisor_visit_cadence_value integer, required
    Days or months between supervisory visits, 0 to 365.
  • default An error, in the shared envelope. Error

PUT /api/v1/me/reminder-preferences

Save your reminder preferences

As /settings/reminders does, for the caller alone; send only what changes. Any member, for themselves.

Request body (required) application/json object

What to change

birthday_lead_days integer
Days of notice before a birthday, 0 to 30.
default_reminder_time string
The time of day reminders are due, as HH:MM:SS in the agency's timezone.
email_digest_enabled boolean
Whether reminders are emailed as a digest.
paused_until string
Reminder email paused until then, an ISO 8601 time in the future; null resumes it.
recert_lead_days integer
Days of notice before a recert, 0 to 180.
supervisor_visit_cadence_mode string
How the next supervisory visit is counted.
supervisor_visit_cadence_value integer
Days or months between supervisory visits, 0 to 365.
  • 200 The preferences object
    data object, required
    data.birthday_lead_days integer, required
    Days of notice before a birthday, 0 to 30.
    data.default_reminder_time string, required
    The time of day reminders are due, as HH:MM:SS in the agency's timezone.
    data.email_digest_enabled boolean, required
    Whether reminders are emailed as a digest.
    data.paused_until string, required
    Reminder email paused until then, an ISO 8601 time in the future; null resumes it.
    data.recert_lead_days integer, required
    Days of notice before a recert, 0 to 180.
    data.supervisor_visit_cadence_mode string, required
    How the next supervisory visit is counted.
    data.supervisor_visit_cadence_value integer, required
    Days or months between supervisory visits, 0 to 365.
  • default An error, in the shared envelope. Error

GET /api/v1/settings/adp

Read the ADP settings

As Settings > Payroll shows them: company code, batch description, overtime, pay rates, pay period and earning codes. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The settings object
    data object, required
    data.adp_batch_description string, required
    The batch description; null clears it.
    data.adp_co_code string, required
    The ADP company code; null clears it.
    data.adp_earning_code_map object, required
    Attendant hours to an ADP Hours column, as the tab's JSON; an empty object leaves the column out.
    data.biweekly_anchor_date string, required
    The first day of any one biweekly pay period, such as 2026-10-02: biweekly periods run every 14 days from it, across month ends. Read only while pay_period_frequency is biweekly; null starts each month's periods on the 1st. Exports already made keep their dates.
    data.cash_advance_in_adp_run boolean, required
    Whether the ADP Run file deducts each caregiver's cash advance as a negative Misc Amount.
    data.daily_overtime_enabled boolean, required
    Whether daily overtime is reported.
    data.default_attendant_pay_rate string, required
    The attendant hourly rate, such as 18.50: above zero, two decimals; null clears it.
    data.holiday_pay_rate string, required
    The holiday hourly rate: above zero, two decimals; null clears it.
    data.mileage_pay_rate string, required
    The rate per mile, such as 0.67: above zero, two decimals; null clears it.
    data.pay_period_frequency string, required
    The pay period.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/settings/adp

Save the ADP settings

As the tab's Save does, through the same checks; send only what changes. A value the tab refuses answers 422 naming the field. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

What to change

adp_batch_description string
The batch description; null clears it.
adp_co_code string
The ADP company code; null clears it.
adp_earning_code_map object
Attendant hours to an ADP Hours column, as the tab's JSON; an empty object leaves the column out.
biweekly_anchor_date string
The first day of any one biweekly pay period, such as 2026-10-02: biweekly periods run every 14 days from it, across month ends. Read only while pay_period_frequency is biweekly; null starts each month's periods on the 1st. Exports already made keep their dates.
cash_advance_in_adp_run boolean
Whether the ADP Run file deducts each caregiver's cash advance as a negative Misc Amount.
daily_overtime_enabled boolean
Whether daily overtime is reported.
default_attendant_pay_rate string
The attendant hourly rate, such as 18.50: above zero, two decimals; null clears it.
holiday_pay_rate string
The holiday hourly rate: above zero, two decimals; null clears it.
mileage_pay_rate string
The rate per mile, such as 0.67: above zero, two decimals; null clears it.
pay_period_frequency string
The pay period.
  • 200 The settings object
    data object, required
    data.adp_batch_description string, required
    The batch description; null clears it.
    data.adp_co_code string, required
    The ADP company code; null clears it.
    data.adp_earning_code_map object, required
    Attendant hours to an ADP Hours column, as the tab's JSON; an empty object leaves the column out.
    data.biweekly_anchor_date string, required
    The first day of any one biweekly pay period, such as 2026-10-02: biweekly periods run every 14 days from it, across month ends. Read only while pay_period_frequency is biweekly; null starts each month's periods on the 1st. Exports already made keep their dates.
    data.cash_advance_in_adp_run boolean, required
    Whether the ADP Run file deducts each caregiver's cash advance as a negative Misc Amount.
    data.daily_overtime_enabled boolean, required
    Whether daily overtime is reported.
    data.default_attendant_pay_rate string, required
    The attendant hourly rate, such as 18.50: above zero, two decimals; null clears it.
    data.holiday_pay_rate string, required
    The holiday hourly rate: above zero, two decimals; null clears it.
    data.mileage_pay_rate string, required
    The rate per mile, such as 0.67: above zero, two decimals; null clears it.
    data.pay_period_frequency string, required
    The pay period.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/settings/csv-mapping

Read the CSV column mapping

As Settings > CSV Mapping shows it: the agency's column for each claim field it renamed, and every field an upload reads. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The mapping object
    data object, required
    data.mapping object, required
    Claim field (the read lists them) to the agency's column name, such as {"member_id": "Medicaid #"}; a field left out, or mapped to a blank column, reads its own name.
    data.optional_fields array of string, required
    The claim fields an upload may carry.
    data.required_fields array of string, required
    The claim fields an upload must carry.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/settings/csv-mapping

Replace the CSV column mapping

As the tab's Save does: the mapping sent replaces the saved one, a blank or null column reads the field's own name, and an empty mapping is the tab's Reset. A field the upload does not read answers 422 naming it. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

The mapping

mapping object, required
Claim field (the read lists them) to the agency's column name, such as {"member_id": "Medicaid #"}; a field left out, or mapped to a blank column, reads its own name.
  • 200 The mapping object
    data object, required
    data.mapping object, required
    Claim field (the read lists them) to the agency's column name, such as {"member_id": "Medicaid #"}; a field left out, or mapped to a blank column, reads its own name.
    data.optional_fields array of string, required
    The claim fields an upload may carry.
    data.required_fields array of string, required
    The claim fields an upload must carry.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/settings/evv-collection

Read the EVV rollout

As Settings > EVV Rules shows it under EVV in HCB: who HCB collects EVV for, from which day, and how many caregivers are enrolled in the pilot. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The rollout object
    data object, required
    data.enrolled_caregivers integer, required
    How many caregivers are enrolled in the EVV pilot.
    data.evv_collected_from string, required
    The agency's calendar day HCB starts collecting EVV; null for no start day.
    data.evv_rollout string, required
    Who HCB collects EVV for: off (alerts start with the agency's first clock-in), pilot (enrolled caregivers only) or all.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/settings/evv-collection

Save the EVV rollout

As the EVV in HCB card's Save does; send only what changes. A rollout other than off, pilot or all, or a date that does not parse, answers 422. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

What to change

evv_collected_from string
The agency's calendar day HCB starts collecting EVV; null for no start day.
evv_rollout string
Who HCB collects EVV for: off (alerts start with the agency's first clock-in), pilot (enrolled caregivers only) or all.
  • 200 The rollout object
    data object, required
    data.enrolled_caregivers integer, required
    How many caregivers are enrolled in the EVV pilot.
    data.evv_collected_from string, required
    The agency's calendar day HCB starts collecting EVV; null for no start day.
    data.evv_rollout string, required
    Who HCB collects EVV for: off (alerts start with the agency's first clock-in), pilot (enrolled caregivers only) or all.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/settings/notifications

Read the notification settings

As Settings > Notifications shows them: which EDI events (a submission, a TA1, a 999, a claim acknowledgment, an 835) email the agency. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The settings object
    data object, required
    data.notify_on_277ca boolean, required
    Whether the agency is emailed for this event.
    data.notify_on_835 boolean, required
    Whether the agency is emailed for this event.
    data.notify_on_999 boolean, required
    Whether the agency is emailed for this event.
    data.notify_on_submission boolean, required
    Whether the agency is emailed for this event.
    data.notify_on_ta1 boolean, required
    Whether the agency is emailed for this event.
    data.remittance_review_email boolean, required
    Whether the agency is emailed for this event.
    data.text_caregivers_before_expiry boolean, required
    Whether each caregiver is texted a month, and again a week, before a dated credential of theirs expires.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/settings/notifications

Save the notification settings

As the tab's checkboxes do; send only what changes. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

What to change

notify_on_277ca boolean
Whether the agency is emailed for this event.
notify_on_835 boolean
Whether the agency is emailed for this event.
notify_on_999 boolean
Whether the agency is emailed for this event.
notify_on_submission boolean
Whether the agency is emailed for this event.
notify_on_ta1 boolean
Whether the agency is emailed for this event.
remittance_review_email boolean
Whether the agency is emailed for this event.
text_caregivers_before_expiry boolean
Whether each caregiver is texted a month, and again a week, before a dated credential of theirs expires.
  • 200 The settings object
    data object, required
    data.notify_on_277ca boolean, required
    Whether the agency is emailed for this event.
    data.notify_on_835 boolean, required
    Whether the agency is emailed for this event.
    data.notify_on_999 boolean, required
    Whether the agency is emailed for this event.
    data.notify_on_submission boolean, required
    Whether the agency is emailed for this event.
    data.notify_on_ta1 boolean, required
    Whether the agency is emailed for this event.
    data.remittance_review_email boolean, required
    Whether the agency is emailed for this event.
    data.text_caregivers_before_expiry boolean, required
    Whether each caregiver is texted a month, and again a week, before a dated credential of theirs expires.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/settings/security

Read the security settings

As Settings > Security shows them: whether two-factor is required, and the session timeout. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The settings object
    data object, required
    data.require_two_factor boolean, required
    Whether every member must sign in with two-factor.
    data.session_timeout_minutes integer, required
    Minutes idle before sign-out.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/settings/security

Save the security settings

As the Security tab does; send only what changes. Requiring two-factor needs the caller's own two-factor on first (422 enable_yours_first); turning the requirement off needs code, a current code from the caller's authenticator app (422 invalid_code). Both change in one transaction: if either is refused, neither is saved. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

What to change

code string
Deprecated: send otp_code. Read when otp_code is absent, until April 30, 2027.
otp_code string
A current 6-digit code from your authenticator app; needed to turn the requirement off.
require_two_factor boolean
Require two-factor sign-in of every member (true), or stop (false). Requiring it needs your own two-factor on first.
session_timeout_minutes integer
Minutes idle before sign-out: 5, 15, 30 or 60.
  • 200 The settings object
    data object, required
    data.require_two_factor boolean, required
    Whether every member must sign in with two-factor.
    data.session_timeout_minutes integer, required
    Minutes idle before sign-out.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Codes enable_yours_first, invalid_code: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/settings/tpid-authorized

Read the Trading Partner authorization

Whether the agency has confirmed it authorized HomeCareBilling as its Trading Partner, as the Agency tab shows it. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The authorization object
    data object, required
    data.tpid_authorized boolean, required
    Whether the agency confirmed its Trading Partner authorization.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/settings/tpid-authorized

Set the Trading Partner authorization

As the Agency tab's toggle does. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

The authorization

authorized boolean, required
Whether the agency authorized HomeCareBilling as its Trading Partner: confirmed (true) or not (false).
  • 200 The authorization object
    data object, required
    data.tpid_authorized boolean, required
    Whether the agency confirmed its Trading Partner authorization.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/users/{id}/two-factor/reset

Reset a member's two-factor

As the Users list's reset does: turns off the member's two-factor so they set it up again, and emails them. Only a member of this agency and no other, never yourself (422 not_allowed); an id that is no member of this agency answers 404. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 Reset object
    data object, required
    data.two_factor_enabled boolean, required
    Always false once reset.
    data.user_id string, required
    The record's id.
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Code not_allowed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Agenda

GET /api/v1/agenda/today

Get today's agenda

What the agency needs to deal with today: reminders due now, reminders already overdue, client and caregiver birthdays, and the billing work waiting. The day is Mountain time's. Each reminder list holds at most 100, says how many there are in all, and is read on with its own offset.

Parameter In Required Description
date query no The day to look at (YYYY-MM-DD). Leave it out for today.
due_today_offset query no Reminders due today to skip, to read past the first page.
overdue_offset query no Overdue reminders to skip, to read past the first page.
  • 200 The agenda object
    data Agenda, required
  • default An error, in the shared envelope. Error

GET /api/v1/attention

List what needs attention

Everything about a client or caregiver that needs doing, as the Today page and needs_attention list it: reminders due today and overdue, compliance documents, OIG matches, supervisory visits, outstanding recertifications, PARs ending within 30 days and open monthly follow-ups. Overdue first (oldest first, undated last among them), then soonest due. The day is Mountain time's. An unknown kind is 422.

Parameter In Required Description
kind query no Keep only one kind of row.
limit query no Rows per page (default 20, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 A page of rows object
    data array of AttentionRow, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/reminders/{id}/complete

Mark a reminder done

As the Today page's Done button: closes the reminder, and never completes or signs the visit or form behind it. Completing a recurring reminder schedules its next one. Already done is 200 with changed false; already dismissed is 422 already_closed. Another agency's reminder is 404.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The reminder object
    data ReminderClosed, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code already_closed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/reminders/{id}/dismiss

Dismiss a reminder

As the Today page's Dismiss button: removes the reminder without doing it. Dismissing a recurring reminder ends its series. Already dismissed is 200 with changed false; already done is 422 already_closed. Another agency's reminder is 404.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The reminder object
    data ReminderClosed, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code already_closed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Assignments

GET /api/v1/assignments

List assignments

Which caregiver serves which client, under which billing code. The agency's assignments in effective-date order, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
client_id query no Only records of this client.
caregiver_id query no Only records of this caregiver.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
  • 200 A page of assignments object
    data array of Assignment, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/assignments

Create a assignment

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json AssignmentCreate

The assignment's fields

  • 201 The created assignment object
    data Assignment, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/assignments/schedule-import

Import InMyTeam's weekly schedule PDF

Reads InMyTeam's weekly schedule as Import Assignments does: each caregiver-client pair and service becomes an item, matched by name among this agency's clients and caregivers only. new: a pair with no active or open temporary assignment, added with the file's days; changed: an assignment whose days differ, its days replaced; unchanged; not_imported: a name or service that did not resolve, with the reason; not_on_schedule: an active assignment, or a temporary one with no end date, that the file does not name, left as it is. Needs imports.manage and scheduling.manage. With dry_run true the answer is the items and nothing is written. Sending the same file again writes nothing twice (imported 0, updated 0); when two sends run at once, a pair the other created first is skipped as already_on_file. Refusals: 403 forbidden naming the missing permission; 422 not_a_schedule, unreadable_pdf (also when reading the PDF takes over 15 s), file_required (no file, or one that is not a PDF), file_too_large, invalid_dry_run; none writes anything.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) multipart/form-data object

A multipart form with InMyTeam's weekly schedule (Schedule in week view, printed to PDF) in the field `file`, at most 10 MB, and optionally dry_run.

dry_run boolean
true: answer the items the import would add or change and write nothing. Left out or false: import.
file string, required
  • 200 What the import did, or with dry_run true would do object
    data ScheduleImportResult, required
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code not_a_schedule: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/assignments/{id}

Get a assignment

Which caregiver serves which client, under which billing code.

Parameter In Required Description
id path yes
  • 200 The assignment object
    data Assignment, required
  • 404 Code not_found: no assignment with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/assignments/{id}

Update a assignment

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json AssignmentUpdate

The fields to change

  • 200 The updated assignment object
    data Assignment, required
  • 404 Code not_found: no assignment with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the assignment changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

GET /api/v1/assignments/{id}/schedule

Read an assignment's weekly schedule

Its shifts and the days each one works, in the shape a save sends: the days the office entered and the days its standing Work Orders place, each of the latter naming its WO # in work_order_number.

Parameter In Required Description
id path yes
  • 200 The schedule object
    data AssignmentSchedule, required
  • default An error, in the shared envelope. Error

PUT /api/v1/assignments/{id}/schedule

Save one shift of an assignment's weekly schedule

Replaces the days of the shift named by shift_number in the body or the shift query parameter (1 to 4, default 1) with the days sent, as the page's schedule editor does; an empty list clears the shift. A day may carry ends_next_day (default false) for a shift that ends after midnight. A refused day (an end before its start without ends_next_day, a day overlapping another shift, across midnight too) answers 422 invalid_schedule naming it, and nothing is written. A day identical to one a Work Order places (same day, shift, start and end) is that Work Order's and writes nothing, so sending the read shape back changes nothing. lock_version is the assignment's as read: a change since answers 409 stale_record, and a save moves it. Answers the whole schedule.

Parameter In Required Description
id path yes
shift query no The shift to save, 1 to 4; default 1.

Request body (required) application/json object

The shift's days

days array of object, required
The shift's days; an empty list clears the shift.
days[].day_of_week string, required
The day.
days[].end_time string, required
HH:MM or HH:MM:SS, 24-hour; after start_time, or at or before it when ends_next_day is true.
days[].ends_next_day boolean
True for a shift that ends after midnight, on the next day (22:30 to 00:30); default false.
days[].start_time string, required
HH:MM or HH:MM:SS, 24-hour.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
shift_number integer
The shift to save, 1 to 4, as GET names it; default 1. The shift query parameter does the same.
  • 200 The schedule object
    data AssignmentSchedule, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code invalid_schedule: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/assignments/{id}/transition

Change an assignment's status

Moves the assignment to status, with an optional reason, as the page's status dialog does. A transition its status does not allow answers 422 invalid_transition; closing one with open timesheets 422 has_active_timesheets; lock_version is the one the assignment was read with: one changed since answers 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The new status

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
reason string
Why, kept in the status history.
status string, required
The new status.
  • 200 The assignment object
    data Assignment, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Codes has_active_timesheets, invalid_transition: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Batches

GET /api/v1/batches

List batches

A batch is one uploaded claims file and the claims made from it. The agency's batches in upload order, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
  • 200 A page of batches object
    data array of Batch, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/batches

Upload a claims file

Creates a batch from a CSV or XLSX file of up to 10 MB, mapped with the agency's saved column mapping (Settings, CSV mapping). The batch validates in the background and is never submitted automatically. Refused, creating nothing: 422 unmapped_columns, patient_limit_exceeded, unsupported_file_type or invalid_file, and 403 submission_blocked when the agency may not submit claims.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) multipart/form-data object

A multipart form with the claims file in the field `file` (.csv or .xlsx), optionally which column holds which claim field, and whether to keep that mapping.

column_mapping object
Optional, as {field: column header}, for example {"member_id": "Medicaid #"}, applied over the agency's saved mapping as POST /api/v1/batches/validate applies it.
file string, required
save_mapping boolean
Keep the mapping this file was read with as the agency's saved one once the batch is stored, as Upload claims keeps matched columns.
  • 201 The created batch, and any warning object
    data Batch, required
    warnings array of object, required
  • 403 Code submission_blocked: Forbidden, as the operation's description says. Error
  • 422 Code unmapped_columns: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/batches/validate

Validate a claims file without storing it

Each row's validation errors and warnings, as a batch made from the file would get them. A warning (a part-unit on a 15-minute code, a Location/Rendering Provider ID that is not digits only, a patient_account_number another row repeats or a claim in progress or paid already uses, which the upload replaces with a generated one and keeps as replaced_account_number) never stops the row from being submitted. Nothing is stored, so it needs no Idempotency-Key and is allowed with a read-only key, on a read-only account, and while claim submission is blocked. It counts against the write rate limit, as parsing a file is the heaviest request.

Request body (required) multipart/form-data object

A multipart form with the claims file in the field `file` (.csv or .xlsx), and optionally which column holds which claim field.

column_mapping object
Optional. Which column holds which claim field, as {field: column header}, for example {"member_id": "Medicaid #"}: over /api/v1 a JSON part, or form fields column_mapping[member_id]=Medicaid #. Applied over the agency's saved mapping for this check only; a field a claim does not have or a column the sheet lacks is refused with 422 unknown_mapping_fields or mapping_columns_missing.
file string, required
  • 200 Every row, its errors and its warnings object
    data array of object, required
    data[].errors array of object, required
    data[].errors[].code string
    Stable, e.g. required or invalid_format.
    data[].errors[].field string
    The claim field.
    data[].errors[].message string
    For a person to read.
    data[].row_number integer, required
    data[].warnings array of object, required
    Problems that do not stop the row from being submitted: a part-unit on a 15-minute code, or a Location/Rendering Provider ID that is not digits only.
    data[].warnings[].code string
    Stable, e.g. required or invalid_format.
    data[].warnings[].field string
    The claim field.
    data[].warnings[].message string
    For a person to read.
  • default An error, in the shared envelope. Error

GET /api/v1/batches/{id}

Get a batch

A batch is one uploaded claims file and the claims made from it.

Parameter In Required Description
id path yes
  • 200 The batch object
    data Batch, required
  • 404 Code not_found: no batch with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

GET /api/v1/batches/{id}/837

Download a batch's 837 file

The generated 837 file exactly as Batch Detail's Download 837 serves it, under its HCPF file name. 404 not_found for a batch this agency does not have, and for one with no 837 yet (it is made when the batch is generated). The read is recorded on the PHI access log.

Parameter In Required Description
id path yes
  • 200 The 837 file string
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/batches/{id}/submit

Submit a batch to HCPF

A generated batch is sent to HCPF; a validated batch made from an uploaded file is generated first and sent as soon as its 837P exists. Either way the answer is 202 at once: poll GET /api/v1/batches/{id} for the outcome. A generated batch is held, sending nothing, while a claim includes days already billed in another batch or the duplicate check did not complete: 422 submission_held says which; review the batch in the app to send it anyway. A validated batch is compared once it is generated, so a hold found then leaves it at generated, and the next submit answers 422 submission_held. Refused, sending nothing: 422 batch_not_submittable when the batch cannot be submitted now (any other status, or already on its way, which is never sent twice), 422 submission_blocked when the agency's setup blocks submission, 403 submission_blocked when its billing does, 403 read_only or insufficient_scope for a key that may not write, and 404 for a batch this agency does not have. The Idempotency-Key binds the FIRST answer: repeat the key to recover a lost 202, and send a NEW key to try again after a refusal is fixed or after a 500.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes The batch id.
  • 202 The batch, as it stands once the submission is queued object
    data Batch, required
  • 403 Codes read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes batch_not_submittable, submission_blocked, submission_held: Unprocessable Content, as the operation's description says. Error
  • 500 Internal Server Error, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Billing codes

GET /api/v1/billing-codes

List billing codes

The billing codes this product bills, in code order, each with the modifiers the fee schedules use. A work order also takes another code whose units can be computed (a catalog.unknown_code warning names one no fee schedule prices), and other modifiers in valid 837P format, within the limits the BillingCode schema states. The same for every agency.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of billing codes object
    data array of BillingCode, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

Broadcasts and notifications

GET /api/v1/broadcasts

List broadcasts

The agency's broadcasts, newest first, as the broadcast page's Recent Broadcasts lists them, each with how many caregivers texted back and how many said yes.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of broadcasts object
    data array of object, required
    data[].delivery_method string, required
    How it went out.
    data[].id string, required
    The record's id.
    data[].message string
    What it said.
    data[].recipient_count integer, required
    Caregivers sent to.
    data[].reply_count integer
    Caregivers who texted back to it.
    data[].sent_at string
    When it was sent (UTC).
    data[].skipped_count integer
    Caregivers skipped: no contact for the method, or opted out of SMS.
    data[].yes_count integer
    Of those, how many replies read as a yes.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/broadcasts

Send a broadcast to caregivers

Sends a message to the agency's active caregivers, as the broadcast page does: by email (default), SMS or both, to everyone (default), one compliance group (expired, expiring_soon, training, evaluation), or pick: the caregivers named in caregiver_ids (former ones included) and those carrying tag (active only unless include_former). A caregiver without the contact method, or opted out of SMS, is skipped and counted; an opted-out number is never texted. An id that is not one of the agency's caregivers answers 422 validation_failed; an empty group 422 no_recipients; a texted (sms or both) message that, with the agency name before it and the STOP line after it, would pass 1,600 characters 422 validation_failed, naming the agency's limit; the same message by the same method within a minute 409 duplicate; past the daily limit 429 rate_limited.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The broadcast

caregiver_ids array of string
pick: the caregivers to send to, whatever their status (former ones included). At most 1000.
delivery_method string
How to send it: email, sms or both. Leave it out for email.
include_former boolean
With tag: also caregivers no longer active. Leave it out for active only.
message string, required
The message.
recipient_scope string
Who to send it to. Leave it out for all, or for pick when caregiver_ids or tag is given.
tag string
pick: every caregiver carrying this tag (any case).
  • 201 The broadcast sent object
    data object, required
    data.delivery_method string, required
    How it went out.
    data.id string, required
    The record's id.
    data.recipient_count integer, required
    Caregivers sent to.
    data.recipient_scope string
    Who it went to.
    data.reply_count integer
    Caregivers who texted back to it (#2567).
    data.sent_at string
    When it was sent (UTC).
    data.skipped_count integer
    Caregivers skipped: no contact for the method, or opted out of SMS.
    data.yes_count integer
    Of those, how many replies read as a yes.
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes no_recipients, validation_failed: Unprocessable Content, as the operation's description says. Error
  • 429 Code rate_limited: Too Many Requests, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/broadcasts/{id}/replies

List a broadcast's replies

The caregivers who texted back to one of the agency's broadcasts, latest reply first, as the broadcast page's Replies list shows them; yes marks a reply that reads as a yes. Another agency's broadcast answers 404.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of replies object
    data array of object, required
    data[].caregiver_id string, required
    The caregiver who replied.
    data[].caregiver_name string
    The caregiver, last name first.
    data[].replied_at string
    When it arrived (UTC).
    data[].reply string, required
    Their latest text back.
    data[].yes boolean, required
    Whether the reply reads as a yes.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/notifications

List your notifications

The credential's member's notifications, newest first, as the notification bell lists them. read=unread lists only unread ones, read=read only read ones.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
read query no unread or read; omitted lists both.
  • 200 A page of notifications object
    data array of object, required
    data[].body string
    Its text.
    data[].created_at string
    When it was raised (UTC).
    data[].id string, required
    The record's id.
    data[].priority string
    How urgent it is.
    data[].read_at string
    When it was read (UTC).
    data[].resolved_at string
    When it was resolved (UTC).
    data[].source_id string
    The record it is about.
    data[].source_type string
    The kind of record it is about.
    data[].title string, required
    Its headline.
    data[].type string, required
    The kind of notification.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/notifications/read-all

Mark all your notifications read

As the bell's Mark all read does. Answers how many were marked.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 How many were marked object
    data object, required
    data.marked integer, required
    Notifications marked read.
  • default An error, in the shared envelope. Error

POST /api/v1/notifications/{id}/read

Mark a notification read

As opening it from the bell does. Another member's notification, or another agency's, answers 404.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The notification object
    data object, required
    data.body string
    Its text.
    data.created_at string
    When it was raised (UTC).
    data.id string, required
    The record's id.
    data.priority string
    How urgent it is.
    data.read_at string
    When it was read (UTC).
    data.resolved_at string
    When it was resolved (UTC).
    data.source_id string
    The record it is about.
    data.source_type string
    The kind of record it is about.
    data.title string, required
    Its headline.
    data.type string, required
    The kind of notification.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/notifications/{id}/resolve

Resolve a notification

Marks it resolved, and read, as the notifications page's Resolve does, with optional notes for the record. One already resolved is answered as it stands. Another agency's answers 404.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

Notes

notes string
Why it is resolved. Leave it out for none.
  • 200 The notification object
    data object, required
    data.body string
    Its text.
    data.created_at string
    When it was raised (UTC).
    data.id string, required
    The record's id.
    data.priority string
    How urgent it is.
    data.read_at string
    When it was read (UTC).
    data.resolved_at string
    When it was resolved (UTC).
    data.source_id string
    The record it is about.
    data.source_type string
    The kind of record it is about.
    data.title string, required
    Its headline.
    data.type string, required
    The kind of notification.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Care logs

GET /api/v1/care-logs

List care logs

As the /care-logs list: newest service date first, each with its task counts (done, refused, not_needed, unmarked). Filters: client_id, caregiver_id, from and to (service dates, inclusive), source, state and needs_signature. The read is recorded on the PHI access log.

Parameter In Required Description
limit query no Rows per page (default 50, at most 200; a larger value is served as 200).
offset query no Rows to skip.
client_id query no Only this client's.
caregiver_id query no Only this caregiver's.
from query no Service dates on or after, YYYY-MM-DD.
to query no Service dates on or before, YYYY-MM-DD.
source query no Where it was captured.
state query no The record state.
needs_signature query no true: only the care logs still needing the client's signature (drafts), as the screen's Needs client signature box. false or left out filters nothing.
  • 200 A page of care logs object
    data array of CareLog, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/care-logs

Start a care log

As New care log: starts the care log of the client, caregiver, day, service and shift with source office, seeded with the tasks the Work Orders in force plan for the day. A key that already holds a live care log answers 200 with that one, never a second; a new one answers 201. A client or caregiver that is not the agency's is 404 not_found, a Visit that is not the day's 422 visit_mismatch.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The day

caregiver_id string, required
The caregiver.
client_id string, required
The client.
notes string
The day's notes.
service_date string, required
The day.
service_type string, required
The service, as the Work Order's.
shift_number integer
The shift, 1 to 4 (default 1).
time_in string
The start time, ISO 8601. Sent with time_out or notes, the start records the day: a care log already on the key with the same content is answered as it is, one with different content 409 stale.
time_out string
The end time, ISO 8601, at or after time_in.
visit_id string
The Visit to link: the agency's, of the same client, caregiver and day. Left out, the day's one such Visit is linked when exactly one exists.
  • 200 The care log already holding the day object
    data CareLogDetail, required
  • 201 The care log started object
    data CareLogDetail, required
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 422 Code visit_mismatch: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/care-logs/{id}

Read a care log

As the /care-logs/:id screen: the day with its tasks, times, warnings and live signatures. The read is recorded on the PHI access log.

Parameter In Required Description
id path yes
  • 200 The care log object
    data CareLogDetail, required
  • default An error, in the shared envelope. Error

PATCH /api/v1/care-logs/{id}

Edit a care log's notes and times

As the screen's notes and times: sets the fields sent. lock_version must be the value read; a care log changed since answers 409 stale_record. time_out before time_in is 422 validation_failed. A care log that is not a draft answers 409 record_locked and nothing changes; another agency's id answers 404, whatever the body holds.

Parameter In Required Description
id path yes

Request body (required) application/json object

The fields to set

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
notes string
The day's notes; null clears them.
time_in string
The start time, ISO 8601; used only when no Visit is linked. null clears it.
time_out string
The end time, ISO 8601, after time_in; used only when no Visit is linked. null clears it.
  • 200 The care log object
    data CareLogDetail, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes record_locked, stale_record: Conflict, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/care-logs/{id}/finish

Finish a care log

As the screen's Finish: marks the care log finished, once; finishing a finished care log changes nothing. Warnings never refuse it. A care log that is not a draft answers 409 record_locked and nothing changes; another agency's id answers 404, whatever the body holds.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The care log object
    data CareLogDetail, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/care-logs/{id}/paper-on-file

Mark a care log's paper signature on file

As the screen's Client signed on paper: the client's paper signature is recorded as on file (method paper_on_file, channel office), which signs and locks the day. Send a multipart scan in the field file (stored as a document of the client's, up to 50 MB), or JSON with the document_id of one already on the client's file, or neither. The same mark again answers the same signature. A document that is not the client's, or is not one a person uploaded (a paper-capture scan, a true copy), is 422 document_not_found; a scan or document that is not a PDF, JPEG or PNG, or is over the size, 422 invalid_scan; a document whose virus scan has not finished 409 scan_pending, or found it infected or failed, 422 scan_not_clean; a client line already signed 409 role_already_signed. A care log that is not a draft answers 409 record_locked and nothing changes; another agency's id answers 404, whatever the body holds. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

The scan, if any

document_id string
A document already on the client's file holding the paper scan; left out, the mark carries no scan.
  • 201 The care log, signed object
    data CareLogDetail, required
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes record_locked, role_already_signed, scan_pending: Conflict, as the operation's description says. Error
  • 422 Codes document_not_found, invalid_scan, scan_not_clean: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/care-logs/{id}/tasks

Add a task to a care log

As the screen's Add task: adds an unplanned task, done unless status says otherwise; a task the care log already holds is set instead, so a retried add writes nothing new. A task that is not the agency's or a system one is 422 task_definition_not_found. A care log that is not a draft answers 409 record_locked and nothing changes; another agency's id answers 404, whatever the body holds.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The task

count integer
How many times; 1 when left out.
reason_code string
Why it was done off the plan.
reason_note string
The reason in words.
status string
Its status; done when left out.
task_definition_id string, required
The task to add: one of the agency's tasks or a system one.
  • 200 The care log object
    data CareLogDetail, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • 422 Code task_definition_not_found: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/care-logs/{id}/tasks/{task_id}/mark

Mark a care log's task

As the screen's Done, Refused and Not needed buttons: SETS the task's status, reason and count; a mark that changes nothing writes nothing. A task the care log does not hold is 422 task_not_on_log (add it with POST /care-logs/{id}/tasks). A care log that is not a draft answers 409 record_locked and nothing changes; another agency's id answers 404, whatever the body holds.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
task_id path yes The task's task_definition_id, as the care log's tasks list it.

Request body (required) application/json object

The mark

count integer
How many times; unchanged when left out.
reason_code string
Why a task was refused or not needed; left out or null clears it, as a mark on the screen does.
reason_note string
The reason in words; left out or null clears it.
status string, required
The status to SET: done, refused or not_needed; null clears it. Sending the status the task already has changes nothing.
  • 200 The care log object
    data CareLogDetail, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • 422 Code task_not_on_log: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/half-month-summaries

Read a half-month summary

The client's half of a month with one caregiver for one service, as the evidence grid shows it: the live summary of the client, caregiver, service and half (a draft is shown re-read from the grid on every read, and the read stores nothing; the first signature freezes it). signing says from which day it may be signed and which lines are signed. A client or caregiver that is not the agency's, or a half with no summary yet, is 404; a period_start that is not the 1st or the 16th 422 validation_failed, and so is a service_type left out on a half with care for more than one service. The read is recorded on the PHI access log.

Parameter In Required Description
client_id query yes The client.
caregiver_id query yes The caregiver.
period_start query yes The half's first day, YYYY-MM-DD: the 1st or the 16th of a month.
service_type query no The service the summary attests (one summary per service). Left out, the half's only service.
  • 200 The summary object
    data HalfMonthSummary, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/phone-care-logs/exceptions

List incomplete phone care logs

As /visits/phone-care-logs: the agency's live phone care logs with no task entered, a call that ended before it was finished, or no client attestation, each with its reasons, newest service date first. A log is listed 15 minutes after its call, once the call has settled, and leaves the list when it is dismissed. Filter by reason and by from and to (service dates, inclusive). recording_document_id names the client's kept recording, readable with GET /documents/{id}/file. The read is recorded on the PHI access log.

Parameter In Required Description
limit query no Rows per page (default 25, at most 100; a larger value is served as 100).
offset query no Rows to skip.
reason query no Only the logs listed for this reason.
from query no Service dates on or after, YYYY-MM-DD.
to query no Service dates on or before, YYYY-MM-DD.
  • 200 A page of incomplete phone care logs object
    data array of PhoneCareLogException, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/phone-care-logs/{id}/dismiss

Dismiss an incomplete phone care log

As the screen's Dismiss: records why the log needs no more work, and it leaves the list. The care log itself does not change; it can still be finished and signed. A blank reason is 422 ("Say why you are dismissing this."). Dismissing it again answers 200 with already_dismissed true and the first dismissal. Another agency's care log, or one that is not a live phone care log, answers 404 whatever the body holds.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The reason

reason string
Why it can be dismissed, 3 to 500 characters, as the screen asks.
  • 200 Already dismissed object
    data EvidenceDismissal, required
  • 201 The dismissal object
    data EvidenceDismissal, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Caregiver app

POST /api/v1/caregiver-sessions

Sign in a caregiver

Signs the caregiver in with the agency code, employee id and PIN, and returns a device token for /api/v1/me. A wrong agency code, employee id or PIN all answer 401 invalid_credentials. Repeated failures answer 429 rate_limited with a Retry-After header.

Request body (required) application/json CaregiverSessionInput

The caregiver's credentials

  • 201 The device token object
    data CaregiverSession, required
  • 401 Code invalid_credentials: Unauthorized, as the operation's description says. Error
  • 429 Code rate_limited: Too Many Requests, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/caregiver-sessions/current

Sign out this device

Revokes the device token sent as the bearer credential. The token is refused from then on, here and in the caregiver web app.

  • 204 Signed out
  • default An error, in the shared envelope. Error

GET /api/v1/me

The signed-in caregiver

  • 200 The caregiver object
    data Me, required
  • default An error, in the shared envelope. Error

GET /api/v1/me/care-logs

List my unfinished care logs

Your care logs not finished yet, as the app's dashboard lists them: drafts with no finished_at, of the last 90 days, newest day first, at most 20 a page. Empty when your agency has not turned care logs on for you. The read is recorded on the PHI access log.

Parameter In Required Description
limit query no Rows per page (default 20, at most 20; a larger value is served as 20).
offset query no Rows to skip.
  • 200 A page of care logs object
    data array of MeCareLog, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/me/care-logs

Start my care log

As the dashboard's Open care log: starts your care log of the client, day, service and shift with source hcb_app, seeded with the tasks the Work Orders in force plan for the day. One of your Work Orders must plan that client, service and shift on the day (else 422 no_work_order), and the day must be today or up to 90 days back (else 422 service_date_out_of_reach). A day that already has a live care log answers 200 with it, never a second, so a retry is safe; a new one answers 201. A caregiver whose agency has not turned care logs on is 403 care_log_not_enabled; a Visit that is not yours with that client that day 422 visit_mismatch.

Request body (required) application/json object

The day

client_id string, required
The client.
service_date string, required
The day.
service_type string, required
The service, as the Work Order's.
shift_number integer
The shift, 1 to 4 (default 1).
visit_id string
Your Visit to link, with the same client on the same day. Left out, the day's one such Visit is linked when exactly one exists.
  • 200 The care log already holding the day object
    data MeCareLogDetail, required
  • 201 The care log started object
    data MeCareLogDetail, required
  • 403 Code care_log_not_enabled: Forbidden, as the operation's description says. Error
  • 422 Codes no_work_order, service_date_out_of_reach, visit_mismatch: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/me/care-logs/{id}

Read my care log

One of your care logs as its screen shows it: the day with its tasks, times, warnings and live signatures, the signing_hash to attest it under, and the representatives who may sign in the client's place. The read is recorded on the PHI access log. Another caregiver's care log, another agency's, or one more than 90 days back is 404, whatever the body holds. A caregiver whose agency has not turned care logs on is 403 care_log_not_enabled.

Parameter In Required Description
id path yes
  • 200 The care log object
    data MeCareLogDetail, required
  • 403 Code care_log_not_enabled: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/care-logs/{id}/attestation

The client attests my care log

As the screen's signature step: the client, or their representative (one the care log lists, by signer_relation_id, or someone else by signer_name), signs the day on your phone (channel app), which signs and locks it, finishes it when it was not, and marks the linked Visit client-signed. The same signature again answers the care log unchanged. Refusals: 409 content_changed (the day changed since the client read it), 409 role_already_signed (a different signature holds the client's line), 409 voided, 422 invalid_image (not base64, not a PNG, or too large), 422 validation_failed (a signer_relation_id that is not one of the client's representatives). Another caregiver's care log, another agency's, or one more than 90 days back is 404, whatever the body holds. A caregiver whose agency has not turned care logs on is 403 care_log_not_enabled.

Parameter In Required Description
id path yes

Request body (required) application/json object

The signature

capture_method string
drawn (the default) or initials.
expected_content_hash string
The signing_hash of the day the client read; a day changed since is refused with 409 content_changed.
image string, required
The signature as a base64 PNG, at most 51200 bytes.
role string
Who signs: the client (the default) or their representative in their place.
signer_name string
A representative's attestation by someone the office did not record: their name, signed with no relationship. With neither this nor signer_relation_id, the first listed representative signs, else "Representative". A client signs under their own name.
signer_relation_id string
A representative's attestation: the relation_id of one of the representatives the care log lists, whose name and relationship it is signed under (signer_name is then ignored). One the list does not hold is 422 validation_failed.
  • 200 The care log, signed object
    data MeCareLogDetail, required
  • 403 Code care_log_not_enabled: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes content_changed, role_already_signed: Conflict, as the operation's description says. Error
  • 422 Codes invalid_image, validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/care-logs/{id}/attestation-skip

The client cannot sign my care log

As the screen's Client can't sign: keeps why, finishes the day when it was not, and leaves it a draft for the office to collect a signature. The same reason again writes nothing. A reason not listed is 422 validation_failed, and other needs a note. A care log that is not a draft answers 409 record_locked and nothing changes. Another caregiver's care log, another agency's, or one more than 90 days back is 404, whatever the body holds. A caregiver whose agency has not turned care logs on is 403 care_log_not_enabled.

Parameter In Required Description
id path yes

Request body (required) application/json object

Why

note string
The reason in words; required for other.
reason string, required
Why the client could not sign.
  • 200 The care log object
    data MeCareLogDetail, required
  • 403 Code care_log_not_enabled: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/care-logs/{id}/finish

Finish my care log

Marks the care log finished, once; finishing a finished care log changes nothing. Warnings never refuse it. The client's attestation (or attestation-skip) finishes it too. A care log that is not a draft answers 409 record_locked and nothing changes. Another caregiver's care log, another agency's, or one more than 90 days back is 404, whatever the body holds. A caregiver whose agency has not turned care logs on is 403 care_log_not_enabled.

Parameter In Required Description
id path yes
  • 200 The care log object
    data MeCareLogDetail, required
  • 403 Code care_log_not_enabled: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/care-logs/{id}/tasks

Add a task I did to my care log

As the screen's Add a task I did: adds a task done off the plan (planned false, status done), with the reason it was done when sent. A task the care log already holds is set done instead, so a retried add writes nothing new. A task that is not the agency's or a system one is 422 task_definition_not_found. A care log that is not a draft answers 409 record_locked and nothing changes. Another caregiver's care log, another agency's, or one more than 90 days back is 404, whatever the body holds. A caregiver whose agency has not turned care logs on is 403 care_log_not_enabled.

Parameter In Required Description
id path yes

Request body (required) application/json object

The task

count integer
How many times; 1 when left out.
reason_code string
Why it was done off the plan.
reason_note string
The reason in words.
task_definition_id string, required
The task to add: one of the agency's tasks or a system one.
  • 200 The care log object
    data MeCareLogDetail, required
  • 403 Code care_log_not_enabled: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • 422 Code task_definition_not_found: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/care-logs/{id}/tasks/{task_id}/mark

Mark a task on my care log

As the screen's Done, Refused and Not needed buttons: SETS the task's status, reason and count; a mark that changes nothing writes nothing. A task the care log does not hold is 422 task_not_on_log (add it with POST /me/care-logs/{id}/tasks). A care log that is not a draft answers 409 record_locked and nothing changes. Another caregiver's care log, another agency's, or one more than 90 days back is 404, whatever the body holds. A caregiver whose agency has not turned care logs on is 403 care_log_not_enabled.

Parameter In Required Description
id path yes
task_id path yes The task's task_definition_id, as the care log's tasks list it.

Request body (required) application/json object

The mark

count integer
How many times; unchanged when left out.
expect_status string
The status the app showed; sent (null included), the mark is refused with 409 stale_record when the task no longer has it, so a clear re-sent after the office changed the task changes nothing.
reason_code string
Why a task was refused or not needed; left out or null clears it, as a mark on the screen does.
reason_note string
The reason in words; left out or null clears it.
status string, required
The status to SET: done, refused or not_needed; null clears it. Sending the status the task already has changes nothing.
  • 200 The care log object
    data MeCareLogDetail, required
  • 403 Code care_log_not_enabled: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • 422 Code task_not_on_log: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/clock-events

Send clocks recorded offline

Sends up to 100 clocks the app saved while offline. Each is processed on its own, and one failing never stops the others; each is recorded at its captured_at, as a clock-in or clock-out sent online would be. Only your own visits within 90 days back are reached, as the live clock reaches: any other visit fails as visit_not_found, as the live clock answers 404,. Events carrying captured_at in Unix milliseconds run oldest first among themselves; an event without one keeps its place. An id that is not a string is invalid_event, answered with a null id. Clocks only: a task_toggle event is unknown_action. An empty batch is not counted against the hourly limit. Resending an event already recorded reports it in synced and records nothing twice. More than 100 events is 422 and processes none; more than 100 batches in an hour, counted with the caregiver web app's, is 429.

Request body (required) application/json MeClockEventsInput

The events

  • 200 What synced and what failed object
    data object, required
    data.failed array of object, required
    Events not recorded, each with why; keep them and retry those that can succeed.
    data.failed[].error string
    visit_not_found (not one of your visits within reach), unknown_action, invalid_event (an id that is not a string; answered with a null id), clock_in_required, visit_not_clockable (the visit was closed and the server could not keep the clock: retry), sync_failed (retry), clock_in_failed or clock_out_failed.
    data.failed[].id string
    data.synced array of string, required
    Ids of events recorded, already recorded, or kept for the office because the visit was closed: drop them.
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • 429 Too Many Requests, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/me/devices

My signed-in devices

The devices the caregiver is signed in on, most recently used first; current marks the one asking.

Parameter In Required Description
limit query no Rows per page (default 20, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 A page of devices object
    data array of MeDevice, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

DELETE /api/v1/me/devices/{id}

Sign a device out

Signs one of the caregiver's devices out, this one included, and stops its push notifications. Another caregiver's device, or one already signed out, is 404.

Parameter In Required Description
id path yes
  • 204 Signed out
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/half-month-summaries

Open my half-month summary

As the half-month screen: the live summary of the client, you, the service and the half, or a new draft of it, re-read from the evidence grid, with the signing date, the lines signed, and the representatives who may sign the client's line in their place. Repeating it answers the same summary. A period_start that is not the 1st or the 16th is 422 validation_failed; so is a service_type left out on a half with care for more than one service, and one left out on a half with no care recorded and no summary yet (nothing to sign). The read is recorded on the PHI access log. A client you have neither an assignment with nor a care log for in the half, another caregiver's summary, or another agency's is 404, whatever the body holds.

Request body (required) application/json object

The half

client_id string, required
The client.
period_start string, required
The half's first day, YYYY-MM-DD: the 1st or the 16th.
service_type string
The service the summary attests: the client signs one per service. Left out, the half's only service; a half with care for two services, or with none recorded and no summary yet, is 422 validation_failed.
  • 200 The summary object
    data MeHalfMonthSummary, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/half-month-summaries/{id}/client-skip

The client can't sign my half-month summary

As the half-month screen's "Client can't sign": records why the client could not sign, and your signed line then completes the half and stores its true copy. The same reason again answers the summary unchanged. Refusals: 409 caregiver_not_signed (your line is not signed yet), 409 record_locked (the client's or a representative's line is signed, or the half is already complete), 409 voided, 422 validation_failed (a reason that is not one of the list). A client you have neither an assignment with nor a care log for in the half, another caregiver's summary, or another agency's is 404, whatever the body holds.

Parameter In Required Description
id path yes

Request body (required) application/json object

Why

reason string, required
Why the client could not sign.
  • 200 The summary object
    data HalfMonthSummary, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes caregiver_not_signed, record_locked: Conflict, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/half-month-summaries/{id}/signatures

Sign my half-month summary

As the half-month screen's pads: signs a line on your phone (channel app). Your line first; then the client's, or a representative's in their place: one the summary lists (signer_relation_id), or someone else by name (signer_name). The first signature freezes the half. The same signature again answers the summary unchanged. Refusals: 422 signature_period_not_reached (before the 15th for a first half, the 20th for a second), 409 content_changed (the half changed since it was read), 409 role_already_signed (a different signature holds the line), 409 record_locked (every line is signed), 409 voided, 422 invalid_image, 422 validation_failed (a signer_relation_id that is not one of the client's representatives). A client you have neither an assignment with nor a care log for in the half, another caregiver's summary, or another agency's is 404, whatever the body holds.

Parameter In Required Description
id path yes

Request body (required) application/json object

The signature

capture_method string
drawn (the default) or initials.
expected_content_hash string
The signing.hash of the half the signer read; a half changed since is refused with 409 content_changed.
image string, required
The signature as a base64 PNG, at most 51200 bytes.
role string, required
The line signed: yours first, then the client's or their representative's.
signer_name string
A representative's line signed by someone the office did not record: their name, signed with no relationship. With neither this nor signer_relation_id, the first listed representative signs, else "Representative".
signer_relation_id string
A representative's line: the relation_id of one of the representatives the summary lists, whose name and relationship it is signed under (signer_name is then ignored). One the list does not hold is 422 validation_failed.
  • 200 The summary object
    data HalfMonthSummary, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes content_changed, record_locked, role_already_signed: Conflict, as the operation's description says. Error
  • 422 Codes invalid_image, signature_period_not_reached, validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/me/notifications

My notifications

The caregiver's notifications, newest first, without dismissed ones unless dismissed=true.

Parameter In Required Description
limit query no Rows per page (default 20, at most 100; a larger value is served as 100).
offset query no Rows to skip.
type query no Only notifications of this type.
dismissed query no true to include dismissed notifications.
  • 200 A page of notifications object
    data array of MeNotification, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/me/notifications/read-all

Mark every notification read

  • 200 How many were marked object
    data object, required
    data.marked integer, required
  • default An error, in the shared envelope. Error

POST /api/v1/me/notifications/{id}/dismiss

Dismiss a notification

Dismisses it, which also marks it read.

Parameter In Required Description
id path yes
  • 200 The notification object
    data MeNotification, required
  • default An error, in the shared envelope. Error

POST /api/v1/me/notifications/{id}/read

Mark a notification read

Parameter In Required Description
id path yes
  • 200 The notification object
    data MeNotification, required
  • default An error, in the shared envelope. Error

PATCH /api/v1/me/pin

Change my PIN

Changes the caregiver's PIN. A wrong current_pin answers 422 invalid_current_pin and counts as one failed sign-in; repeated failures answer 429 rate_limited with a Retry-After header. A new PIN that is not six digits, or is repeated or sequential, answers 422 validation_failed naming new_pin and counts nothing. On success this device stays signed in, and every other device and web app session of the caregiver is signed out.

Request body (required) application/json MePinChange

The PINs

  • 204 Changed
  • 422 Codes invalid_current_pin, validation_failed: Unprocessable Content, as the operation's description says. Error
  • 429 Code rate_limited: Too Many Requests, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/push-tokens

Register this device for push

Registers this device's push token: an APNs device token (platform ios) or an FCM registration token (platform android). 201 the first time, 200 when this device registers again (the same token, or a new one replacing it). The same token registered from an earlier sign-in stops there.

Request body (required) application/json object

The token

platform string, required
token string, required
  • 200 Registered again object
    data object, required
    data.platform string, required
    data.registered_at string, required
    When this device's token was last registered.
  • 201 Registered object
    data object, required
    data.platform string, required
    data.registered_at string, required
    When this device's token was last registered.
  • default An error, in the shared envelope. Error

DELETE /api/v1/me/push-tokens/current

Stop push to this device

Stops native push to this device; signing out does the same.

  • 204 Stopped
  • default An error, in the shared envelope. Error

GET /api/v1/me/refused-clocks

My refused clocks

Your clocks the server kept in the last 30 days that a cancelled, completed or verified visit refused, which the server kept and passed to the office (US-98.14): the clock-in or clock-out answered 422 visit_not_clockable. Newest first; reviewed_at is set once the office has handled it. On visits not deleted.

Parameter In Required Description
limit query no Rows per page (default 20, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 A page of refused clocks object
    data array of MeRefusedClock, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 422 Code visit_not_clockable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/me/visits

My visits

The signed-in caregiver's visits with a service date from date_from to date_to (date_from defaults to date_to, else today in Colorado; date_to defaults to date_from), not cancelled, in date order, then scheduled start. At most 31 days at once, starting no more than 90 days before today.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
date_from query no First service date (YYYY-MM-DD).
date_to query no Last service date (YYYY-MM-DD).
  • 200 A page of visits object
    data array of MeVisit, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

GET /api/v1/me/visits/{id}

One of my visits

A visit of the signed-in caregiver, with the client's address and geofence and its clock-in and clock-out once recorded. A cancelled or deleted visit is still returned, with its status and deleted_at, so an app holding its id learns what became of it. Another caregiver's visit, or one more than 90 days back, is 404.

Parameter In Required Description
id path yes
  • 200 The visit object
    data MeVisitDetail, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/visits/{id}/clock-in

Clock in

Records the clock-in with the device's location. Whatever the device sends is recorded, with warnings, never refused: no_gps, low_accuracy, moderate_accuracy, suspicious_accuracy, outside_geofence, invalid_coordinates, unknown_accuracy, invalid_captured_at, captured_at_out_of_range, late_sync, manual, outside_schedule, before_clock_in. A captured_at that is not Unix milliseconds, ahead of now, or before the visit existed is recorded at the server's time. A second clock-in answers 200 with the first. A visit not scheduled or in progress takes no clock: 422 visit_not_clockable, nothing recorded on the visit; the clock is kept for the office (US-98.14), and the message says so; when it could not be kept the code is visit_not_clockable_not_kept, so keep the clock and retry.

Parameter In Required Description
id path yes

Request body application/json MeClockInput

Where and when

  • 200 Already recorded: the existing call, nothing created object
    data MeClockResult, required
  • 201 Recorded object
    data MeClockResult, required
  • 422 Code visit_not_clockable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/visits/{id}/clock-out

Clock out

Records the clock-out, as clock-in does, and sets the visit's actual_end_time. A visit not clocked in is 422 clock_in_required; one timed at or before the clock-in is recorded with before_clock_in and bills no hours. A closed visit answers as clock-in does: 422 visit_not_clockable with the clock kept for the office, or visit_not_clockable_not_kept, so keep the clock and retry.

Parameter In Required Description
id path yes

Request body application/json MeClockInput

Where and when

  • 200 Already recorded: the existing call, nothing created object
    data MeClockResult, required
  • 201 Recorded object
    data MeClockResult, required
  • 422 Codes clock_in_required, visit_not_clockable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/me/visits/{id}/signatures

Capture a signature on my visit

Keeps the client's or your signature (or initials) on one of your visits, as a PNG; a client signature marks the visit client-signed. A visit holds one signature per signer: sending one it already holds, without replace, answers 200 with it whatever the visit's status since, so a retry is safe. A first signature is kept on any visit not cancelled, a late offline sync included; replace: true replaces the held one only while the visit is scheduled, in progress or completed (else 422 visit_not_signable), answering 200, and a replacement identical to the one held answers it unchanged. A cancelled visit takes no first signature (422 visit_not_signable). captured_at is believed as a clock's is (not ahead of now, not before the visit existed, else the server's time). The input is judged first: an image that is not base64, not a PNG, or larger than 51200 bytes is 422 invalid_image, a signer_name over 255 characters 422 invalid_signer_name, a replace that is not a boolean 422 invalid_replace. Another caregiver's visit, a deleted one, or one more than 90 days back is 404.

Parameter In Required Description
id path yes

Request body (required) application/json object

The signature

captured_at number
When it was signed, in Unix milliseconds; omit for now.
image string, required
The signature as a base64 PNG of at most 51200 bytes once decoded.
replace boolean
true replaces the visit's signature from this signer; otherwise a second one answers 200 with the one it holds.
signature_type string, required
signer_name string, required
The signer's name.
signer_type string, required
  • 200 The signature the visit holds, or the one replaced object
    data MeSignature, required
  • 201 The new signature object
    data MeSignature, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes invalid_image, invalid_replace, invalid_signer_name, visit_not_signable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/me/visits/{id}/signatures/{signature_id}/image

A signature's image

The PNG of a signature on one of your visits, never cached. Any other visit or signature is 404.

Parameter In Required Description
id path yes
signature_id path yes The signature's id.
  • 200 The PNG string
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Caregiver records

DELETE /api/v1/caregivers/{id}/app-pin

Reset a caregiver's app PIN

As the caregiver page's Reset PIN does: a new PIN replaces the old one and the caregiver's app sessions end. The new PIN is never returned (PRD 5.8); set one with PUT, or reset it on the caregiver page to see it.

Parameter In Required Description
id path yes
  • 200 The PIN status object
    data object, required
    data.app_pin_set boolean
    Whether the caregiver has an app PIN.
    data.caregiver_id string, required
    The caregiver.
    data.telephony_pin_set boolean
    Whether the caregiver has a telephony PIN (the PIN is never returned).
  • default An error, in the shared envelope. Error

PUT /api/v1/caregivers/{id}/app-pin

Set a caregiver's app PIN

As the caregiver page's Set PIN does: the caregiver signs in to the app with it. A PIN the rules refuse (length, digits, a trivial sequence) is 422.

Parameter In Required Description
id path yes

Request body (required) application/json object

The PIN

new_pin string, required
The PIN.
  • 200 The PIN status object
    data object, required
    data.app_pin_set boolean
    Whether the caregiver has an app PIN.
    data.caregiver_id string, required
    The caregiver.
    data.telephony_pin_set boolean
    Whether the caregiver has a telephony PIN (the PIN is never returned).
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/compliance-items

Get a caregiver's compliance record

The Compliance tab's credentials, dates and custom items; data is null when none is recorded yet.

Parameter In Required Description
id path yes
  • 200 The record object
    data object, required
    data.caps_date string
    As the Compliance tab names it.
    data.caps_expiry string
    As the Compliance tab names it.
    data.caregiver_id string, required
    The caregiver.
    data.criminal_background_date string
    As the Compliance tab names it.
    data.criminal_background_expiry string
    As the Compliance tab names it.
    data.custom_items object
    The agency's custom checklist items by key, each {date, expiry, completed}; the keys sent are set and the others kept.
    data.dora_date string
    As the Compliance tab names it.
    data.dora_expiry string
    As the Compliance tab names it.
    data.driver_license_expiry string
    As the Compliance tab names it.
    data.id string, required
    The record's id.
    data.lock_version integer, required
    Its version; send it back to change it.
    data.main_training_date string
    As the Compliance tab names it.
    data.main_training_expiry string
    As the Compliance tab names it.
    data.notes string
    Notes, up to 2000 characters.
    data.updated_at string
    When it last changed.
  • default An error, in the shared envelope. Error

PATCH /api/v1/caregivers/{id}/compliance-items

Change a caregiver's compliance record

As the Compliance tab's Save does: sets the fields sent, and the custom items by key. Send the lock_version it was read with; a newer one is 409.

Parameter In Required Description
id path yes

Request body (required) application/json object

What to change

caps_date string
As the Compliance tab names it.
caps_expiry string
As the Compliance tab names it.
criminal_background_date string
As the Compliance tab names it.
criminal_background_expiry string
As the Compliance tab names it.
custom object
The agency's custom checklist items by key, each {date, expiry, completed}; the keys sent are set and the others kept.
dora_date string
As the Compliance tab names it.
dora_expiry string
As the Compliance tab names it.
driver_license_expiry string
As the Compliance tab names it.
lock_version integer
On a change: the lock_version it was read with.
main_training_date string
As the Compliance tab names it.
main_training_expiry string
As the Compliance tab names it.
notes string
Notes, up to 2000 characters.
  • 200 The record object
    data object, required
    data.caps_date string
    As the Compliance tab names it.
    data.caps_expiry string
    As the Compliance tab names it.
    data.caregiver_id string, required
    The caregiver.
    data.criminal_background_date string
    As the Compliance tab names it.
    data.criminal_background_expiry string
    As the Compliance tab names it.
    data.custom_items object
    The agency's custom checklist items by key, each {date, expiry, completed}; the keys sent are set and the others kept.
    data.dora_date string
    As the Compliance tab names it.
    data.dora_expiry string
    As the Compliance tab names it.
    data.driver_license_expiry string
    As the Compliance tab names it.
    data.id string, required
    The record's id.
    data.lock_version integer, required
    Its version; send it back to change it.
    data.main_training_date string
    As the Compliance tab names it.
    data.main_training_expiry string
    As the Compliance tab names it.
    data.notes string
    Notes, up to 2000 characters.
    data.updated_at string
    When it last changed.
  • 409 Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/compliance-items

Record a caregiver's compliance record

As the Compliance tab's first Save does. A caregiver has one: one already recorded is 422 already_recorded with its id in details.compliance_id; change it with PATCH. An expiry before its date is 422.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The record

caps_date string
As the Compliance tab names it.
caps_expiry string
As the Compliance tab names it.
criminal_background_date string
As the Compliance tab names it.
criminal_background_expiry string
As the Compliance tab names it.
custom object
The agency's custom checklist items by key, each {date, expiry, completed}; the keys sent are set and the others kept.
dora_date string
As the Compliance tab names it.
dora_expiry string
As the Compliance tab names it.
driver_license_expiry string
As the Compliance tab names it.
lock_version integer
On a change: the lock_version it was read with.
main_training_date string
As the Compliance tab names it.
main_training_expiry string
As the Compliance tab names it.
notes string
Notes, up to 2000 characters.
  • 201 The record object
    data object, required
    data.caps_date string
    As the Compliance tab names it.
    data.caps_expiry string
    As the Compliance tab names it.
    data.caregiver_id string, required
    The caregiver.
    data.criminal_background_date string
    As the Compliance tab names it.
    data.criminal_background_expiry string
    As the Compliance tab names it.
    data.custom_items object
    The agency's custom checklist items by key, each {date, expiry, completed}; the keys sent are set and the others kept.
    data.dora_date string
    As the Compliance tab names it.
    data.dora_expiry string
    As the Compliance tab names it.
    data.driver_license_expiry string
    As the Compliance tab names it.
    data.id string, required
    The record's id.
    data.lock_version integer, required
    Its version; send it back to change it.
    data.main_training_date string
    As the Compliance tab names it.
    data.main_training_expiry string
    As the Compliance tab names it.
    data.notes string
    Notes, up to 2000 characters.
    data.updated_at string
    When it last changed.
  • 422 Code already_recorded: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/evaluations

List a caregiver's evaluations

The caregiver's evaluations, newest first. A caregiver of another agency, or a deleted one, is 404.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of evaluations object
    data array of CaregiverEvaluation, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/evaluations

Record a caregiver's evaluation

Records one evaluation. One already on file is 422 already_recorded with its id in details.evaluation_id. A caregiver of another agency, or a deleted one, is 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json CaregiverEvaluationInput

The evaluation

  • 201 Recorded object
    data CaregiverEvaluation, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code already_recorded: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/file-checklist

Get a caregiver's Employee File checklist

The Employee File tab's checklist: the agency's active items, each done or not with its date and notes, and when it was last reviewed. Created on first read, as the tab does.

Parameter In Required Description
id path yes
  • 200 The checklist object
    data object, required
    data.caregiver_id string, required
    The caregiver.
    data.completed integer
    How many items are done.
    data.id string, required
    The record's id.
    data.items array of object, required
    The agency's active items, in its order.
    data.items[].completed boolean, required
    Whether it is done.
    data.items[].date string
    Its date, as entered.
    data.items[].key string, required
    The item's key.
    data.items[].notes string
    Its notes.
    data.items[].text string, required
    What it asks for.
    data.last_reviewed_at string
    When it was last reviewed.
    data.lock_version integer, required
    Its version.
    data.percentage number
    completed of total, in percent.
    data.reviewed_by_id string
    Who reviewed it.
    data.total integer
    How many items there are.
  • default An error, in the shared envelope. Error

PATCH /api/v1/caregivers/{id}/file-checklist

Set items of a caregiver's Employee File checklist

As ticking a box or entering a date or note on the tab does, for several items at once, all or none: items maps an item key to the fields to set (completed, date, notes; a blank date or note clears it). A key the agency has hidden is 422 hidden_item, any other unknown key 422 unknown_item. A concurrent change is merged per field and retried once; still stale is 409.

Parameter In Required Description
id path yes

Request body (required) application/json object

The items

items object, required
Item key => {completed, date, notes}; a blank date or note clears it. Keys are get_caregiver_file_checklist's.
  • 200 The checklist object
    data object, required
    data.caregiver_id string, required
    The caregiver.
    data.completed integer
    How many items are done.
    data.id string, required
    The record's id.
    data.items array of object, required
    The agency's active items, in its order.
    data.items[].completed boolean, required
    Whether it is done.
    data.items[].date string
    Its date, as entered.
    data.items[].key string, required
    The item's key.
    data.items[].notes string
    Its notes.
    data.items[].text string, required
    What it asks for.
    data.last_reviewed_at string
    When it was last reviewed.
    data.lock_version integer, required
    Its version.
    data.percentage number
    completed of total, in percent.
    data.reviewed_by_id string
    Who reviewed it.
    data.total integer
    How many items there are.
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes hidden_item, unknown_item: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/file-checklist/review

Mark a caregiver's Employee File checklist reviewed

As the tab's Mark reviewed does, by the caller. Send the lock_version the checklist was read with to review what was read: one changed since is 409.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

The version reviewed

lock_version integer
The lock_version it was read with.
  • 200 The checklist object
    data object, required
    data.caregiver_id string, required
    The caregiver.
    data.completed integer
    How many items are done.
    data.id string, required
    The record's id.
    data.items array of object, required
    The agency's active items, in its order.
    data.items[].completed boolean, required
    Whether it is done.
    data.items[].date string
    Its date, as entered.
    data.items[].key string, required
    The item's key.
    data.items[].notes string
    Its notes.
    data.items[].text string, required
    What it asks for.
    data.last_reviewed_at string
    When it was last reviewed.
    data.lock_version integer, required
    Its version.
    data.percentage number
    completed of total, in percent.
    data.reviewed_by_id string
    Who reviewed it.
    data.total integer
    How many items there are.
  • 409 Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/oig-checks

List a caregiver's OIG exclusion checks

Newest first, as the caregiver page's OIG history lists them.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of checks object
    data array of object, required
    data[].caregiver_id string, required
    The caregiver.
    data[].checked_by string
    Who recorded it.
    data[].checked_on string, required
    The day the LEIE was checked.
    data[].id string, required
    The record's id.
    data[].inserted_at string
    When it was recorded.
    data[].notes string
    Notes.
    data[].result string, required
    data[].source string
    Recorded by a person or by a screen run.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/oig-checks

Record a caregiver's OIG exclusion check

As the caregiver page's Record check does: an attestation of a manual LEIE lookup, clear or excluded, appended to the caregiver's history. A date in the future, or more than a year old, is 422.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The check

checked_on string, required
The day the LEIE was checked, YYYY-MM-DD; not in the future, not over a year ago.
notes string
Notes, e.g. how a match was reconciled.
result string, required
The result.
  • 201 The check object
    data object, required
    data.caregiver_id string, required
    The caregiver.
    data.checked_by string
    Who recorded it.
    data.checked_on string, required
    The day the LEIE was checked.
    data.id string, required
    The record's id.
    data.inserted_at string
    When it was recorded.
    data.notes string
    Notes.
    data.result string, required
    data.source string
    Recorded by a person or by a screen run.
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/pay-rates

List a caregiver's pay rates

Newest first, as the Pay Rates tab's history lists them, current and ended.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of pay rates object
    data array of object, required
    data[].caregiver_id string, required
    The caregiver.
    data[].client_id string
    The client a work rate is for; null is the general rate.
    data[].effective_date string, required
    When it starts.
    data[].end_date string
    When a newer rate of its type ended it.
    data[].id string, required
    The record's id.
    data[].rate string, required
    Dollars an hour.
    data[].rate_type string, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/pay-rates

Add a caregiver's pay rate

As the Pay Rates tab's Add does: the new rate starts on effective_date and ends the caregiver's current rate of its type.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The rate

client_id string
A work rate for this one client: that client's hours are paid at it instead of the general work rate. Absent or null is the general rate.
effective_date string, required
When it starts, YYYY-MM-DD.
rate string, required
Dollars an hour, e.g. 18.50.
rate_type string, required
The kind of rate.
  • 201 The rate object
    data object, required
    data.caregiver_id string, required
    The caregiver.
    data.client_id string
    The client a work rate is for; null is the general rate.
    data.effective_date string, required
    When it starts.
    data.end_date string
    When a newer rate of its type ended it.
    data.id string, required
    The record's id.
    data.rate string, required
    Dollars an hour.
    data.rate_type string, required
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/telephony-pin

Generate a caregiver's telephony PIN

As the caregiver page's Generate PIN does: a new unique PIN replaces any the caregiver had. The PIN itself is never returned (PRD 5.8); the caregiver page shows it.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The PIN status object
    data object, required
    data.app_pin_set boolean
    Whether the caregiver has an app PIN.
    data.caregiver_id string, required
    The caregiver.
    data.telephony_pin_set boolean
    Whether the caregiver has a telephony PIN (the PIN is never returned).
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/trainings

List a caregiver's training records

The caregiver's training records, newest year first, then by course. A caregiver of another agency, or a deleted one, is 404.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of training records object
    data array of CaregiverTraining, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/trainings

Record a caregiver's training record

Records one training record. One already on file is 422 already_recorded with its id in details.training_id. A caregiver of another agency, or a deleted one, is 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json CaregiverTrainingCreate

The training record

  • 201 Recorded object
    data CaregiverTraining, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code already_recorded: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/vaccinations

List a caregiver's vaccination records

The caregiver's vaccination records, newest year first. A caregiver of another agency, or a deleted one, is 404.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of vaccination records object
    data array of CaregiverVaccination, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/vaccinations

Record a caregiver's vaccination record

Records the vaccination for year and vaccination_type: 201 when none was recorded, 200 when it updates the one already recorded. A caregiver of another agency, or a deleted one, is 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json CaregiverVaccinationInput

The vaccination record

  • 200 Updated object
    data CaregiverVaccination, required
  • 201 Recorded object
    data CaregiverVaccination, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/w4-sent-to-payroll

Mark a caregiver's W-4 change sent to payroll

US-102.35: as the Payroll Summary's "Sent to payroll" does, records that the payroll processor was sent the caregiver's changed W-4 filing status or dependents, and clears the change. A caregiver with none waiting answers 422 no_w4_change. With w4_changed_at, a change other than the one waiting now (the W-4 changed again since it was read) answers 409 stale_record and is kept; a w4_changed_at that is not a timestamp answers 400 bad_request. The W-4 values are never returned. Audited against the credential.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

The change as it was read

w4_changed_at string
The time of the change as it was read; refused with 409 stale_record when the W-4 changed again since. Not sent: the change waiting now is marked sent.
  • 200 The change, cleared object
    data object, required
    data.id string, required
    The record's id.
    data.w4_changed_at string, required
    null: the payroll processor has been sent the change.
  • 400 Code bad_request: Bad Request, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code no_w4_change: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/evaluations/{id}

Update a evaluation

Sets only the fields sent; a body that changes nothing is 422 nothing_to_change. Another agency's record is 404.

Parameter In Required Description
id path yes

Request body (required) application/json CaregiverEvaluationInput

The fields to change

  • 200 The evaluation object
    data CaregiverEvaluation, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code nothing_to_change: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/oig-checks/bulk

Record a clear OIG check for every active caregiver

As the compliance dashboard's monthly sweep does: one clear attestation dated checked_on for each active caregiver. Clear only, as on the dashboard: an exclusion match is recorded on that caregiver. Needs caregivers.manage (403 forbidden otherwise). A date in the future, or more than a year old, is 422.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The sweep

checked_on string, required
The day the LEIE was checked, YYYY-MM-DD.
  • 200 What was recorded object
    data object, required
    data.caregivers integer, required
    Active caregivers it covered.
    data.records integer, required
    Records written.
    data.replaced integer
    Existing dates it updated.
    data.skipped integer
    Records left as they were.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/telephony-pins/bulk

Give every active caregiver without one a telephony PIN

As the caregiver list's Assign PINs does. The PINs are never returned (PRD 5.8); the caregiver list exports them. When a draw fails part way, the PINs already assigned stay and incomplete names why; run it again for the rest.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 How many were assigned object
    data object, required
    data.assigned integer, required
    Caregivers given a PIN.
    data.incomplete boolean
    Whether it stopped part way.
    data.reason string
    Why it stopped: no free PIN left (exhausted), a refused audit row rolled back the next assignment (audit_log_failed; the ones before it were kept), or a caregiver changed during the run (stale).
  • default An error, in the shared envelope. Error

POST /api/v1/trainings/bulk-annual-completion

Set annual training complete for every active caregiver

As the compliance dashboard's bulk annual training does, for completed_date's year: by default only courses not yet recorded; replace true also moves dates already recorded. Needs caregivers.manage (403 forbidden otherwise). A year outside 2000 to next year is 422.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The completion

completed_date string, required
The completion date, YYYY-MM-DD; its year is the training year.
replace boolean
Also move dates already recorded.
  • 200 What was written object
    data object, required
    data.caregivers integer, required
    Active caregivers it covered.
    data.records integer, required
    Records written.
    data.replaced integer
    Existing dates it updated.
    data.skipped integer
    Records left as they were.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/trainings/{id}

Update a training record

Sets only the fields sent; a body that changes nothing is 422 nothing_to_change. Another agency's record is 404.

Parameter In Required Description
id path yes

Request body (required) application/json CaregiverTrainingInput

The fields to change

  • 200 The training record object
    data CaregiverTraining, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code nothing_to_change: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/vaccinations/bulk

Update many caregivers' flu vaccinations for a year

As the bulk vaccination page's Save all does: one status per caregiver for the year, all or none. An unknown caregiver is 404 naming it; an invalid entry is 422.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The updates

updates array of object, required
One per caregiver: {caregiver_id, status, vaccination_date, notes}.
updates[].caregiver_id string, required
The caregiver.
updates[].notes string
Notes.
updates[].status string, required
updates[].vaccination_date string
When vaccinated.
year integer, required
The flu season's year.
  • 200 How many were updated object
    data object, required
    data.updated integer, required
    Vaccination records written.
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Caregivers

GET /api/v1/caregivers

List caregivers

The agency's caregivers in name order, deleted ones left out unless include_deleted=true. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
search query no Every word must match a returned name or identifier, case-insensitively. At most 100 characters and 8 words.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
include_deleted query no true also lists deleted records, with deleted_at set, so a sync learns of deletions.
text_status query no Only caregivers whose text_status is this value; cannot_text is every value but can_text.
  • 200 A page of caregivers object
    data array of Caregiver, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers

Create a caregiver

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json CaregiverInput

The caregiver's fields

  • 201 The created caregiver object
    data Caregiver, required
    warnings array of object, required
    What the act was done with that the agency may want to fix; usually empty. Never a refusal: the act was done.
    warnings[].fix object
    Where it is fixed, when a page fixes it.
    warnings[].fix.label string, required
    What the link says.
    warnings[].fix.path string, required
    The app route that fixes it.
    warnings[].id string, required
    The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
    warnings[].message string, required
    For a person to read.
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/caregivers/status

Set one status on several caregivers

US-109.7: sets status on up to 200 of the agency's caregivers, as the caregivers list's bulk Set status does. Each caregiver saves on its own, with its own audit row against the credential, so one refused never undoes another: it is listed in failed with the reason in words. An id that is not this agency's caregiver is failed with name null. A caregiver already at the status counts as updated and writes no audit row. Caregivers carry a lock_version, but a bulk change takes none: each is set as it is when the change reaches it. One caregiver sent twice, in either letter case, is set and counted once. An unknown status or one that is not a string, no ids, more than 200, or an id that is not a string is refused with 422 validation_failed and nothing is written.

Request body (required) application/json CaregiverStatusesUpdate

The caregivers and the status

  • 200 What was set object
    data object, required
    data.failed array of object, required
    Not set, each with the reason in words: an id that is not this agency's caregiver (name null), an archived caregiver, or what the caregiver's card refused.
    data.failed[].id string, required
    The id as sent.
    data.failed[].name string, required
    Last, First; null when no caregiver was found.
    data.failed[].reason string, required
    Why it was not set, in words.
    data.updated integer, required
    Caregivers that now hold the status, those that already did included (no audit row for them).
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}

Get a caregiver

Parameter In Required Description
id path yes
  • 200 The caregiver object
    data Caregiver, required
  • 404 Code not_found: no caregiver with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/caregivers/{id}

Update a caregiver

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json CaregiverInput

The fields to change

  • 200 The updated caregiver object
    data Caregiver, required
    warnings array of object, required
    What the act was done with that the agency may want to fix; usually empty. Never a refusal: the act was done.
    warnings[].fix object
    Where it is fixed, when a page fixes it.
    warnings[].fix.label string, required
    What the link says.
    warnings[].fix.path string, required
    The app route that fixes it.
    warnings[].id string, required
    The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
    warnings[].message string, required
    For a person to read.
  • 404 Code not_found: no caregiver with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the caregiver changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/restore-open-shift-access

Lift a caregiver's open-shift pause

US-122.15, as the coordinator's Restore access does: clears the caregiver's open-shift pause and voids every strike they hold, in one transaction, so the count starts again from zero; one audit row names how many were voided. A caregiver with no pause running and no unvoided strike is left as they are, answered with lifted false and nothing audited. The pause blocks responding to open shifts only; sign-in, clock-in and EVV never stopped. Another agency's caregiver answers 404. Needs open_shifts.administer.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 What was lifted object
    data object, required
    data.caregiver_id string, required
    The record's id.
    data.lifted boolean, required
    False when there was nothing to lift.
    data.voided integer, required
    How many strikes were voided.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Claims

POST /api/v1/batches/from-timesheets

Create a batch from approved timesheets

Bills the approved timesheets among timesheet_ids as one batch, as Billing > Generate batch does: each is mapped to its claims (PAR numbers found), the claims are priced, and the batch validates in the background; it is never submitted automatically. left_out names every selected timesheet not in it, in the order sent, and why (not approved, already billed, no hours, missing billing data); warnings says when charges could not be calculated, and carries every warning Billing > Generate batch shows for the selection (code, message, record_type, record_id, and the dismiss_key of one the agency may dismiss there), less the ones the agency already dismissed on the page, over /api/v1 or over MCP; findings carries the same warnings as findings (rule_id, message, subject_type, subject_id, subject_date, fingerprint, context, dismissible), each one dismissible with POST /api/v1/finding-dismissals as sent; none of them blocks the batch. Refused, creating nothing: 422 critical_issues with the issues when the selection breaks a blocking rule (a missing Medicaid ID or billing code, a strict modifier rule), as the page refuses; 422 nothing_billable with left_out when no selected timesheet has a claim; 409 timesheets_already_exported or stale_record when a selected timesheet was billed or changed meanwhile, or the client, assignment, work order or service authorization its claims bill from changed; 403 submission_blocked when the agency may not submit. 422 timesheet_ids_required when timesheet_ids is not a list of 1 to 500 UUIDs (an id that is not a UUID refuses the whole request). Ids are answered in lower case. Another agency's ids are left out as not approved, and nothing of theirs is read or written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The timesheets

timesheet_ids array of string, required
The approved timesheets to bill (find_timesheets with status approved).
  • 201 The batch, the timesheets left out, and any warning object
    data Batch, required
    findings array of object, required
    findings[].context object
    The inputs the warning was found from beyond its subject.
    findings[].dismissible boolean
    Whether the agency may dismiss it.
    findings[].fingerprint string
    The figures the warning states, as a dismissal names them.
    findings[].message string
    What the warning says.
    findings[].rule_id string
    The warning's rule (batch.hospital_day, say).
    findings[].subject_date string
    The day, for a warning about one day of its subject.
    findings[].subject_id string
    The record's id.
    findings[].subject_type string
    What the warning is about (client, say).
    left_out array of object, required
    left_out[].reason string
    Why it is not in the batch.
    left_out[].timesheet_id string
    The record's id.
    warnings array of object, required
  • 403 Code submission_blocked: Forbidden, as the operation's description says. Error
  • 409 Code timesheets_already_exported: Conflict, as the operation's description says. Error
  • 422 Codes critical_issues, nothing_billable, timesheet_ids_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/batches/{id}

Delete a batch not yet sent

Deletes the batch and its claims, returning its returned timesheets to approved so they can be billed again, as the batch page does. A batch already sent to HCPF, or being sent, answers 422 already_submitted or submission_in_progress; one being validated or generated now 422 not_eligible; the batch of a recurring run already sent 422 run_submitted. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The deleted batch object
    data Batch, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes already_submitted, not_eligible, run_submitted: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/batches/{id}/prepare-resubmissions

Release every refused claim's timesheet in a batch

Releases the returned timesheet of every claim in the batch that can be resubmitted, as the batch page's Prepare all control does, and answers how many timesheets went back to Approved and the claims prepared. Needs billing.manage (403 forbidden otherwise). A batch with none eligible answers 422 no_resubmittable_claims; one whose every eligible claim is blocked by an active claim holding its patient account number 409 all_pan_blocked. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The timesheets released and the claims prepared object
    data object, required
    data.claims array of Claim, required
    data.timesheets_released integer, required
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code all_pan_blocked: Conflict, as the operation's description says. Error
  • 422 Code no_resubmittable_claims: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/batches/{id}/revenue-warnings

List a batch's revenue warnings

Every revenue warning on the batch's claims, in row order, each saying whether a member dismissed it. A warning blocks nothing. The batch's claims are read to the upload's row ceiling, and the warnings paged from them. Another agency's batch is 404.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 The warnings object
    data array of RevenueWarning, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/checks/{number}/reconcile

Mark every claim a check paid reconciled

Marks every unreconciled claim of the agency's paid by the check reconciled, as the payment report's bulk action does, and answers how many it marked (0 when none was left).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
number path yes
  • 200 How many were marked object
    data object, required
    data.check_number string
    data.reconciled integer
    Claims marked.
  • default An error, in the shared envelope. Error

GET /api/v1/claims

List claims

Claims are created by uploading a file to /api/v1/batches. The agency's claims in batch order, and row order within each batch. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
batch_id query no Only claims of this batch.
member query no Only claims whose Medicaid ID or patient name contains this text, case-insensitively. At most 64 characters.
service_date_from query no Only claims whose service period reaches this date or later (YYYY-MM-DD); a period straddling the bound is included.
service_date_to query no Only claims whose service period starts on or before this date (YYYY-MM-DD).
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
  • 200 A page of claims object
    data array of Claim, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

GET /api/v1/claims/{id}

Get a claim

Claims are created by uploading a file to /api/v1/batches.

Parameter In Required Description
id path yes
  • 200 The claim object
    data Claim, required
  • 404 Code not_found: no claim with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/claims/{id}

Correct an uploaded claim

Changes the fields sent on a rejected or denied claim from an uploaded file and validates it again, as the batch page's correction form does. A reason is required. Needs billing.manage (403 forbidden otherwise), as the page does. A claim built from a returned timesheet answers 422 timesheet_derived; one HCPF holds as paid 422 held_as_paid; any other status 422 not_editable. validation_errors names what is still wrong; the correction is saved either way. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
id path yes

Request body (required) application/json object

The changes and the reason

charge_amount string
Amount billed.
diagnosis_code_1 string
The diagnosis code; null or blank clears it.
member_id string
The Medicaid member id.
modifier_1 string
A modifier; null or blank clears it.
modifier_2 string
A modifier; null or blank clears it.
modifier_3 string
A modifier; null or blank clears it.
modifier_4 string
A modifier; null or blank clears it.
par_number string
The prior authorization request number; null or blank clears it.
place_of_service string
The place of service code.
procedure_code string
The procedure code, e.g. T1019.
reason string, required
Why the claim is corrected; kept on its audit trail.
service_date_from string
YYYY-MM-DD.
service_date_to string
YYYY-MM-DD.
units string
Units billed.
  • 200 The claim object
    data Claim, required
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes held_as_paid, not_editable, timesheet_derived: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/claims/{id}/evv-correction

Undo a claim's EVV unit correction

Restores the units and charge the claim billed before its EVV unit correction and validates it again, as the batch drawer's Undo does. A claim with no correction to undo answers 422 no_correction; one whose units or charge changed since the correction 409 changed_since. A claim already sent to HCPF, or whose batch is being sent, answers 422 already_sent; one whose batch is being checked, has its 837 built, or failed or was cancelled, but never went to HCPF, 422 batch_not_open; one not compared with EVV visits (a spreadsheet claim, a live-in caregiver, a code with no unit rule, no verified visits in its dates) 422 not_checkable; one whose verified visits add up to 0 units 422 no_evv_units; a batch being changed right now 409 busy. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The claim object
    data Claim, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Code changed_since: Conflict, as the operation's description says. Error
  • 422 Codes already_sent, batch_not_open, no_correction, no_evv_units, not_checkable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/claims/{id}/evv-correction

See what using a claim's EVV units would change

The claim's billed units beside the units its verified EVV visits add up to, the counted visits, its charge now and at the EVV units, as the batch drawer's Use EVV units shows them. refusal is null when POST would succeed now, and otherwise the code and message it would answer; correction is the live correction, which DELETE undoes. Nothing changes. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 What would change object
    data object, required
    data.billed_units string, required
    Units the claim bills now.
    data.claim_id string, required
    The record's id.
    data.correction object, required
    A claim's units set to its verified EVV visits' units, and the figures before.
    data.correction.applied_at string
    data.correction.applied_by_id string
    The record's id.
    data.correction.batch_id string
    The record's id.
    data.correction.claim_id string
    The record's id.
    data.correction.evv_units integer
    Units the verified EVV visits add up to.
    data.correction.from_charge string
    Charge before.
    data.correction.from_units string
    Units the claim billed before.
    data.correction.id string
    The record's id.
    data.correction.to_charge string
    Charge after, at the claim's own price per unit.
    data.correction.to_units string
    Units it bills after: the EVV units.
    data.correction.undone_at string
    data.correction.undone_by_id string
    The record's id.
    data.correction.visit_ids array of string
    The visits counted.
    data.current_charge string
    The claim's charge now.
    data.evv_units integer
    Units its verified EVV visits add up to; null when it is not compared.
    data.proposed_charge string
    The charge at evv_units, at the claim's own price per unit, rounded to cents; null when it has no charge or bills 0 units, and then applying leaves the charge as it is.
    data.refusal object, required
    Null when applying now would succeed; otherwise what it would answer: code and message.
    data.refusal.code string
    data.refusal.message string
    data.visit_ids array of string, required
    The visits counted.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/claims/{id}/evv-correction

Bill a claim's EVV units

Sets an unsent claim's units to what its verified EVV visits add up to and its charge to the same price per unit, validates it again and keeps the change on its audit trail, as the batch drawer's Bill {evv} units does. The claim's status, its timesheet and its visits do not change. Send the billed_units GET answered: a claim billing anything else, or already corrected, answers 409 changed_since; one already billing its EVV units 422 no_difference. A claim already sent to HCPF, or whose batch is being sent, answers 422 already_sent; one whose batch is being checked, has its 837 built, or failed or was cancelled, but never went to HCPF, 422 batch_not_open; one not compared with EVV visits (a spreadsheet claim, a live-in caregiver, a code with no unit rule, no verified visits in its dates) 422 not_checkable; one whose verified visits add up to 0 units 422 no_evv_units; a batch being changed right now 409 busy. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The units you saw

expected_billed_units string, required
The units the claim bills as you saw them: billed_units from GET /claims/{id}/evv-correction. A claim that bills anything else now answers 409 changed_since and nothing changes.
  • 200 The corrected claim and the correction object
    correction object, required
    A claim's units set to its verified EVV visits' units, and the figures before.
    correction.applied_at string
    correction.applied_by_id string
    The record's id.
    correction.batch_id string
    The record's id.
    correction.claim_id string
    The record's id.
    correction.evv_units integer
    Units the verified EVV visits add up to.
    correction.from_charge string
    Charge before.
    correction.from_units string
    Units the claim billed before.
    correction.id string
    The record's id.
    correction.to_charge string
    Charge after, at the claim's own price per unit.
    correction.to_units string
    Units it bills after: the EVV units.
    correction.undone_at string
    correction.undone_by_id string
    The record's id.
    correction.visit_ids array of string
    The visits counted.
    data Claim, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Code changed_since: Conflict, as the operation's description says. Error
  • 422 Codes already_sent, batch_not_open, no_difference, no_evv_units, not_checkable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/claims/{id}/evv-override

Override a claim's EVV warning

Overrides the claim's EVV warning with a reason, kept on its audit trail, as the batch page does. The reason must be at least 10 characters (422 override_reason_too_short); a claim without an EVV warning answers 422 not_warning_status. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Why the warning is overridden

reason string, required
Why the warning is overridden; at least 10 characters, kept on the claim's audit trail.
  • 200 The claim object
    data Claim, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes not_warning_status, override_reason_too_short: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/claims/{id}/follow-up

Open a follow-up for a denied claim

Opens the follow-up for the claim's client in the month of its first service date, as the denials page's Follow-up control does. One already open for that client and month answers 409 follow_up_exists; a claim naming no client 422 no_client. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 201 The follow-up object
    data object, required
    data.billing_period string, required
    The month followed up, as the follow-ups page names it.
    data.client_id string, required
    The record's id.
    data.completed boolean
    data.id string, required
    The record's id.
    data.month integer
    data.year integer
  • 404 Not Found, as the operation's description says. Error
  • 409 Code follow_up_exists: Conflict, as the operation's description says. Error
  • 422 Code no_client: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/claims/{id}/investigation

Change a denial's investigation status

Sets investigation_status and resolution_notes on a denied claim, as the denials page does. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
id path yes

Request body (required) application/json object

The status and notes

investigation_status string
resolution_notes string
The notes; null or blank clears them.
  • 200 The claim object
    data Claim, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/claims/{id}/prepare-resubmission

Release a refused claim's timesheet for resubmission

Returns the claim's returned timesheet to Approved so it can be corrected and exported again, as the batch page's Release control does, and marks the claim prepared. Needs billing.manage (403 forbidden otherwise), as the page does. A claim already prepared answers 422 already_prepared. A claim that is not rejected or denied answers 422 not_resubmittable; one uploaded from a spreadsheet 422 no_timesheet; one whose returned timesheet another claim already released, whose sibling is still processing or was paid, or whose timesheet is no longer exported 409 already_released_by_sibling, siblings_still_processing, paid_sibling_exists or timesheet_not_exported; one HCPF holds as paid 422 held_as_paid; one a correction replaces 409 already_replaced; one whose patient account number an active claim holds 409 pan_blocked. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The claim object
    data Claim, required
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes already_released_by_sibling, already_replaced, pan_blocked: Conflict, as the operation's description says. Error
  • 422 Codes already_prepared, held_as_paid, no_timesheet, not_resubmittable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/claims/{id}/reconcile

Mark a claim reconciled

Marks the claim reconciled with its payment, as the payment report does. A claim already reconciled keeps its mark. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The claim object
    data Claim, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/claims/{id}/replacement

Create a replacement claim

Creates a corrected copy of the claim in a batch of its own, sent to HCPF as a replacement (or an adjustment of a claim HCPF holds as paid), as the batch page does. A reason is required. Needs billing.manage (403 forbidden otherwise). A claim that already has one answers 409 already_replaced; one whose timesheet can simply be released for resubmission 422 release_available. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The changes and the reason

charge_amount string
Amount billed.
diagnosis_code_1 string
The diagnosis code; null or blank clears it.
member_id string
The Medicaid member id.
modifier_1 string
A modifier; null or blank clears it.
modifier_2 string
A modifier; null or blank clears it.
modifier_3 string
A modifier; null or blank clears it.
modifier_4 string
A modifier; null or blank clears it.
par_number string
The prior authorization request number; null or blank clears it.
place_of_service string
The place of service code.
procedure_code string
The procedure code, e.g. T1019.
reason string, required
Why the claim is corrected; kept on its audit trail.
service_date_from string
YYYY-MM-DD.
service_date_to string
YYYY-MM-DD.
units string
Units billed.
  • 201 The replacement claim and its batch object
    batch Batch, required
    data Claim, required
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code already_replaced: Conflict, as the operation's description says. Error
  • 422 Code release_available: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/claims/{id}/unreconcile

Remove a claim's reconciled mark

As the payment report's toggle does. Another agency's batch or claim answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The claim object
    data Claim, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/denials

List denials

A denial is a claim the remittance did not pay. The agency's denials in payment date, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
member query no Only claims whose Medicaid ID or patient name contains this text, case-insensitively. At most 64 characters.
payment_date_from query no Denials whose payment date is on or between these days. on or after this date (YYYY-MM-DD, Colorado).
payment_date_to query no Denials whose payment date is on or between these days. on or before this date (YYYY-MM-DD, Colorado).
  • 200 A page of denials object
    data array of Denial, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/finding-dismissals

Dismiss a warning

Dismisses any warning by its rule, subject and fingerprint: it is listed as dismissed until its figures change. Dismissing one already dismissed at the same figures answers that dismissal. A fingerprint that is not the subject's current one for the rule (its figures changed since it was listed, or the record is not this agency's) is 409 stale_finding. A rule no warning has is 422 unknown_rule; a warning that refuses (unsendable, or made strict by the agency) or that its rule never lets be dismissed is 422 not_dismissible; a rule that asks why, with no reason of 3 to 500 characters, is 422 reason_required. A credential that may not write is 403. Nothing is written on any refusal.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The warning to dismiss

context object
The inputs the warning was listed with beyond its subject, as it named them.
fingerprint string, required
The warning's fingerprint, as it was listed.
reason string
Why it is dismissed: 3 to 500 characters where the rule asks for one.
rule_id string, required
The warning's rule, as the warning names it (revenue.underpayment, say).
subject_date string
The day, for a warning about one day of its subject.
subject_id string, required
The record the warning is about.
subject_type string, required
What the warning is about, as the warning names it (claim, say).
  • 201 The dismissal object
    data FindingDismissal, required
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code stale_finding: Conflict, as the operation's description says. Error
  • 422 Codes not_dismissible, reason_required, unknown_rule: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/finding-dismissals/{id}/restore

Show a dismissed warning again

Ends the dismissal, so the warning is listed again; the dismissal is kept, with when it was shown again. Another agency's dismissal, or one already shown again, is 404. A credential that may not write is 403.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The dismissal object
    data FindingDismissal, required
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/resubmission-deadlines

List resubmission deadlines

Denied and unpaid claims, the soonest resubmit-by date first, each with the date and what it counts from. A line whose date passed more than 30 days ago is no longer listed. Dismissed lines are left out unless include_dismissed is true.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
within_days query no Only lines due on or before today plus this many days (passed ones included).
include_dismissed query no true to list dismissed lines too, each with dismissed: true.
  • 200 The deadlines object
    data array of ResubmissionDeadline, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

DELETE /api/v1/revenue-warnings/dismissals

Show a dismissed revenue warning again

As the batch page's Show again button: ends the dismissal, so the warning is listed as not dismissed; the dismissal is kept as history. No dismissal of that warning in this agency is 404.

Request body (required) application/json object

The warning to show again

fingerprint string, required
The warning's fingerprint, as it was listed.
kind string, required
The warning's kind, as the warning names it.
subject_id string, required
The claim the warning is about: the warning's claim_id.
  • 204 Shown again
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/revenue-warnings/dismissals

Dismiss a revenue warning

As the batch page's Dismiss button: the warning is listed as dismissed until its figures change. Dismissing one already dismissed answers the existing dismissal. A kind no warning has is 422 unknown_kind. A fingerprint that is not the warning's current one (its figures changed since it was listed) is 409 stale_finding, and nothing is written. Another agency's claim answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The warning to dismiss

fingerprint string, required
The warning's fingerprint, as it was listed.
kind string, required
The warning's kind, as the warning names it.
subject_id string, required
The claim the warning is about: the warning's claim_id.
  • 201 The dismissal object
    data RevenueWarningDismissal, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Code stale_finding: Conflict, as the operation's description says. Error
  • 422 Code unknown_kind: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/underpayments

List underpaid claims

Paid claims HCPF paid less than its published rate for the dates of service says, after the adjustments that lawfully explain short pay, the largest gap first, then the newest paid. Paid dates default to the last 90 days; a range over 366 days is 400. Dismissed rows are left out unless include_dismissed is true. Nothing here blocks a claim.

Parameter In Required Description
paid_from query no First paid date (YYYY-MM-DD). Default 90 days before paid_to.
paid_to query no Last paid date (YYYY-MM-DD). Default today.
include_dismissed query no true also lists dismissed rows, with dismissed true.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 The underpaid claims object
    data array of Underpayment, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    paid_from string, required
    The first paid date read.
    paid_to string, required
    The last paid date read.
    total integer, required
    Every matching row.
    total_gap string, required
    The sum of every listed row's gap, not just this page's.
    truncated boolean, required
    True when the period held more paid claims than one read judges (5000): only the newest-paid were judged. Narrow the dates to see the rest.
  • 400 Bad Request, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Client records

POST /api/v1/calendar-events/{id}/restore

Undo a change to a calendar event

As the Today page's Undo does: puts the event back to the status and due date it had, upcoming or overdue, and clears any completion. A done or dismissed status is 422; use complete or dismiss for those. One changed by another write while this request ran answers 409 stale_record, and nothing is saved.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The state to restore

due_date string
The day it was due, YYYY-MM-DD.
due_time string
The time it was due, HH:MM:SS, Mountain time.
status string, required
The status it had.
  • 200 The event object
    data object, required
    data.client_id string, required
    The client it is about.
    data.completed_at string
    When it was done.
    data.description string
    More about it.
    data.due_date string, required
    The day it is due.
    data.due_time string
    A time of day, HH:MM:SS (Mountain time).
    data.event_type string, required
    data.id string, required
    The record's id.
    data.lock_version integer, required
    Its version.
    data.status string, required
    data.title string, required
    What is due.
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/client-certifications/{id}

Delete a certification period

Removes it, as the Certifications tab does; the audit trail keeps what it was.

Parameter In Required Description
id path yes
  • 200 The deleted certification object
    data ClientCertification, required
  • default An error, in the shared envelope. Error

PATCH /api/v1/client-certifications/{id}

Change a certification period

Send only what changes. An overlap with another period answers 422.

Parameter In Required Description
id path yes

Request body (required) application/json ClientCertificationInput

What to change

  • 200 The certification object
    data ClientCertification, required
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/client-other-services/{id}

Delete a client's other service

Removes it, as the client page does; the audit trail keeps what it was.

Parameter In Required Description
id path yes
  • 200 The deleted other service object
    data ClientOtherService, required
  • default An error, in the shared envelope. Error

PATCH /api/v1/client-other-services/{id}

Change a client's other service

Send only what changes; days replaces the list, and times replaces the map. A refused value answers 422 naming the field.

Parameter In Required Description
id path yes

Request body (required) application/json ClientOtherServiceInput

What to change

  • 200 The other service object
    data ClientOtherService, required
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{client_id}/contacts/{contact_id}/history

Read a client's contact's history

As the People section's History does: the contact's edits, newest first, each with when it was saved, who saved it ("System" when no member is recorded) and the names of the fields it changed; never an old or new value. The contact must hold a relation to the client, current or ended; one that does not answers 404. Needs clients.view; a client outside the caller's reach answers 403 forbidden.

Parameter In Required Description
client_id path yes The client.
contact_id path yes The contact.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of revisions object
    data array of ContactHistoryEntry, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/calendar-events

List a client's calendar events

As the client's Calendar tab lists them: every event, done and dismissed included, earliest due first (by time of day within a date, untimed last). `open=upcoming` keeps the open events due today or later, `open=overdue` the open ones whose date has passed; any other value is 400. Close one with `POST /api/v1/reminders/{id}/complete` or `/dismiss`, whatever its date.

Parameter In Required Description
id path yes
open query no upcoming or overdue; every event when left out.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of events object
    data array of object, required
    data[].client_id string, required
    The client it is about.
    data[].completed_at string
    When it was done.
    data[].description string
    More about it.
    data[].due_date string, required
    The day it is due.
    data[].due_time string
    A time of day, HH:MM:SS (Mountain time).
    data[].event_type string, required
    data[].id string, required
    The record's id.
    data[].lock_version integer, required
    Its version.
    data[].status string, required
    data[].title string, required
    What is due.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Bad Request, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/calendar-events

Add an event to a client's calendar

As the client's Calendar tab's Add Event does: a custom event, upcoming until it is done or dismissed (`POST /api/v1/reminders/{id}/complete` and `/dismiss` close it).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The event

description string
More about it, up to 5000 characters.
due_date string, required
The day it is due, YYYY-MM-DD.
due_time string
The time it is due, HH:MM:SS, Mountain time.
title string, required
What is due, up to 200 characters.
  • 201 The event object
    data object, required
    data.client_id string, required
    The client it is about.
    data.completed_at string
    When it was done.
    data.description string
    More about it.
    data.due_date string, required
    The day it is due.
    data.due_time string
    A time of day, HH:MM:SS (Mountain time).
    data.event_type string, required
    data.id string, required
    The record's id.
    data.lock_version integer, required
    Its version.
    data.status string, required
    data.title string, required
    What is due.
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/certifications

List a client's certification periods

Newest first, as the client's Certifications tab lists them.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of certifications object
    data array of ClientCertification, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/certifications

Record a client's certification period

As the Certifications tab does. A period overlapping another of the client's answers 422 naming effective_date.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json ClientCertificationInput

The period

  • 201 The certification object
    data ClientCertification, required
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/chart

Read a page of a client's chart

As the /clients/:id/chart page: every record the agency holds for the client, newest first (by occurred_on, then when it was made), with each signed record's state, signers, open signature lines, true copy, signed addenda and void; each document's scan status; each care log's source and attestation. A draft is not an entry, except a care log. Another agency's client answers 404; a filter it cannot read answers 400 naming it.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
types query no Record kinds, comma-separated (supervisory_visit, plan_of_care, monthly_client_report, complaint, critical_incident, consent_notice, emergency_information, care_log, half_month_summary, document, legacy_scan); every kind when left out.
service_type query no Only entries of this service (personal_care, homemaker, hma); a kind with no service leaves the page while it is set.
caregiver_id query no Only entries of this caregiver; a kind with no caregiver leaves the page while it is set.
from query no The first date, YYYY-MM-DD, inclusive.
to query no The last date, YYYY-MM-DD, inclusive.
  • 200 A page of the chart object
    data array of object, required
    data[].addenda array of object, required
    The record's signed addenda, in signing order.
    data[].addenda[].body string, required
    What it adds.
    data[].addenda[].id string, required
    The addendum.
    data[].addenda[].reason string
    Why it was added.
    data[].addenda[].signatures array of object, required
    Its live signatures, oldest first.
    data[].addenda[].signatures[].channel string
    Where it was signed.
    data[].addenda[].signatures[].method string, required
    How it was signed.
    data[].addenda[].signatures[].role string, required
    The line signed.
    data[].addenda[].signatures[].role_label string, required
    The line as the record names it, e.g. "complainant".
    data[].addenda[].signatures[].signed_at string, required
    When.
    data[].addenda[].signatures[].signer_name string, required
    Who signed, as given.
    data[].addenda[].signed_at string, required
    When it was signed.
    data[].addenda[].state string
    The addendum's own state.
    data[].addenda[].true_copy object, required
    data[].addenda[].true_copy.document_id string
    The true copy, at /documents/{id}/download, once stored.
    data[].addenda[].true_copy.status string, required
    none for a draft, an incomplete signing or a record signed before the electronic record; pending while the copy is made; stored once filed; failed when it could not be made.
    data[].care_log object
    data[].care_log.attested boolean, required
    Whether the client's attestation is on it: a client or representative signature, or recorded words.
    data[].care_log.source string, required
    Where the log was kept.
    data[].caregiver_id string
    The caregiver.
    data[].caregiver_name string
    The caregiver's name.
    data[].document object
    data[].document.file_name string, required
    Its file name.
    data[].document.id string, required
    The document.
    data[].document.scan_status string, required
    Its virus scan; only a clean document can be downloaded.
    data[].kind string, required
    The kind of record.
    data[].legacy_signed boolean, required
    True for a record signed before the electronic record: its signatures are on paper, and it has no true copy.
    data[].missing_signers array of string, required
    Each required line no live signature fills, e.g. "caregiver or PCP"; empty unless the record is signed or amended.
    data[].occurred_on string, required
    The date the entry is filed under: the visit, effective, service or complaint date, the first of a report's month, the first signature (Mountain) of a notice or emergency information, a scan's paper date, else the upload date (Mountain).
    data[].path string
    The app page the title opens, or a document's download; null for a document whose virus scan is not clean.
    data[].record_id string, required
    The record, or for a document or scan the document.
    data[].service_type string
    The service.
    data[].signatures array of object, required
    The live signatures, oldest first.
    data[].signatures[].channel string
    Where it was signed.
    data[].signatures[].method string, required
    How it was signed.
    data[].signatures[].role string, required
    The line signed.
    data[].signatures[].role_label string, required
    The line as the record names it, e.g. "complainant".
    data[].signatures[].signed_at string, required
    When.
    data[].signatures[].signer_name string, required
    Who signed, as given.
    data[].state string
    The record's state; null for a document.
    data[].title string, required
    The entry's title, as the chart shows it.
    data[].true_copy object, required
    data[].true_copy.document_id string
    The true copy, at /documents/{id}/download, once stored.
    data[].true_copy.status string, required
    none for a draft, an incomplete signing or a record signed before the electronic record; pending while the copy is made; stored once filed; failed when it could not be made.
    data[].void object
    data[].void.actor_name string
    Who voided it; null for an API key.
    data[].void.reason string, required
    Why it was voided.
    data[].void.replaced_by_id string
    The draft made to replace it, when one was made.
    data[].void.voided_at string, required
    When it was voided.
    data[].work_order_id string
    A Monthly Client Report's Work Order.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Bad Request, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/consent-forms

List a client's intake notices

Newest first, the disclosure notices and rights acknowledgements alike.

Parameter In Required Description
id path yes
limit query no Rows per page (default 25, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of notices object
    data array of object, required
    data[].answers object, required
    The answers, by question key: a disclosure item's responsible party (agency or consumer), the complaint contact.
    data[].client_id string, required
    The client.
    data[].declined_reason string
    Why the client declined to sign a disclosure notice; the office then signs that it was conveyed verbally.
    data[].defaulted_keys array of string
    The choices still holding the answer the notice was prefilled with (its first option): defaults nobody has chosen.
    data[].form_type string, required
    agency_disclosure_notice (Chapter 26 6.7) or client_rights_acknowledgement (6.4).
    data[].id string, required
    The record's id.
    data[].inserted_at string
    When the notice was started.
    data[].lock_version integer, required
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data[].missing_signers array of object
    Each required line no live signature fills yet, in order; empty when complete or voided.
    data[].missing_signers[].label string, required
    The line as the page names it, e.g. "client or authorized representative".
    data[].missing_signers[].roles array of string, required
    The roles that would fill the line: any one of them.
    data[].record_state string, required
    draft until the first signature; signed notices are corrected by addendum or void.
    data[].signatures array of object
    The live signatures, oldest first.
    data[].signatures[].method string, required
    How it was signed.
    data[].signatures[].role string, required
    The line signed.
    data[].signatures[].signed_at string, required
    When.
    data[].signatures[].signer_name string, required
    Who signed.
    data[].signed_at string
    When the first signature locked it; null on a draft.
    data[].signing_complete boolean
    True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/consent-forms

Start a client's intake notice

Starts a draft stamped with the agency's current wording, each disclosure item prefilled with its first option (Agency). The client's open draft of that type, when there is one, is returned instead. Another agency's client is 404, before the body is judged.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The notice

form_type string, required
The notice to start.
  • 201 The notice object
    data object, required
    data.answers object, required
    The answers, by question key: a disclosure item's responsible party (agency or consumer), the complaint contact.
    data.client_id string, required
    The client.
    data.declined_reason string
    Why the client declined to sign a disclosure notice; the office then signs that it was conveyed verbally.
    data.defaulted_keys array of string
    The choices still holding the answer the notice was prefilled with (its first option): defaults nobody has chosen.
    data.form_type string, required
    agency_disclosure_notice (Chapter 26 6.7) or client_rights_acknowledgement (6.4).
    data.id string, required
    The record's id.
    data.inserted_at string
    When the notice was started.
    data.lock_version integer, required
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.missing_signers array of object
    Each required line no live signature fills yet, in order; empty when complete or voided.
    data.missing_signers[].label string, required
    The line as the page names it, e.g. "client or authorized representative".
    data.missing_signers[].roles array of string, required
    The roles that would fill the line: any one of them.
    data.record_state string, required
    draft until the first signature; signed notices are corrected by addendum or void.
    data.signatures array of object
    The live signatures, oldest first.
    data.signatures[].method string, required
    How it was signed.
    data.signatures[].role string, required
    The line signed.
    data.signatures[].signed_at string, required
    When.
    data.signatures[].signer_name string, required
    Who signed.
    data.signed_at string
    When the first signature locked it; null on a draft.
    data.signing_complete boolean
    True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/emergency-info

List a client's emergency information revisions

Newest first; the first is the current sheet. Each save is a new revision.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of revisions object
    data array of object, required
    data[].answers object, required
    The answers, by question key.
    data[].client_id string, required
    The client.
    data[].id string, required
    The record's id.
    data[].inserted_at string
    When this revision was saved.
    data[].missing_signers array of object
    Each required line no live signature fills yet, in order; empty when complete or voided.
    data[].missing_signers[].label string, required
    The line as the page names it, e.g. "client or authorized representative".
    data[].missing_signers[].roles array of string, required
    The roles that would fill the line: any one of them.
    data[].record_state string, required
    draft until the first signature (US-101.32). A signed revision is never deleted or changed: it is corrected with an addendum, voided, or followed by a new revision.
    data[].signatures array of object
    The live signatures, oldest first.
    data[].signatures[].method string, required
    How it was signed.
    data[].signatures[].role string, required
    The line signed.
    data[].signatures[].signed_at string, required
    When.
    data[].signatures[].signer_name string, required
    Who signed.
    data[].signed_at string
    When the first signature locked it; null on a draft.
    data[].signing_complete boolean
    True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
    data[].superseded boolean
    True for a draft never signed whose client has a later signed revision: it is no longer the sheet in force, and may still be deleted.
    data[].version integer, required
    Its revision number.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/emergency-info

Save a client's emergency information

Saves a new revision, as the Emergency information page does; answers to questions not sent keep their current value. An answer the form refuses answers 422 naming the question.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The answers

answers object, required
Answers by question key.
  • 201 The revision object
    data object, required
    data.answers object, required
    The answers, by question key.
    data.client_id string, required
    The client.
    data.id string, required
    The record's id.
    data.inserted_at string
    When this revision was saved.
    data.missing_signers array of object
    Each required line no live signature fills yet, in order; empty when complete or voided.
    data.missing_signers[].label string, required
    The line as the page names it, e.g. "client or authorized representative".
    data.missing_signers[].roles array of string, required
    The roles that would fill the line: any one of them.
    data.record_state string, required
    draft until the first signature (US-101.32). A signed revision is never deleted or changed: it is corrected with an addendum, voided, or followed by a new revision.
    data.signatures array of object
    The live signatures, oldest first.
    data.signatures[].method string, required
    How it was signed.
    data.signatures[].role string, required
    The line signed.
    data.signatures[].signed_at string, required
    When.
    data.signatures[].signer_name string, required
    Who signed.
    data.signed_at string
    When the first signature locked it; null on a draft.
    data.signing_complete boolean
    True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
    data.superseded boolean
    True for a draft never signed whose client has a later signed revision: it is no longer the sheet in force, and may still be deleted.
    data.version integer, required
    Its revision number.
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/clients/{id}/health-summary

Delete a client's health summary

As the Medical tab's Delete does; the audit trail keeps it.

Parameter In Required Description
id path yes
  • 200 The deleted summary object
    data object, required
    data.client_id string, required
    The client.
    data.edited_at string
    When it was last edited.
    data.generated_at string
    When it was written.
    data.id string, required
    The record's id.
    data.lock_version integer, required
    Its version; send it back to edit.
    data.model_used string
    The AI model that wrote it.
    data.text string, required
    The summary, in Markdown.
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/health-summary

Get a client's health summary

The AI-written summary on the client's Medical tab. None yet is 404.

Parameter In Required Description
id path yes
  • 200 The summary object
    data object, required
    data.client_id string, required
    The client.
    data.edited_at string
    When it was last edited.
    data.generated_at string
    When it was written.
    data.id string, required
    The record's id.
    data.lock_version integer, required
    Its version; send it back to edit.
    data.model_used string
    The AI model that wrote it.
    data.text string, required
    The summary, in Markdown.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/clients/{id}/health-summary

Edit a client's health summary

As the Medical tab's Edit does: replaces the summary's text. Send the lock_version it was read with; a newer one answers 409.

Parameter In Required Description
id path yes

Request body (required) application/json object

The new text

lock_version integer, required
The lock_version it was read with.
text string, required
The summary, in Markdown.
  • 200 The summary object
    data object, required
    data.client_id string, required
    The client.
    data.edited_at string
    When it was last edited.
    data.generated_at string
    When it was written.
    data.id string, required
    The record's id.
    data.lock_version integer, required
    Its version; send it back to edit.
    data.model_used string
    The AI model that wrote it.
    data.text string, required
    The summary, in Markdown.
  • 409 Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/health-summary

Write or rewrite a client's health summary

As the Medical tab's Generate and Regenerate do: the AI summarises the client's conditions, allergies, medications and surgeries, replacing any summary there was. A client whose medical record lists none of them, and who has no summary yet, is 422 no_conditions. The AI being unavailable is 503 ai_unavailable.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 201 The summary object
    data object, required
    data.client_id string, required
    The client.
    data.edited_at string
    When it was last edited.
    data.generated_at string
    When it was written.
    data.id string, required
    The record's id.
    data.lock_version integer, required
    Its version; send it back to edit.
    data.model_used string
    The AI model that wrote it.
    data.text string, required
    The summary, in Markdown.
  • 422 Code no_conditions: Unprocessable Content, as the operation's description says. Error
  • 503 Code ai_unavailable: Service Unavailable, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/clients/{id}/information-sheet

Update a client's information sheet

Writes the fields sent, as the Information Sheet page's Save does, the client, medical and case manager parts in one transaction; null or blank clears a field, except first_name, last_name and ssn, where it is 422 null_not_allowed. The answer names the fields written; the SSN is never returned.

Parameter In Required Description
id path yes

Request body (required) application/json object

The fields to write

address string
As the Information Sheet names it; null or blank clears it.
allergies string
As the Information Sheet names it; null or blank clears it.
city string
As the Information Sheet names it; null or blank clears it.
clinic_name string
As the Information Sheet names it; null or blank clears it.
date_of_birth string
As the Information Sheet names it; null or blank clears it.
doctor_address string
As the Information Sheet names it; null or blank clears it.
doctor_name string
As the Information Sheet names it; null or blank clears it.
doctor_phone string
As the Information Sheet names it; null or blank clears it.
emergency_contact_name string
As the Information Sheet names it; null or blank clears it.
emergency_contact_phone string
As the Information Sheet names it; null or blank clears it.
field_staff_instructions string
As the Information Sheet names it; null or blank clears it.
first_name string
As the Information Sheet names it; never blank.
gender string
As the Information Sheet names it; null or blank clears it.
home_phone string
As the Information Sheet names it; null or blank clears it.
last_name string
As the Information Sheet names it; never blank.
manager_email string
As the Information Sheet names it; null or blank clears it.
manager_fax string
As the Information Sheet names it; null or blank clears it.
manager_name string
As the Information Sheet names it; null or blank clears it.
manager_phone string
As the Information Sheet names it; null or blank clears it.
medicaid_id string
As the Information Sheet names it; null or blank clears it.
medications string
As the Information Sheet names it; null or blank clears it.
mobile_phone string
As the Information Sheet names it; null or blank clears it.
other_conditions string
As the Information Sheet names it; null or blank clears it.
physical_conditions string
As the Information Sheet names it; null or blank clears it.
ssn string
The client's SSN, never returned; leave it out to keep the stored one.
state string
As the Information Sheet names it; null or blank clears it.
supervisor_name string
As the Information Sheet names it; null or blank clears it.
supervisor_phone string
As the Information Sheet names it; null or blank clears it.
zip string
As the Information Sheet names it; null or blank clears it.
  • 200 What was written object
    data object, required
    data.client_id string, required
    The client.
    data.fields array of string, required
    The fields written.
  • 422 Code null_not_allowed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/medical

Read a client's medical information

The doctor, conditions, allergies, medications, field staff instructions and functional limitations the client page's Medical tab shows; every field null when none were ever saved. The read is recorded on the PHI access log.

Parameter In Required Description
id path yes
  • 200 The medical information object
    data object, required
    data.allergies string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.client_id string, required
    The client.
    data.clinic_name string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.doctor_address string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.doctor_name string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.doctor_phone string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.field_staff_instructions string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.functional_limitations object
    The Functional Limitations checkboxes and their Other text; null when none were ever saved. A write changes only the keys sent.
    data.functional_limitations.breathing boolean
    Whether the client has this limitation.
    data.functional_limitations.hearing boolean
    Whether the client has this limitation.
    data.functional_limitations.mobility boolean
    Whether the client has this limitation.
    data.functional_limitations.other string
    Any other limitation.
    data.functional_limitations.special_diet boolean
    Whether the client has this limitation.
    data.functional_limitations.speech boolean
    Whether the client has this limitation.
    data.functional_limitations.swallowing boolean
    Whether the client has this limitation.
    data.functional_limitations.vision boolean
    Whether the client has this limitation.
    data.medications string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.other_conditions string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.physical_conditions string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.special_needs string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.surgeries string
    As the Medical tab shows it; a blank or null clears it on a write.
  • default An error, in the shared envelope. Error

PATCH /api/v1/clients/{id}/medical

Change a client's medical information

Writes the fields sent, as the Medical tab's Save does, creating the record on the first write; a blank or null clears a field. 422 nothing_to_change for a body with none of these fields. Audited against the credential.

Parameter In Required Description
id path yes

Request body (required) application/json object

The fields to write

allergies string
As the Medical tab shows it; a blank or null clears it on a write.
clinic_name string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_address string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_name string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_phone string
As the Medical tab shows it; a blank or null clears it on a write.
field_staff_instructions string
As the Medical tab shows it; a blank or null clears it on a write.
functional_limitations object
The Functional Limitations checkboxes and their Other text; null when none were ever saved. A write changes only the keys sent.
functional_limitations.breathing boolean
Whether the client has this limitation.
functional_limitations.hearing boolean
Whether the client has this limitation.
functional_limitations.mobility boolean
Whether the client has this limitation.
functional_limitations.other string
Any other limitation.
functional_limitations.special_diet boolean
Whether the client has this limitation.
functional_limitations.speech boolean
Whether the client has this limitation.
functional_limitations.swallowing boolean
Whether the client has this limitation.
functional_limitations.vision boolean
Whether the client has this limitation.
medications string
As the Medical tab shows it; a blank or null clears it on a write.
other_conditions string
As the Medical tab shows it; a blank or null clears it on a write.
physical_conditions string
As the Medical tab shows it; a blank or null clears it on a write.
special_needs string
As the Medical tab shows it; a blank or null clears it on a write.
surgeries string
As the Medical tab shows it; a blank or null clears it on a write.
  • 200 The medical information object
    data object, required
    data.allergies string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.client_id string, required
    The client.
    data.clinic_name string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.doctor_address string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.doctor_name string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.doctor_phone string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.field_staff_instructions string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.functional_limitations object
    The Functional Limitations checkboxes and their Other text; null when none were ever saved. A write changes only the keys sent.
    data.functional_limitations.breathing boolean
    Whether the client has this limitation.
    data.functional_limitations.hearing boolean
    Whether the client has this limitation.
    data.functional_limitations.mobility boolean
    Whether the client has this limitation.
    data.functional_limitations.other string
    Any other limitation.
    data.functional_limitations.special_diet boolean
    Whether the client has this limitation.
    data.functional_limitations.speech boolean
    Whether the client has this limitation.
    data.functional_limitations.swallowing boolean
    Whether the client has this limitation.
    data.functional_limitations.vision boolean
    Whether the client has this limitation.
    data.medications string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.other_conditions string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.physical_conditions string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.special_needs string
    As the Medical tab shows it; a blank or null clears it on a write.
    data.surgeries string
    As the Medical tab shows it; a blank or null clears it on a write.
  • 422 Code nothing_to_change: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/clients/{id}/next-action-snoozes

Undo a Next Actions snooze

As the page's Undo does: the suggestion is back on the caller's Next Actions for that client. A suggestion that was not snoozed answers the same.

Parameter In Required Description
id path yes
suggestion_id query yes The suggestion to bring back.
  • 200 The suggestion object
    data object, required
    data.client_id string, required
    The client.
    data.suggestion_id string, required
    The Next Actions suggestion.
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/next-action-snoozes

Snooze a client's Next Actions suggestion

As the client page's Snooze does: the suggestion leaves the caller's Next Actions for that client until the snooze ends. Snoozing it again moves the end.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The suggestion

days integer
Days to snooze it, 1 to 365. Leave it out for 7, as the page does.
suggestion_id string, required
The Next Actions suggestion.
  • 201 The snooze object
    data object, required
    data.client_id string, required
    The client.
    data.snoozed_until string, required
    When it comes back.
    data.suggestion_id string, required
    The Next Actions suggestion.
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/other-services

List a client's other services

The outside providers serving the client (adult day care, a CNA, an RN, PT, another), oldest first, as the client page lists them.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of other services object
    data array of ClientOtherService, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/other-services

Record a client's other service

As the client page does. No kind, an unknown day or a field past its length answers 422 naming the field.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json ClientOtherServiceInput

The other service

  • 201 The other service object
    data ClientOtherService, required
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/par-check

Get a client's PAR unit check

The client page's PAR panel: the current PAR's units by our arithmetic beside the units on the case manager's letter. A client with no current plan carrying a PAR is 404.

Parameter In Required Description
id path yes
  • 200 The check object
    data object, required
    data.client_id string, required
    The client.
    data.flags array of string
    MI, BI, PLWA: the client's conditions the PAR carries.
    data.other_pars array of object, required
    The client's other current PARs, each with only the services it has a plan for: separate Personal Care and Homemaker PARs are both current (RW1-N2). The top-level check then lists only its own services.
    data.other_pars[].flags array of string
    MI, BI, PLWA: the client's conditions the PAR carries.
    data.other_pars[].par_effective_date string
    The PAR's first day.
    data.other_pars[].par_expiry_date string
    The PAR's last day.
    data.other_pars[].par_number string
    The PAR's number.
    data.other_pars[].services array of object, required
    One column per service, Personal Care, Homemaker, HMA.
    data.other_pars[].services[].base_units string
    (hours_weekly + travel_hours) × weeks × 4, unrounded.
    data.other_pars[].services[].billing_code string
    The billing code.
    data.other_pars[].services[].extra_hours string
    Extra hours a week, for extra_weeks: a second segment.
    data.other_pars[].services[].extra_travel_hours string
    Travel hours a week, counted with extra_hours.
    data.other_pars[].services[].extra_units string
    (extra_hours + extra_travel_hours) × extra_weeks × 4, unrounded.
    data.other_pars[].services[].extra_weeks string
    Weeks the extra hours run. None means the extra adds no units.
    data.other_pars[].services[].extra_without_weeks boolean
    Extra hours are set with no extra_weeks, so add nothing.
    data.other_pars[].services[].hours_weekly string
    Authorized hours a week.
    data.other_pars[].services[].mismatch boolean, required
    total_units and units_on_par disagree.
    data.other_pars[].services[].plan_of_care_id string
    The plan it is read from; none when not authorized.
    data.other_pars[].services[].service string, required
    data.other_pars[].services[].total_units integer
    base_units + extra_units, rounded half-up.
    data.other_pars[].services[].travel_hours string
    Travel hours a week, counted with the hours a week.
    data.other_pars[].services[].units_on_par integer
    The units the case manager's letter carries.
    data.other_pars[].services[].variance integer
    units_on_par less total_units.
    data.other_pars[].weeks string
    The PAR's weeks, as the panel prints them.
    data.par_effective_date string
    The PAR's first day.
    data.par_expiry_date string
    The PAR's last day.
    data.par_number string
    The PAR's number.
    data.services array of object, required
    One column per service, Personal Care, Homemaker, HMA.
    data.services[].base_units string
    (hours_weekly + travel_hours) × weeks × 4, unrounded.
    data.services[].billing_code string
    The billing code.
    data.services[].extra_hours string
    Extra hours a week, for extra_weeks: a second segment.
    data.services[].extra_travel_hours string
    Travel hours a week, counted with extra_hours.
    data.services[].extra_units string
    (extra_hours + extra_travel_hours) × extra_weeks × 4, unrounded.
    data.services[].extra_weeks string
    Weeks the extra hours run. None means the extra adds no units.
    data.services[].extra_without_weeks boolean
    Extra hours are set with no extra_weeks, so add nothing.
    data.services[].hours_weekly string
    Authorized hours a week.
    data.services[].mismatch boolean, required
    total_units and units_on_par disagree.
    data.services[].plan_of_care_id string
    The plan it is read from; none when not authorized.
    data.services[].service string, required
    data.services[].total_units integer
    base_units + extra_units, rounded half-up.
    data.services[].travel_hours string
    Travel hours a week, counted with the hours a week.
    data.services[].units_on_par integer
    The units the case manager's letter carries.
    data.services[].variance integer
    units_on_par less total_units.
    data.weeks string
    The PAR's weeks, as the panel prints them.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/clients/{id}/par-check

Save a client's PAR unit check

As the PAR panel's Save does: writes the figures sent onto the PAR's plans of care, all or none. Send a service's figures under its name; each goes to the current PAR that has a plan for that service (the check or one of other_pars). A figure left out keeps its value, and null or blank clears it. A service no current PAR has a plan for is 422.

Parameter In Required Description
id path yes

Request body (required) application/json object

The figures

hma object
This service's figures: travel_hours, extra_hours, extra_travel_hours, extra_weeks, units_on_par.
hma.extra_hours string
Extra hours a week, for extra_weeks: a second segment.
hma.extra_travel_hours string
Travel hours a week, counted with extra_hours.
hma.extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
hma.travel_hours string
Travel hours a week, counted with the hours a week.
hma.units_on_par integer
The units the case manager's letter carries.
homemaker object
This service's figures: travel_hours, extra_hours, extra_travel_hours, extra_weeks, units_on_par.
homemaker.extra_hours string
Extra hours a week, for extra_weeks: a second segment.
homemaker.extra_travel_hours string
Travel hours a week, counted with extra_hours.
homemaker.extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
homemaker.travel_hours string
Travel hours a week, counted with the hours a week.
homemaker.units_on_par integer
The units the case manager's letter carries.
personal_care object
This service's figures: travel_hours, extra_hours, extra_travel_hours, extra_weeks, units_on_par.
personal_care.extra_hours string
Extra hours a week, for extra_weeks: a second segment.
personal_care.extra_travel_hours string
Travel hours a week, counted with extra_hours.
personal_care.extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
personal_care.travel_hours string
Travel hours a week, counted with the hours a week.
personal_care.units_on_par integer
The units the case manager's letter carries.
  • 200 The check object
    data object, required
    data.client_id string, required
    The client.
    data.flags array of string
    MI, BI, PLWA: the client's conditions the PAR carries.
    data.other_pars array of object, required
    The client's other current PARs, each with only the services it has a plan for: separate Personal Care and Homemaker PARs are both current (RW1-N2). The top-level check then lists only its own services.
    data.other_pars[].flags array of string
    MI, BI, PLWA: the client's conditions the PAR carries.
    data.other_pars[].par_effective_date string
    The PAR's first day.
    data.other_pars[].par_expiry_date string
    The PAR's last day.
    data.other_pars[].par_number string
    The PAR's number.
    data.other_pars[].services array of object, required
    One column per service, Personal Care, Homemaker, HMA.
    data.other_pars[].services[].base_units string
    (hours_weekly + travel_hours) × weeks × 4, unrounded.
    data.other_pars[].services[].billing_code string
    The billing code.
    data.other_pars[].services[].extra_hours string
    Extra hours a week, for extra_weeks: a second segment.
    data.other_pars[].services[].extra_travel_hours string
    Travel hours a week, counted with extra_hours.
    data.other_pars[].services[].extra_units string
    (extra_hours + extra_travel_hours) × extra_weeks × 4, unrounded.
    data.other_pars[].services[].extra_weeks string
    Weeks the extra hours run. None means the extra adds no units.
    data.other_pars[].services[].extra_without_weeks boolean
    Extra hours are set with no extra_weeks, so add nothing.
    data.other_pars[].services[].hours_weekly string
    Authorized hours a week.
    data.other_pars[].services[].mismatch boolean, required
    total_units and units_on_par disagree.
    data.other_pars[].services[].plan_of_care_id string
    The plan it is read from; none when not authorized.
    data.other_pars[].services[].service string, required
    data.other_pars[].services[].total_units integer
    base_units + extra_units, rounded half-up.
    data.other_pars[].services[].travel_hours string
    Travel hours a week, counted with the hours a week.
    data.other_pars[].services[].units_on_par integer
    The units the case manager's letter carries.
    data.other_pars[].services[].variance integer
    units_on_par less total_units.
    data.other_pars[].weeks string
    The PAR's weeks, as the panel prints them.
    data.par_effective_date string
    The PAR's first day.
    data.par_expiry_date string
    The PAR's last day.
    data.par_number string
    The PAR's number.
    data.services array of object, required
    One column per service, Personal Care, Homemaker, HMA.
    data.services[].base_units string
    (hours_weekly + travel_hours) × weeks × 4, unrounded.
    data.services[].billing_code string
    The billing code.
    data.services[].extra_hours string
    Extra hours a week, for extra_weeks: a second segment.
    data.services[].extra_travel_hours string
    Travel hours a week, counted with extra_hours.
    data.services[].extra_units string
    (extra_hours + extra_travel_hours) × extra_weeks × 4, unrounded.
    data.services[].extra_weeks string
    Weeks the extra hours run. None means the extra adds no units.
    data.services[].extra_without_weeks boolean
    Extra hours are set with no extra_weeks, so add nothing.
    data.services[].hours_weekly string
    Authorized hours a week.
    data.services[].mismatch boolean, required
    total_units and units_on_par disagree.
    data.services[].plan_of_care_id string
    The plan it is read from; none when not authorized.
    data.services[].service string, required
    data.services[].total_units integer
    base_units + extra_units, rounded half-up.
    data.services[].travel_hours string
    Travel hours a week, counted with the hours a week.
    data.services[].units_on_par integer
    The units the case manager's letter carries.
    data.services[].variance integer
    units_on_par less total_units.
    data.weeks string
    The PAR's weeks, as the panel prints them.
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/relations

List a client's people

The client's relations, current and ended, each with its contact, ordered by kind, then rank, then start date, as the client page's People section lists them. kind narrows to one kind. Needs clients.view; a client outside the caller's reach answers 403 forbidden.

Parameter In Required Description
id path yes
kind query no Only this kind of relation.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of relations object
    data array of ClientRelation, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/relations

Relate a person to a client

As the People section's Add does: names an existing contact by contact_id or creates one from contact. A current relation of the same single-current kind, or of the same kind and rank, is ended on the new one's start date and kept as history. Replacing a single-current kind (responsible_party, representative, case_manager, case_manager_supervisor, cma_office) must name the relation it replaces in replaces; without it, or naming one no longer current or at an old lock_version, it answers 409 stale_record and saves nothing. An unknown kind, or a contact with every field blank, answers 422 validation_failed naming the field. warnings lists what the agency may want to check (a possible duplicate person, a representative who is also the client's caregiver); they never stop the save. Needs clients.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json ClientRelationInput

The relation

  • 201 The relation and its warnings object
    data ClientRelation, required
    warnings array of object, required
    What the act was done with that the agency may want to fix; usually empty. Never a refusal: the act was done.
    warnings[].fix object
    Where it is fixed, when a page fixes it.
    warnings[].fix.label string, required
    What the link says.
    warnings[].fix.path string, required
    The app route that fixes it.
    warnings[].id string, required
    The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
    warnings[].message string, required
    For a person to read.
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/relations/{relation_id}/end

End a client's relation

As the People section's End does: the relation stays as history with ends_on set, today (Mountain) when the body sends none. A relation already ended answers 200 with it unchanged. A relation that is not this client's answers 404. Needs clients.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
relation_id path yes The relation.

Request body application/json object

When it ends

ends_on string
YYYY-MM-DD; today (Mountain) when left out.
  • 200 The ended relation object
    data ClientRelation, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/satisfaction-surveys

List a client's satisfaction surveys

Newest first, drafts and completed, as the client's Surveys tab lists them.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of surveys object
    data array of SatisfactionSurvey, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/satisfaction-surveys

Start a satisfaction survey

A draft, as the Surveys tab's New does; survey_date is required.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json SatisfactionSurveyInput

The survey

  • 201 The survey object
    data SatisfactionSurvey, required
  • default An error, in the shared envelope. Error

GET /api/v1/consent-forms/{id}

Get an intake notice

Its answers, state and signatures.

Parameter In Required Description
id path yes
  • 200 The notice object
    data object, required
    data.answers object, required
    The answers, by question key: a disclosure item's responsible party (agency or consumer), the complaint contact.
    data.client_id string, required
    The client.
    data.declined_reason string
    Why the client declined to sign a disclosure notice; the office then signs that it was conveyed verbally.
    data.defaulted_keys array of string
    The choices still holding the answer the notice was prefilled with (its first option): defaults nobody has chosen.
    data.form_type string, required
    agency_disclosure_notice (Chapter 26 6.7) or client_rights_acknowledgement (6.4).
    data.id string, required
    The record's id.
    data.inserted_at string
    When the notice was started.
    data.lock_version integer, required
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.missing_signers array of object
    Each required line no live signature fills yet, in order; empty when complete or voided.
    data.missing_signers[].label string, required
    The line as the page names it, e.g. "client or authorized representative".
    data.missing_signers[].roles array of string, required
    The roles that would fill the line: any one of them.
    data.record_state string, required
    draft until the first signature; signed notices are corrected by addendum or void.
    data.signatures array of object
    The live signatures, oldest first.
    data.signatures[].method string, required
    How it was signed.
    data.signatures[].role string, required
    The line signed.
    data.signatures[].signed_at string, required
    When.
    data.signatures[].signer_name string, required
    Who signed.
    data.signed_at string
    When the first signature locked it; null on a draft.
    data.signing_complete boolean
    True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
  • default An error, in the shared envelope. Error

PATCH /api/v1/consent-forms/{id}

Answer an intake notice

Saves answers on a draft notice, as its page does. A signed notice answers 409 record_locked; it is corrected with an addendum or voided. A stale lock_version answers 409. Another agency's notice is 404, before the body is judged.

Parameter In Required Description
id path yes

Request body (required) application/json object

The answers

answers object, required
Answers by question key; a key sent counts as chosen, and a blank clears its answer. Keys not sent keep their answer.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 200 The notice object
    data object, required
    data.answers object, required
    The answers, by question key: a disclosure item's responsible party (agency or consumer), the complaint contact.
    data.client_id string, required
    The client.
    data.declined_reason string
    Why the client declined to sign a disclosure notice; the office then signs that it was conveyed verbally.
    data.defaulted_keys array of string
    The choices still holding the answer the notice was prefilled with (its first option): defaults nobody has chosen.
    data.form_type string, required
    agency_disclosure_notice (Chapter 26 6.7) or client_rights_acknowledgement (6.4).
    data.id string, required
    The record's id.
    data.inserted_at string
    When the notice was started.
    data.lock_version integer, required
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.missing_signers array of object
    Each required line no live signature fills yet, in order; empty when complete or voided.
    data.missing_signers[].label string, required
    The line as the page names it, e.g. "client or authorized representative".
    data.missing_signers[].roles array of string, required
    The roles that would fill the line: any one of them.
    data.record_state string, required
    draft until the first signature; signed notices are corrected by addendum or void.
    data.signatures array of object
    The live signatures, oldest first.
    data.signatures[].method string, required
    How it was signed.
    data.signatures[].role string, required
    The line signed.
    data.signatures[].signed_at string, required
    When.
    data.signatures[].signer_name string, required
    Who signed.
    data.signed_at string
    When the first signature locked it; null on a draft.
    data.signing_complete boolean
    True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/consent-forms/{id}/signatures

Sign an intake notice

Records agency staff's signature, typed as the credential's user: on a rights acknowledgement it documents that the notice was given; on a disclosure notice only with declined_reason, which records that the client declined and the notice was conveyed verbally. The first signature locks the notice. A line already signed answers 422 already_signed, one the notice does not take 422 role_not_allowed, a voided notice 409 voided. Another agency's notice is 404, before the body is judged. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The signature

declined_reason string
On a draft disclosure notice: why the client declined to sign. Saved with the office signature in one step, that the notice was conveyed verbally.
role string, required
office: agency staff, signed as you. A rights acknowledgement is complete with it; a disclosure notice takes it only with declined_reason. client and representative are drawn on the device in the app and answer 422 drawn_required here.
  • 200 The notice, and what signing it warned of object
    data object, required
    data.answers object, required
    The answers, by question key: a disclosure item's responsible party (agency or consumer), the complaint contact.
    data.client_id string, required
    The client.
    data.declined_reason string
    Why the client declined to sign a disclosure notice; the office then signs that it was conveyed verbally.
    data.defaulted_keys array of string
    The choices still holding the answer the notice was prefilled with (its first option): defaults nobody has chosen.
    data.form_type string, required
    agency_disclosure_notice (Chapter 26 6.7) or client_rights_acknowledgement (6.4).
    data.id string, required
    The record's id.
    data.inserted_at string
    When the notice was started.
    data.lock_version integer, required
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.missing_signers array of object
    Each required line no live signature fills yet, in order; empty when complete or voided.
    data.missing_signers[].label string, required
    The line as the page names it, e.g. "client or authorized representative".
    data.missing_signers[].roles array of string, required
    The roles that would fill the line: any one of them.
    data.record_state string, required
    draft until the first signature; signed notices are corrected by addendum or void.
    data.signatures array of object
    The live signatures, oldest first.
    data.signatures[].method string, required
    How it was signed.
    data.signatures[].role string, required
    The line signed.
    data.signatures[].signed_at string, required
    When.
    data.signatures[].signer_name string, required
    Who signed.
    data.signed_at string
    When the first signature locked it; null on a draft.
    data.signing_complete boolean
    True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
    warnings array of object, required
    What the record page warns of before this line is signed, judged on the record as it was before signing; usually empty. Never a refusal: the line is signed. Each has an id (resolved-empty: a Resolved complaint whose investigation and resolution are empty; reporter: an incident's reporter line signed by a member other than the reporter it names; complaint-contact: a rights notice whose complaint contact is empty), the text, and, where answering one of the record's questions fixes it, that question_key.
    warnings[].id string, required
    The warning's stable id.
    warnings[].question_key string
    The record's question that fixes it, when one does.
    warnings[].text string, required
    What the signer is warned of.
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes already_signed, role_not_allowed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/contacts

Find contacts

Contacts whose first name, last name or organization match every word of search, ordered by name, among those related (now or before) to a client the caller may open. A search over 8 words answers 400 bad_request. Needs clients.view.

Parameter In Required Description
search query no Words a name or organization must all match.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of contacts object
    data array of Contact, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: Bad Request, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/contacts/{id}

Get a contact

One contact. One related only to clients outside the caller's reach answers 403 forbidden. Needs clients.view.

Parameter In Required Description
id path yes
  • 200 The contact object
    data Contact, required
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/contacts/{id}

Change a contact

As the People section's Edit does: the change reaches every client the contact serves, each of which must be in the caller's reach. Send the lock_version it was read with; one changed since answers 409 stale_record and saves nothing. A refused value answers 422 naming the field. Needs clients.manage.

Parameter In Required Description
id path yes

Request body (required) application/json ContactInput

What to change

  • 200 The contact object
    data Contact, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/contacts/{id}/merge

Merge contacts that are the same person

US-120.13: the contacts loser_ids names are the same person as the one in the path. Every relation of each one, current and ended, moves to the path's contact, whose own fields are kept; a relation that would list the person twice on a client is kept as deleted history; each one named is deleted; one audit row records the merge. Every client of every contact named must be in the credential's reach. An empty loser_ids, more than 50, or the path's own id among them is 422 invalid; a contact that is not this agency's or is already deleted (so repeating a finished merge) is 404 not_found; a credential without clients.manage is 403; a merge another write got to first is 409 stale. Nothing is written on any refusal.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json ContactMerge

The contacts to merge

  • 200 The contact merged into object
    data Contact, required
  • 403 Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/emergency-info/{id}

Delete an emergency information revision

Deletes a draft revision, as the page's history does; the audit trail keeps it. A signed, amended or voided revision answers 409 record_locked and nothing is deleted. Another agency's revision is 404.

Parameter In Required Description
id path yes
  • 200 The deleted revision object
    data object, required
    data.answers object, required
    The answers, by question key.
    data.client_id string, required
    The client.
    data.id string, required
    The record's id.
    data.inserted_at string
    When this revision was saved.
    data.missing_signers array of object
    Each required line no live signature fills yet, in order; empty when complete or voided.
    data.missing_signers[].label string, required
    The line as the page names it, e.g. "client or authorized representative".
    data.missing_signers[].roles array of string, required
    The roles that would fill the line: any one of them.
    data.record_state string, required
    draft until the first signature (US-101.32). A signed revision is never deleted or changed: it is corrected with an addendum, voided, or followed by a new revision.
    data.signatures array of object
    The live signatures, oldest first.
    data.signatures[].method string, required
    How it was signed.
    data.signatures[].role string, required
    The line signed.
    data.signatures[].signed_at string, required
    When.
    data.signatures[].signer_name string, required
    Who signed.
    data.signed_at string
    When the first signature locked it; null on a draft.
    data.signing_complete boolean
    True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
    data.superseded boolean
    True for a draft never signed whose client has a later signed revision: it is no longer the sheet in force, and may still be deleted.
    data.version integer, required
    Its revision number.
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/emergency-info/{id}/signatures

Sign an emergency information revision

Records agency staff's signature, typed as the credential's user (US-101.32). The revision is complete once the client or their authorized representative has also signed, drawn on the device in the app; that line answers 422 drawn_required here. The first signature locks the revision: it is never deleted or changed, and a later save adds the next revision as a draft. A line already signed answers 422 already_signed, a voided revision 409 voided, one another request changed while this one ran 409 stale_record. Another agency's revision is 404, before the body is judged. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The signature

role string, required
Whose line to sign: office, agency staff, signed as you. The client's or authorized representative's line is drawn on the device in the app and answers 422 drawn_required here.
  • 200 The revision object
    data object, required
    data.answers object, required
    The answers, by question key.
    data.client_id string, required
    The client.
    data.id string, required
    The record's id.
    data.inserted_at string
    When this revision was saved.
    data.missing_signers array of object
    Each required line no live signature fills yet, in order; empty when complete or voided.
    data.missing_signers[].label string, required
    The line as the page names it, e.g. "client or authorized representative".
    data.missing_signers[].roles array of string, required
    The roles that would fill the line: any one of them.
    data.record_state string, required
    draft until the first signature (US-101.32). A signed revision is never deleted or changed: it is corrected with an addendum, voided, or followed by a new revision.
    data.signatures array of object
    The live signatures, oldest first.
    data.signatures[].method string, required
    How it was signed.
    data.signatures[].role string, required
    The line signed.
    data.signatures[].signed_at string, required
    When.
    data.signatures[].signer_name string, required
    Who signed.
    data.signed_at string
    When the first signature locked it; null on a draft.
    data.signing_complete boolean
    True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
    data.superseded boolean
    True for a draft never signed whose client has a later signed revision: it is no longer the sheet in force, and may still be deleted.
    data.version integer, required
    Its revision number.
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Codes already_signed, drawn_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/satisfaction-surveys/{id}

Change a satisfaction survey

Send only what changes, with the lock_version read; a stale one answers 409.

Parameter In Required Description
id path yes

Request body (required) application/json SatisfactionSurveyInput

What to change

  • 200 The survey object
    data SatisfactionSurvey, required
  • 409 Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/satisfaction-surveys/{id}/complete

Complete a satisfaction survey

Saves any final answers and marks it completed, as the Surveys tab's Complete does. Send the lock_version read.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json SatisfactionSurveyInput

Final answers

  • 200 The survey object
    data SatisfactionSurvey, required
  • default An error, in the shared envelope. Error

Clients

GET /api/v1/clients

List clients

The agency's clients in name order, deleted ones left out unless include_deleted=true. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
search query no Every word must match a returned name or identifier, case-insensitively. At most 100 characters and 8 words.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
include_deleted query no true also lists deleted records, with deleted_at set, so a sync learns of deletions.
  • 200 A page of clients object
    data array of Client, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients

Create a client

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json ClientInput

The client's fields

  • 201 The created client ClientWriteResult
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}

Get a client

Parameter In Required Description
id path yes
  • 200 The client object
    data Client, required
  • 404 Code not_found: no client with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/clients/{id}

Update a client

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json ClientInput

The fields to change

  • 200 The updated client ClientWriteResult
  • 404 Code not_found: no client with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the client changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/acp-protection

Mark a client ACP-protected, or remove the mark

US-74.1: a client in Colorado's Address Confidentiality Program (PM 20-007) has its real address, phones and every call location withheld from Sandata; the ACP substitute address and phone sent here go in their place (the address whole or not at all, else 422). Removing the mark needs a reason (422 reason_required or reason_too_short). A request that changes nothing changes nothing and needs no reason. Audited against the credential.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json ClientAcpProtection

The mark

  • 200 The client object
    data Client, required
  • 422 Code reason_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/agency-services-only

Set or clear a client's Agency services only flag

US-102.34: true says the client has no outside providers (Access's MHS ONLY), as the client page's Other services section sets it. The body carries the lock_version the client was read with; a client changed since answers 409 stale_record. Audited against the credential.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json ClientAgencyServicesOnly

The flag

  • 200 The client object
    data Client, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/intake-warning-dismissals

Dismiss a client's missing-intake warning

As the client page's Dismiss on its missing-intake warning (US-101.42): stores who dismissed it, when, the optional reason and the forms missing now (intake_missing). The warning shows again only when a form outside that list goes missing. 201 for the client's first dismissal, 200 when it replaces one. It blocks nothing. Another agency's client is 404, before the body is judged, and nothing is written. Audited against the credential.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

The dismissal

reason string
Why the warning is dismissed, e.g. the intake packet was signed on paper and filed. Optional.
  • 200 The dismissal, replaced object
    data object, required
    data.client_id string, required
    The record's id.
    data.dismissed_at string, required
    When it was dismissed.
    data.dismissed_by_id string
    The user who dismissed it; the credential's user here.
    data.missing_forms array of string, required
    The forms missing when it was dismissed; the warning shows again only when another form goes missing.
    data.reason string
    The reason given, or null.
  • 201 The dismissal object
    data object, required
    data.client_id string, required
    The record's id.
    data.dismissed_at string, required
    When it was dismissed.
    data.dismissed_by_id string
    The user who dismissed it; the credential's user here.
    data.missing_forms array of string, required
    The forms missing when it was dismissed; the warning shows again only when another form goes missing.
    data.reason string
    The reason given, or null.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/supervisory-plan

Set or clear a client's planned supervisory visit slots

US-102.35, #2606: for each quarter N, the month of that quarter (planned_supervisory_qN_offset, 1-3) and the day of that month (planned_supervisory_qN_day) the client's supervisory visit is planned on, as the client page's Supervisory slots set them. Both null leaves a quarter unplanned; a day needs a month (422 validation_failed, in the page's words). planned_supervisory_offset / planned_supervisory_day set all four quarters alike when no per-quarter field is sent. Refused with 409 stale_record when the client changed since lock_version was read. Audited against the credential.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json ClientSupervisoryPlan

The slot

  • 200 The client object
    data Client, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Communication notes

PATCH /api/v1/caregiver-notes/{id}

Update a caregiver note

Sets only the fields sent; a field sent as null is cleared, and a required one is refused. A body that changes nothing is 422 nothing_to_change. Notes carry no lock_version: the row is locked and re-read for the change.

Parameter In Required Description
id path yes

Request body (required) application/json CaregiverNoteInput

The fields to change

  • 200 The note object
    data CaregiverNote, required
  • 422 Code nothing_to_change: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregiver-notes/{id}/attachments

List a caregiver note's attachments

Oldest first, as the note page shows them, each with its scan status.

Parameter In Required Description
id path yes
  • 200 The note's attachments object
    data array of object, required
    data[].content_type string, required
    Its type.
    data[].file_size integer, required
    Its size in bytes.
    data[].filename string, required
    The file's name.
    data[].id string, required
    The record's id.
    data[].inserted_at string
    When it was attached.
    data[].note_id string, required
    The note.
    data[].note_kind string, required
    The kind of note it is on.
    data[].scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data[].uploaded_by_id string
    Who attached it.
  • default An error, in the shared envelope. Error

POST /api/v1/caregiver-notes/{id}/attachments

Attach a file to a caregiver note

Attaches a file as the note page's upload does: image/png, image/jpeg, image/gif, image/webp, application/pdf, up to 10 MB, at most 50 on a note, its extension matching its type and its bytes matching both. A refused file writes nothing and answers 422 naming the rule. The file is virus-scanned after it is saved and cannot be downloaded until its scan_status is clean.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) multipart/form-data object

The file

file string, required
  • 201 The attachment object
    data object, required
    data.content_type string, required
    Its type.
    data.file_size integer, required
    Its size in bytes.
    data.filename string, required
    The file's name.
    data.id string, required
    The record's id.
    data.inserted_at string
    When it was attached.
    data.note_id string, required
    The note.
    data.note_kind string, required
    The kind of note it is on.
    data.scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data.uploaded_by_id string
    Who attached it.
  • 422 Unprocessable Content, as the operation's description says. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/notes

List a caregiver's notes

The caregiver's communication log, newest first. With updated_since the order is change order, for a sync that pages with after_id. A caregiver of another agency, or a deleted one, is 404.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
contact_type query no Only notes of this contact type.
  • 200 A page of caregiver notes object
    data array of CaregiverNote, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/notes

Add a note to a caregiver's log

Files one note against the caregiver. manager_initials defaults to the API key's user's initials. A caregiver of another agency, or a deleted one, is 404 and nothing is written. Attachments are not accepted here.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json CaregiverNoteInput

The note

  • 201 The note object
    data CaregiverNote, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/client-notes/{id}

Update a client note

Sets only the fields sent; a field sent as null is cleared, and a required one is refused. A body that changes nothing is 422 nothing_to_change. Notes carry no lock_version: the row is locked and re-read for the change.

Parameter In Required Description
id path yes

Request body (required) application/json ClientNoteInput

The fields to change

  • 200 The note object
    data ClientNote, required
  • 422 Code nothing_to_change: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/client-notes/{id}/attachments

List a client note's attachments

Oldest first, as the note page shows them, each with its scan status.

Parameter In Required Description
id path yes
  • 200 The note's attachments object
    data array of object, required
    data[].content_type string, required
    Its type.
    data[].file_size integer, required
    Its size in bytes.
    data[].filename string, required
    The file's name.
    data[].id string, required
    The record's id.
    data[].inserted_at string
    When it was attached.
    data[].note_id string, required
    The note.
    data[].note_kind string, required
    The kind of note it is on.
    data[].scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data[].uploaded_by_id string
    Who attached it.
  • default An error, in the shared envelope. Error

POST /api/v1/client-notes/{id}/attachments

Attach a file to a client note

Attaches a file as the note page's upload does: image/png, image/jpeg, image/gif, image/webp, application/pdf, up to 10 MB, at most 50 on a note, its extension matching its type and its bytes matching both. A refused file writes nothing and answers 422 naming the rule. The file is virus-scanned after it is saved and cannot be downloaded until its scan_status is clean.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) multipart/form-data object

The file

file string, required
  • 201 The attachment object
    data object, required
    data.content_type string, required
    Its type.
    data.file_size integer, required
    Its size in bytes.
    data.filename string, required
    The file's name.
    data.id string, required
    The record's id.
    data.inserted_at string
    When it was attached.
    data.note_id string, required
    The note.
    data.note_kind string, required
    The kind of note it is on.
    data.scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data.uploaded_by_id string
    Who attached it.
  • 422 Unprocessable Content, as the operation's description says. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/notes

List a client's notes

The client's communication log, newest first. With updated_since the order is change order, for a sync that pages with after_id. A client of another agency, or a deleted one, is 404.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
contact_type query no Only notes with this party among their contact_types.
caregiver_id query no Only notes linked to this caregiver.
  • 200 A page of client notes object
    data array of ClientNote, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/notes

Add a note to a client's log

Files one note against the client. manager_initials defaults to the API key's user's initials. A client of another agency, or a deleted one, is 404 and nothing is written. Attachments are not accepted here.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json ClientNoteInput

The note

  • 201 The note object
    data ClientNote, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/note-attachments/{id}

Delete a note attachment

Removes it as the note page's Delete does, for a member holding Clients → Manage (a client note) or Caregivers → Manage (a caregiver note); for anyone else it is 403 or 404, as on the web. The audit trail keeps it.

Parameter In Required Description
id path yes
  • 200 The deleted attachment object
    data object, required
    data.content_type string, required
    Its type.
    data.file_size integer, required
    Its size in bytes.
    data.filename string, required
    The file's name.
    data.id string, required
    The record's id.
    data.inserted_at string
    When it was attached.
    data.note_id string, required
    The note.
    data.note_kind string, required
    The kind of note it is on.
    data.scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data.uploaded_by_id string
    Who attached it.
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/note-attachments/{id}

Download a note attachment

The file itself, as the note page's Download serves it, and recorded as a download. A file whose virus scan is not clean is 404, as on the web.

Parameter In Required Description
id path yes
  • 200 The file string
  • 404 Not Found, as the operation's description says. Error
  • 410 Code file_missing: the record exists and its file does not. Nothing changed. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

Company documents

GET /api/v1/company-documents

List company documents

The agency's documents, as Agency Compliance > Company Documents lists them.

Parameter In Required Description
limit query no
offset query no
  • 200 The records object
    data array of object, required
    total_count integer
    All of them.
  • default An error, in the shared envelope. Error

POST /api/v1/company-documents

Upload a company document

Stores the file (multipart field file, or JSON file_base64 with file_name and content_type) with name, description and expires_at, as Company documents > Upload does: its size, type, extension, the agency's quota and its first bytes are checked, then it is scanned for viruses. scan_status is pending until the scan marks it clean; only then can its file be read. A multipart upload takes a file up to 50 MB, the page's limit; a JSON body takes at most 1 MB, file_base64 included. A JSON client with a larger file, up to 50 MB, asks POST /api/v1/company-documents/uploads for a slot and PUTs the bytes to it.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The file and its details

content_type string
Optional; else the extension's.
description string
What it is; null or blank clears it.
expires_at string
YYYY-MM-DD, if it expires; null clears it.
file_base64 string
The file's bytes, base64.
file_name string
Its name, with its extension.
name string
Its name.
  • 201 The record object
    data object, required
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

POST /api/v1/company-documents/uploads

Request a slot to upload a large company document

For a file larger than a JSON body carries (1 MB), up to 50 MB, the page's limit: answers upload_url, single-use, bound to this credential and this agency, and valid for 30 minutes (expires_at). PUT the file's bytes to it (PUT /api/v1/company-documents/uploads/{token}) with the same credential; the answer is the stored document. The details are checked now, as Company documents > Upload checks them (type, extension, name, expiry), and the size, the agency's quota and the file's first bytes when the bytes arrive. content_type is optional, else the one file_name's extension names; name defaults to file_name.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The document's details

content_type string
Optional; else the extension's.
description string
What it is; null or blank clears it.
expires_at string
YYYY-MM-DD, if it expires; null clears it.
file_name string, required
Its name, with its extension.
name string
Its name.
  • 201 The slot object
    data object, required
    data.content_type string
    data.expires_at string
    data.file_name string
    data.max_file_size integer
    The largest file the slot takes, in bytes.
    data.method string
    PUT.
    data.name string
    data.upload_url string
    Where to PUT the file's bytes, once, with this credential.
  • default An error, in the shared envelope. Error

PUT /api/v1/company-documents/uploads/{token}

Upload a company document's bytes to its slot

The body is the file's bytes, nothing else (any content type but JSON, form or multipart, which answer 415), up to 50 MB; over it answers 413 file_too_large. Sent with the credential that requested the slot: another credential's or another agency's slot answers 404, as an unknown one does. A slot stores one document: a slot already used answers 409 upload_slot_used with the document's id in details, one another PUT is still storing 409 upload_slot_in_progress, and one past expires_at 410 upload_slot_expired. A file the upload refuses (422) leaves the slot usable until it expires. The answer is the document, scan_status pending until its virus scan marks it clean.

Parameter In Required Description
token path yes The slot's token, from its upload_url.

Request body (required) application/octet-stream string

The file's bytes

  • 201 The record object
    data object, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes upload_slot_in_progress, upload_slot_used: Conflict, as the operation's description says. Error
  • 410 Code upload_slot_expired: Gone, as the operation's description says. Error
  • 413 Code file_too_large: Request Entity Too Large, as the operation's description says. Error
  • 415 Unsupported Media Type, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/company-documents/{id}

Delete a company document

As the page deletes one, at the lock_version it was read with (400 missing, 409 stale_record changed since). The screen report of an OIG attestation is kept with it for seven years: 422 retained. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes
lock_version query yes The lock_version the record was read with: missing answers 400, changed since 409 stale_record.
  • 200 The record object
    data object, required
  • 400 Bad Request, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/company-documents/{id}

A company document

Its details and scan_status; the file is GET .../file. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The record object
    data object, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/company-documents/{id}

Change a company document's details

name, description and expires_at, as the page's Edit does, with the lock_version the document was read with: missing answers 400, a document changed since 409 stale_record. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes

Request body (required) application/json object

The details

description string
What it is; null or blank clears it.
expires_at string
YYYY-MM-DD, if it expires; null clears it.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
name string
Its name.
  • 200 The record object
    data object, required
  • 400 Bad Request, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/company-documents/{id}/file

Read a company document's file

The file once its virus scan marked it clean, as Download serves it. Still scanning answers 409 scan_pending; a threat found 410 scan_infected; a scan that failed 409 scan_error. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The file string
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes scan_error, scan_pending: Conflict, as the operation's description says. Error
  • 410 Code file_missing: the record exists and its file does not. Nothing changed. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

POST /api/v1/exports

Start a data export

Starts the CSV a report page's Export button makes, in the background: export_type payment_report, authorization_utilization, authorization_expiration, authorization_over_utilization, punctuality_report or chart_packet (a client's chart as a ZIP, packet.pdf and records.json), with params as the page sends them (payment_report: start_date, end_date, check_number, member, batch_id, date_basis, unreconciled, variance, view, status; authorization_expiration: days, renewed (exclude leaves out renewed authorizations); punctuality_report: start_date, end_date, grace_minutes; chart_packet: client_id, and from and to as dates, both optional; the answer's range says which dates it covers, and a packet of the client already running for another range answers 409 packet_running naming it, while one for the same range is answered again). Read GET /api/v1/exports/{id} until status is completed, then its file.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The export

export_type string, required
params object
The page's filters, e.g. start_date and end_date.
  • 201 The record object
    data object, required
  • 409 Code packet_running: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/exports/{id}

An export and its status

One the credential's user started: status pending, processing, completed or failed, and file_ready.

Parameter In Required Description
id path yes
  • 200 The record object
    data object, required
  • default An error, in the shared envelope. Error

GET /api/v1/exports/{id}/file

Read an export's file

A completed export's file, as Download serves it. Still running answers 409 not_ready; failed 409 export_failed, its message the export's own reason; expired 410 expired; gone 410 file_missing.

Parameter In Required Description
id path yes
  • 200 The file string
  • 409 Codes export_failed, not_ready: Conflict, as the operation's description says. Error
  • 410 Code file_missing: the record exists and its file does not. Nothing changed. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

GET /api/v1/import-configurations

List import configurations

As Import > Configurations lists them.

Parameter In Required Description
limit query no
offset query no
  • 200 The records object
    data array of object, required
    total_count integer
    All of them.
  • default An error, in the shared envelope. Error

POST /api/v1/import-configurations

Create an import configuration

As Import > Configurations > New does.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The configuration

column_mappings object
deduplication_keys array of string
name string
strategy string
target_schema string
transform_rules object
validation_rules object
  • 201 The record object
    data object, required
  • default An error, in the shared envelope. Error

DELETE /api/v1/import-configurations/{id}

Delete an import configuration

As the page deletes one, at the lock_version it was read with (400 missing, 409 stale_record changed since). Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes
lock_version query yes The lock_version the record was read with: missing answers 400, changed since 409 stale_record.
  • 200 The record object
    data object, required
  • 400 Bad Request, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/import-configurations/{id}

An import configuration

Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The record object
    data object, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/import-configurations/{id}

Change an import configuration

The fields sent, as the page's Edit does, with the lock_version the configuration was read with: missing answers 400, changed since 409 stale_record. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes

Request body (required) application/json object

The fields to change

column_mappings object
deduplication_keys array of string
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
name string
strategy string
target_schema string
transform_rules object
validation_rules object
  • 200 The record object
    data object, required
  • 400 Bad Request, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/saved-reports

List saved reports

The saved client or caregiver reports (kind) the credential's user can see: their own and the agency's shared ones. Filters are never returned (they can name a client); filter_count says how many a report has.

Parameter In Required Description
kind query yes
limit query no
offset query no
  • 200 The records object
    data array of object, required
    total_count integer
    All of them.
  • default An error, in the shared envelope. Error

POST /api/v1/saved-reports

Save a report

A saved client or caregiver report (kind), with its columns and filters, as Save on the report page does.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The report

columns array of string
description string
What it shows; null or blank clears it.
filters object
The report's filters, as the report page saves them. Never returned.
kind string
name string
visibility string
private or tenant (the agency's).
  • 201 The record object
    data object, required
  • default An error, in the shared envelope. Error

DELETE /api/v1/saved-reports/{id}

Delete a saved report

One the credential's user may edit, as above. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes
kind query yes
  • 200 The record object
    data object, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/saved-reports/{id}

Change a saved report

The fields sent, on a report the credential's user may edit: their own, or another member's with clients.manage (client reports) or caregivers.manage (caregiver reports), as the pages allow. Another's answers 404. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes
kind query yes

Request body (required) application/json object

The fields to change

columns array of string
description string
What it shows; null or blank clears it.
filters object
The report's filters, as the report page saves them. Never returned.
kind string
name string
visibility string
private or tenant (the agency's).
  • 200 The record object
    data object, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Complaints

GET /api/v1/complaints

List complaints

Each with its answers by the agency's question key. A complaint stays on record: there is no delete, as there is none on the web. The status moves only along the complaint's phases. The agency's complaints in complaint date order, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
client_id query no Only this client's complaints.
caregiver_id query no Only complaints about this caregiver.
complaint_date_from query no Complaints received on or between these days. on or after this date (YYYY-MM-DD, Colorado).
complaint_date_to query no Complaints received on or between these days. on or before this date (YYYY-MM-DD, Colorado).
  • 200 A page of complaints object
    data array of Complaint, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/complaints

Create a complaint

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json ComplaintCreate

The complaint's fields

  • 201 The created complaint object
    data Complaint, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

GET /api/v1/complaints/{id}

Get a complaint

Each with its answers by the agency's question key. A complaint stays on record: there is no delete, as there is none on the web. The status moves only along the complaint's phases.

Parameter In Required Description
id path yes
  • 200 The complaint object
    data Complaint, required
  • 404 Code not_found: no complaint with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/complaints/{id}

Update a complaint

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json ComplaintInput

The fields to change

  • 200 The updated complaint object
    data Complaint, required
  • 404 Code not_found: no complaint with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the complaint changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/complaints/{id}/signatures

Sign a complaint

Records the office investigator's signature, typed as the credential's user. The first signature locks the complaint: after it only its status moves, and a PATCH sending any other field answers 409 record_locked; it is corrected with an addendum, or voided. The complainant's line is drawn on the device in the app, so client and representative answer 422 drawn_required. A line already signed answers 422 already_signed; a complaint whose text cannot be read answers 422 content_unreadable; one another request changed while this one ran answers 409 stale_record; a voided one 409 voided. Another agency's complaint is 404, before the body is judged. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The signature

role string, required
Whose line to sign: office, the investigator, signed as you. The complainant's line (client when the complainant is the client, representative for anyone else) is drawn on the device in the app and answers 422 drawn_required here.
  • 200 The complaint, and what signing it warned of object
    data Complaint, required
    warnings array of object, required
    What the record page warns of before this line is signed, judged on the record as it was before signing; usually empty. Never a refusal: the line is signed. Each has an id (resolved-empty: a Resolved complaint whose investigation and resolution are empty; reporter: an incident's reporter line signed by a member other than the reporter it names; complaint-contact: a rights notice whose complaint contact is empty), the text, and, where answering one of the record's questions fixes it, that question_key.
    warnings[].id string, required
    The warning's stable id.
    warnings[].question_key string
    The record's question that fixes it, when one does.
    warnings[].text string, required
    What the signer is warned of.
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes record_locked, stale_record: Conflict, as the operation's description says. Error
  • 422 Codes already_signed, content_unreadable, drawn_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Compliance

GET /api/v1/audit-readiness

Get the agency's audit readiness

The summary's counts and a page (limit, offset) of the clients and caregivers with a gap, most missing first, as audit_readiness_summary returns it.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 The summary object
    data AuditReadiness, required
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/compliance

Get a caregiver's compliance

Training by course, vaccinations by year, the annual evaluation and the credential dates, what needs attention and the latest OIG check, as caregiver_compliance_status returns them. Another agency's caregiver, or a deleted one, is 404.

Parameter In Required Description
id path yes
  • 200 The compliance object
    data CaregiverCompliance, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/caregivers/{id}/file-completeness

Get a caregiver's file completeness

Each item of the caregiver's employee file, as caregiver_file_completeness returns it. Another agency's caregiver is 404.

Parameter In Required Description
id path yes
  • 200 The file object
    data FileCompleteness, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/file-completeness

Get a client's file completeness

Each item of the client's file with its status, what is wrong and its expiry, as client_file_completeness returns it. Another agency's client is 404.

Parameter In Required Description
id path yes
  • 200 The file object
    data FileCompleteness, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/compliance-alerts

List caregivers with a compliance problem

The agency's active caregivers with one kind of problem (alert_type), or with any of them when alert_type is left out, as compliance_alerts returns them; each row's alert_types names every problem it has.

Parameter In Required Description
alert_type query no criminal_background: criminal background check expired or expiring; dora: DORA check expired or expiring; caps: CAPS check expired or expiring; driver_license: driver's license expired or expiring; main_training: main training expired or expiring; training: annual training missing, expired or expiring; evaluation: no current annual evaluation
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of caregivers object
    data array of ComplianceAlert, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

GET /api/v1/oig-screening-status

List each caregiver's latest OIG check

Each caregiver, whether the monthly screen covers them, and their latest exclusion check, as oig_screening_status returns them.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of caregivers object
    data array of OigCheck, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

GET /api/v1/oig-screens

List the agency's OIG exclusion screens

Monthly screens, newest first, with each one's still-open review count, as list_oig_screens returns them; include_single=true adds new-hire and single-caregiver screens.

Parameter In Required Description
include_single query no Include new-hire and single-caregiver screens. Default false.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of screens object
    data array of OigScreen, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/oig-screens

Queue a roster OIG screen

Queues a screen of the agency's roster, as the OIG Screening Log's button and run_oig_screen do: 202 with status queued, or already_queued when a screen is already waiting, running or retrying. The screen's row exists once the worker starts. A demo agency, or the Sandata certification tenant, is 422 demo_agency and nothing is queued.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 202 Queued object
    data OigScreenQueued, required
  • 422 Code demo_agency: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/provider-revalidations

List provider revalidations

The Medicaid revalidation due date for an NPI the agency bills under, as the Provider Web Portal shows it. Reading one needs compliance.view; adding, changing and deleting one needs compliance.manage (403 forbidden otherwise). The agency's provider revalidations in due date order, the nearest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of provider revalidations object
    data array of ProviderRevalidation, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/provider-revalidations

Create a provider revalidation

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json ProviderRevalidationInput

The provider revalidation's fields

  • 201 The created provider revalidation object
    data ProviderRevalidation, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/provider-revalidations/{id}

Delete a provider revalidation

Removes the date and its reminders. Needs compliance.manage.

Parameter In Required Description
id path yes
  • 200 The deleted revalidation date object
    data ProviderRevalidation, required
  • default An error, in the shared envelope. Error

PATCH /api/v1/provider-revalidations/{id}

Update a provider revalidation

Sets only the fields sent; a changed due date is reminded again at 90, 60 and 30 days. Needs compliance.manage.

Parameter In Required Description
id path yes

Request body (required) application/json ProviderRevalidationInput

The fields to change

  • 200 The updated revalidation date object
    data ProviderRevalidation, required
  • default An error, in the shared envelope. Error

Critical incidents

GET /api/v1/critical-incidents

List critical incidents

A report stays on record: there is no delete, as there is none on the web. The status moves only along the incident's transitions. The agency's critical incidents in incident date order, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
incident_type query no Only incidents of this kind.
client_id query no Only this client's incidents.
incident_date_from query no Incidents on or between these days. on or after this date (YYYY-MM-DD, Colorado).
incident_date_to query no Incidents on or between these days. on or before this date (YYYY-MM-DD, Colorado).
  • 200 A page of critical incidents object
    data array of CriticalIncident, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/critical-incidents

Create a critical incident

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json CriticalIncidentCreate

The critical incident's fields

  • 201 The created critical incident object
    data CriticalIncident, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

GET /api/v1/critical-incidents/{id}

Get a critical incident

A report stays on record: there is no delete, as there is none on the web. The status moves only along the incident's transitions.

Parameter In Required Description
id path yes
  • 200 The critical incident object
    data CriticalIncident, required
  • 404 Code not_found: no critical incident with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/critical-incidents/{id}

Update a critical incident

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json CriticalIncidentInput

The fields to change

  • 200 The updated critical incident object
    data CriticalIncident, required
  • 404 Code not_found: no critical incident with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the critical incident changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/critical-incidents/{id}/signatures

Sign a critical incident

Records one signature line, typed as the credential's user: office (reported by) or supervisor (supervisor review); one member may sign both. The first signature locks the incident: after it only its status moves, and a PATCH sending any other field answers 409 record_locked; it is corrected with an addendum, or voided. A line already signed answers 422 already_signed; an incident whose text cannot be read answers 422 content_unreadable; one another request changed while this one ran answers 409 stale_record; a voided one 409 voided. Another agency's incident is 404, before the body is judged. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The signature

role string, required
Whose line to sign, as you: office (reported by) or supervisor (supervisor review).
  • 200 The incident, and what signing it warned of object
    data CriticalIncident, required
    warnings array of object, required
    What the record page warns of before this line is signed, judged on the record as it was before signing; usually empty. Never a refusal: the line is signed. Each has an id (resolved-empty: a Resolved complaint whose investigation and resolution are empty; reporter: an incident's reporter line signed by a member other than the reporter it names; complaint-contact: a rights notice whose complaint contact is empty), the text, and, where answering one of the record's questions fixes it, that question_key.
    warnings[].id string, required
    The warning's stable id.
    warnings[].question_key string
    The record's question that fixes it, when one does.
    warnings[].text string, required
    What the signer is warned of.
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes record_locked, stale_record: Conflict, as the operation's description says. Error
  • 422 Codes already_signed, content_unreadable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Deletes and restores

DELETE /api/v1/caregiver-notes/{id}

Delete a caregiver communication note

Soft-deletes the note and its attachments, as the caregiver's communication log does. Notes carry no lock_version.

Parameter In Required Description
id path yes
  • 200 The deleted note object
    data CaregiverNote, required
  • default An error, in the shared envelope. Error

DELETE /api/v1/caregivers/{id}

Delete a caregiver

Soft-deletes the caregiver, as the caregiver list does: it leaves the default list and is listed with include_deleted=true. A caregiver with active client assignments answers 422 has_active_assignments; one already deleted 422 already_deleted.

Parameter In Required Description
id path yes
lock_version query yes The lock_version the record was read with: missing answers 400, changed since 409 stale_record.
  • 200 The deleted caregiver object
    data Caregiver, required
  • 422 Codes already_deleted, has_active_assignments: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/restore

Restore a deleted caregiver

Restores a deleted caregiver, as the caregiver list's Restore does. While the caregiver was deleted their telephony PIN may have gone to someone else: meta.pin_resolution says what happened (noop: kept; regenerated: a new PIN, in meta.new_pin; cleared: none could be issued, assign one). meta.new_pin appears in this response only, once; it is never logged, and no later read returns it.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The lock_version read

lock_version integer, required
The lock_version the deleted record has: the one its DELETE answered, or read it by listing with include_deleted=true.
  • 200 The restored caregiver object
    data Caregiver, required
    meta object, required
    meta.new_pin string
    The reissued PIN, when pin_resolution is regenerated.
    meta.pin_resolution string, required
    What happened to the PIN.
  • default An error, in the shared envelope. Error

DELETE /api/v1/client-notes/{id}

Delete a client communication note

Soft-deletes the note and its attachments, as the client's communication log does. Notes carry no lock_version.

Parameter In Required Description
id path yes
  • 200 The deleted note object
    data ClientNote, required
  • default An error, in the shared envelope. Error

DELETE /api/v1/clients/{id}

Delete a client

Soft-deletes the client, as the client list does: it leaves the default list and is listed with include_deleted=true, the web's Show archived. A client with active caregiver assignments or active service authorizations answers 422 has_active_references; one already deleted 422 already_deleted. A client changed since it was read answers 409 stale_record.

Parameter In Required Description
id path yes
lock_version query yes The lock_version the record was read with: missing answers 400, changed since 409 stale_record.
  • 200 The deleted client object
    data Client, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Codes already_deleted, has_active_references: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/restore

Restore a deleted client

Restores a deleted client to the default list, as the client list's Restore does. A client that is not deleted answers 422 not_deleted.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The lock_version read

lock_version integer, required
The lock_version the deleted record has: the one its DELETE answered, or read it by listing with include_deleted=true.
  • 200 The restored client object
    data Client, required
  • 422 Code not_deleted: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/evaluations/{id}

Delete a caregiver's evaluation

Deletes the evaluation, as the caregiver's Evaluations tab does; the audit trail keeps what it was. Evaluations carry no lock_version.

Parameter In Required Description
id path yes
  • 200 The deleted evaluation object
    data CaregiverEvaluation, required
  • default An error, in the shared envelope. Error

DELETE /api/v1/plans-of-care/{id}

Delete a Plan of Care entered in error

Soft-deletes the plan, as the client's Plans of Care tab does: it leaves every list, print, Work Order, Shift Plan and calculator read, and the audit trail keeps it. A draft or a voided plan can be deleted; a signed plan answers 422 plan_signed (void it first, with POST /plans-of-care/{id}/revise or on its page), and one already deleted 422 already_deleted. Deleting a current plan leaves its service with no current plan; no earlier plan takes its place. Work Orders, standing Work Orders and PARs that reference the plan keep their own copies and do not stop the delete. Plans carry no lock_version.

Parameter In Required Description
id path yes
  • 200 The deleted plan object
    data object, required
    data.deleted_at string, required
    When it was deleted (UTC).
    data.id string, required
    The record's id.
  • 422 Codes already_deleted, plan_signed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/satisfaction-surveys/{id}

Delete a satisfaction survey

Soft-deletes the survey, as the client's surveys list does. The answer is the survey's id and deleted_at. A survey changed since it was read answers 409 stale_record.

Parameter In Required Description
id path yes
lock_version query yes The lock_version the record was read with: missing answers 400, changed since 409 stale_record.
  • 200 The deleted survey object
    data object, required
    data.deleted_at string, required
    When it was deleted (UTC).
    data.id string, required
    The record's id.
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/supervisory-visits/{id}

Delete a supervisory visit

Soft-deletes the visit, as the client's visit list does: the same care_plans.manage for a draft or a finalized visit (403 forbidden otherwise). A visit changed since it was read answers 409 stale_record.

Parameter In Required Description
id path yes
lock_version query yes The lock_version the record was read with: missing answers 400, changed since 409 stale_record.
  • 200 The deleted visit object
    data SupervisoryVisit, required
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/trainings/{id}

Delete a caregiver's training record

Deletes the record, as the caregiver's Training tab does; the audit trail keeps what it was. Training records carry no lock_version.

Parameter In Required Description
id path yes
  • 200 The deleted record object
    data CaregiverTraining, required
  • default An error, in the shared envelope. Error

DocuSign

DELETE /api/v1/settings/docusign

Disconnect DocuSign

As the page's Disconnect does: the agency's tokens and Connect HMAC key are cleared and an audit row written. Envelopes already sent stay at DocuSign. Nothing to disconnect answers the same body and writes nothing. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The settings object
    data object, required
    data.account_kind string, required
    The account a send goes through: the agency's own, HomeCareBilling's (paid from prepaid credit), or null when neither is available.
    data.agency_connection object, required
    The agency's own DocuSign connection, null when it never connected. A disconnected one stays here for its history; account_kind says which account a send goes through.
    data.agency_connection.account_name string
    The DocuSign account's name.
    data.agency_connection.connect_hmac_key_set boolean, required
    Whether a Connect HMAC key is stored. The key itself is never shown.
    data.agency_connection.connect_hmac_key_set_at string
    When the Connect HMAC key was stored.
    data.agency_connection.connected_at string
    When it was connected.
    data.agency_connection.connected_by string
    Who connected it.
    data.agency_connection.disconnected_at string
    When it was disconnected.
    data.agency_connection.docusign_account_id string
    The DocuSign account id.
    data.agency_connection.docusign_user_email string
    The DocuSign user who connected it.
    data.agency_connection.status string, required
    The agency's own DocuSign connection.
    data.own_key_set boolean, required
    Whether the agency has saved its own DocuSign integration key, which Connect and every token refresh then run under. The key and its secret are never shown.
    data.own_key_set_at string
    When the agency's own key was saved.
    data.platform_price_microdollars integer
    What one envelope costs in prepaid credit, in millionths of a dollar, when sends go through HomeCareBilling's account.
    data.status string, required
    The agency's own DocuSign connection: agency_connection.status, or none when it never connected.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/settings/docusign

Read the DocuSign settings

As Settings > DocuSign shows them: the agency's connection, the account a send goes through, and whether a Connect HMAC key is stored. No token and no key is ever shown. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The settings object
    data object, required
    data.account_kind string, required
    The account a send goes through: the agency's own, HomeCareBilling's (paid from prepaid credit), or null when neither is available.
    data.agency_connection object, required
    The agency's own DocuSign connection, null when it never connected. A disconnected one stays here for its history; account_kind says which account a send goes through.
    data.agency_connection.account_name string
    The DocuSign account's name.
    data.agency_connection.connect_hmac_key_set boolean, required
    Whether a Connect HMAC key is stored. The key itself is never shown.
    data.agency_connection.connect_hmac_key_set_at string
    When the Connect HMAC key was stored.
    data.agency_connection.connected_at string
    When it was connected.
    data.agency_connection.connected_by string
    Who connected it.
    data.agency_connection.disconnected_at string
    When it was disconnected.
    data.agency_connection.docusign_account_id string
    The DocuSign account id.
    data.agency_connection.docusign_user_email string
    The DocuSign user who connected it.
    data.agency_connection.status string, required
    The agency's own DocuSign connection.
    data.own_key_set boolean, required
    Whether the agency has saved its own DocuSign integration key, which Connect and every token refresh then run under. The key and its secret are never shown.
    data.own_key_set_at string
    When the agency's own key was saved.
    data.platform_price_microdollars integer
    What one envelope costs in prepaid credit, in millionths of a dollar, when sends go through HomeCareBilling's account.
    data.status string, required
    The agency's own DocuSign connection: agency_connection.status, or none when it never connected.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/settings/docusign/connect-hmac-key

Remove the DocuSign Connect HMAC key

Removes the stored key, so Connect deliveries are no longer checked against one. Nothing stored answers the same body and writes nothing. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The settings object
    data object, required
    data.account_kind string, required
    The account a send goes through: the agency's own, HomeCareBilling's (paid from prepaid credit), or null when neither is available.
    data.agency_connection object, required
    The agency's own DocuSign connection, null when it never connected. A disconnected one stays here for its history; account_kind says which account a send goes through.
    data.agency_connection.account_name string
    The DocuSign account's name.
    data.agency_connection.connect_hmac_key_set boolean, required
    Whether a Connect HMAC key is stored. The key itself is never shown.
    data.agency_connection.connect_hmac_key_set_at string
    When the Connect HMAC key was stored.
    data.agency_connection.connected_at string
    When it was connected.
    data.agency_connection.connected_by string
    Who connected it.
    data.agency_connection.disconnected_at string
    When it was disconnected.
    data.agency_connection.docusign_account_id string
    The DocuSign account id.
    data.agency_connection.docusign_user_email string
    The DocuSign user who connected it.
    data.agency_connection.status string, required
    The agency's own DocuSign connection.
    data.own_key_set boolean, required
    Whether the agency has saved its own DocuSign integration key, which Connect and every token refresh then run under. The key and its secret are never shown.
    data.own_key_set_at string
    When the agency's own key was saved.
    data.platform_price_microdollars integer
    What one envelope costs in prepaid credit, in millionths of a dollar, when sends go through HomeCareBilling's account.
    data.status string, required
    The agency's own DocuSign connection: agency_connection.status, or none when it never connected.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/settings/docusign/connect-hmac-key

Store the DocuSign Connect HMAC key

Stores, or replaces, the HMAC key of the agency's DocuSign Connect configuration. From then on a Connect delivery for the agency's envelopes is accepted only when a signature matches it. The key is never shown again. With no current connection it answers 422 not_connected; a key that breaks the rule answers 422 validation_failed. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

The key

hmac_key string, required
The HMAC key from the agency's DocuSign Connect configuration, which must be 16 to 256 characters with no spaces. It is stored encrypted and never shown again.
  • 200 The settings object
    data object, required
    data.account_kind string, required
    The account a send goes through: the agency's own, HomeCareBilling's (paid from prepaid credit), or null when neither is available.
    data.agency_connection object, required
    The agency's own DocuSign connection, null when it never connected. A disconnected one stays here for its history; account_kind says which account a send goes through.
    data.agency_connection.account_name string
    The DocuSign account's name.
    data.agency_connection.connect_hmac_key_set boolean, required
    Whether a Connect HMAC key is stored. The key itself is never shown.
    data.agency_connection.connect_hmac_key_set_at string
    When the Connect HMAC key was stored.
    data.agency_connection.connected_at string
    When it was connected.
    data.agency_connection.connected_by string
    Who connected it.
    data.agency_connection.disconnected_at string
    When it was disconnected.
    data.agency_connection.docusign_account_id string
    The DocuSign account id.
    data.agency_connection.docusign_user_email string
    The DocuSign user who connected it.
    data.agency_connection.status string, required
    The agency's own DocuSign connection.
    data.own_key_set boolean, required
    Whether the agency has saved its own DocuSign integration key, which Connect and every token refresh then run under. The key and its secret are never shown.
    data.own_key_set_at string
    When the agency's own key was saved.
    data.platform_price_microdollars integer
    What one envelope costs in prepaid credit, in millionths of a dollar, when sends go through HomeCareBilling's account.
    data.status string, required
    The agency's own DocuSign connection: agency_connection.status, or none when it never connected.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Codes not_connected, validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/settings/docusign/own-key

Remove the agency's own DocuSign key

Removes the stored key, so Connect and token refreshes run under the app-wide key again, and marks an active connection as needing a reconnect. Nothing stored answers the same body and writes nothing. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The settings object
    data object, required
    data.account_kind string, required
    The account a send goes through: the agency's own, HomeCareBilling's (paid from prepaid credit), or null when neither is available.
    data.agency_connection object, required
    The agency's own DocuSign connection, null when it never connected. A disconnected one stays here for its history; account_kind says which account a send goes through.
    data.agency_connection.account_name string
    The DocuSign account's name.
    data.agency_connection.connect_hmac_key_set boolean, required
    Whether a Connect HMAC key is stored. The key itself is never shown.
    data.agency_connection.connect_hmac_key_set_at string
    When the Connect HMAC key was stored.
    data.agency_connection.connected_at string
    When it was connected.
    data.agency_connection.connected_by string
    Who connected it.
    data.agency_connection.disconnected_at string
    When it was disconnected.
    data.agency_connection.docusign_account_id string
    The DocuSign account id.
    data.agency_connection.docusign_user_email string
    The DocuSign user who connected it.
    data.agency_connection.status string, required
    The agency's own DocuSign connection.
    data.own_key_set boolean, required
    Whether the agency has saved its own DocuSign integration key, which Connect and every token refresh then run under. The key and its secret are never shown.
    data.own_key_set_at string
    When the agency's own key was saved.
    data.platform_price_microdollars integer
    What one envelope costs in prepaid credit, in millionths of a dollar, when sends go through HomeCareBilling's account.
    data.status string, required
    The agency's own DocuSign connection: agency_connection.status, or none when it never connected.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/settings/docusign/own-key

Store the agency's own DocuSign key

Stores, or replaces, the integration key and secret of a Private custom integration the agency made in its own DocuSign account. Connect and every token refresh then run under it instead of HomeCareBilling's app-wide key, and the agency must register the redirect URI of Settings > DocuSign on it. The pair is stored encrypted and never shown again, and the agency's active connection, which was issued under the old key, must be connected again. A pair that breaks a rule answers 422 validation_failed, naming the rule and never the value. The pair is not checked with DocuSign until Connect. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

The key and secret

integration_key string, required
The integration key of a Private custom integration in the agency's own DocuSign account: must be a UUID, as DocuSign shows it. It is stored encrypted and never shown again.
secret_key string, required
The secret of that integration key, which must be 8 to 256 characters with no spaces. It is stored encrypted and never shown again.
  • 200 The settings object
    data object, required
    data.account_kind string, required
    The account a send goes through: the agency's own, HomeCareBilling's (paid from prepaid credit), or null when neither is available.
    data.agency_connection object, required
    The agency's own DocuSign connection, null when it never connected. A disconnected one stays here for its history; account_kind says which account a send goes through.
    data.agency_connection.account_name string
    The DocuSign account's name.
    data.agency_connection.connect_hmac_key_set boolean, required
    Whether a Connect HMAC key is stored. The key itself is never shown.
    data.agency_connection.connect_hmac_key_set_at string
    When the Connect HMAC key was stored.
    data.agency_connection.connected_at string
    When it was connected.
    data.agency_connection.connected_by string
    Who connected it.
    data.agency_connection.disconnected_at string
    When it was disconnected.
    data.agency_connection.docusign_account_id string
    The DocuSign account id.
    data.agency_connection.docusign_user_email string
    The DocuSign user who connected it.
    data.agency_connection.status string, required
    The agency's own DocuSign connection.
    data.own_key_set boolean, required
    Whether the agency has saved its own DocuSign integration key, which Connect and every token refresh then run under. The key and its secret are never shown.
    data.own_key_set_at string
    When the agency's own key was saved.
    data.platform_price_microdollars integer
    What one envelope costs in prepaid credit, in millionths of a dollar, when sends go through HomeCareBilling's account.
    data.status string, required
    The agency's own DocuSign connection: agency_connection.status, or none when it never connected.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/signed-records/{record_type}/{id}/docusign-envelopes

List a record's DocuSign envelopes

Newest first, as the record page's DocuSign panel shows the latest: each envelope's status, its signers' names, roles and emails, when it was sent and completed, and the account it went through.

Parameter In Required Description
record_type path yes The record's type: client_consent_form, client_emergency_info, monthly_client_report, plan_of_care or supervisor_visit.
id path yes
limit query no Rows per page (default 20, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 A page of envelopes object
    data array of object, required
    data[].account_kind string, required
    The DocuSign account it was sent through.
    data[].completed_at string
    When every signer had signed.
    data[].id string, required
    The envelope's id.
    data[].recipients array of object, required
    Its signers.
    data[].recipients[].email string, required
    Where DocuSign sent the signing link.
    data[].recipients[].name string, required
    The signer's name.
    data[].recipients[].role string, required
    Who signs.
    data[].record_id string
    The record's id.
    data[].record_type string
    The record's type.
    data[].sent_at string
    When DocuSign accepted it.
    data[].status string, required
    Where the envelope is.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/signed-records/{record_type}/{id}/docusign-envelopes

Send a draft record for signature with DocuSign

As the record page's Send with DocuSign does: DocuSign emails each signer a link, and their signatures land on the record when they have signed. The envelope is created in the background, so it answers 202 with the envelope sending. Through HomeCareBilling's account the price is held on the agency's prepaid credit first, and too little credit answers 402 insufficient_credit with nothing written. A record that is not a draft, one already out for signature, no account to send through, or a signer the record does not take answers 422 with its code; an Idempotency-Key replay answers the first send.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
record_type path yes The record's type: client_consent_form, client_emergency_info, monthly_client_report, plan_of_care or supervisor_visit.
id path yes

Request body application/json object

Who signs

recipients array of object
Who signs. Left out, the record's client and its designated representative, where the record has a representative's line, each with an email on file, as the page's Send dialog offers them.
recipients[].email string, required
Where DocuSign sends the signing link.
recipients[].name string, required
The signer's name, as it prints.
recipients[].role string, required
Who signs.
  • 202 The envelope, sending object
    data object, required
    data.account_kind string, required
    The DocuSign account it was sent through.
    data.available_balance_microdollars integer
    A send through HomeCareBilling's account: the prepaid credit left after the hold.
    data.completed_at string
    When every signer had signed.
    data.id string, required
    The envelope's id.
    data.price_microdollars integer
    A send through HomeCareBilling's account: the prepaid credit held for it, in millionths of a dollar.
    data.recipients array of object, required
    Its signers.
    data.recipients[].email string, required
    Where DocuSign sent the signing link.
    data.recipients[].name string, required
    The signer's name.
    data.recipients[].role string, required
    Who signs.
    data.record_id string
    The record's id.
    data.record_type string
    The record's type.
    data.sent_at string
    When DocuSign accepted it.
    data.status string, required
    Where the envelope is.
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Documentation

GET /api/v1/openapi.json

The OpenAPI document

This document. No credential is needed.

  • 200 The OpenAPI 3 document object
  • default An error, in the shared envelope. Error

Documents

GET /api/v1/caregivers/{id}/documents

List a caregiver's documents

Newest first, as the caregiver page's Documents tab lists them, each with its scan status. The read is recorded on the PHI access log.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 The person's documents object
    data array of object, required
    data[].content_type string
    Its type.
    data[].document_type string
    What the document is, as the Documents tab's Type.
    data[].documentable_id string, required
    The client or caregiver.
    data[].documentable_type string, required
    Whose file it is on.
    data[].expiry_date string
    When it expires, if it does.
    data[].file_name string, required
    The file's name.
    data[].file_size integer
    Its size in bytes.
    data[].id string, required
    The record's id.
    data[].inserted_at string
    When it was uploaded.
    data[].notes string
    The tab's notes.
    data[].paper_form_type string
    A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
    data[].record_date string
    A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
    data[].scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data[].updated_at string
    When it last changed.
    data[].uploaded_by string
    Who uploaded it.
    limit integer, required
    offset integer, required
    total integer, required
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/documents

Upload a document to a caregiver's file

Stores a file on the person's file as the Documents tab's upload does (multipart field file, or JSON file_base64 with file_name and content_type): application/pdf, image/jpeg, image/png, image/gif, image/webp, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, text/plain, its extension matching its type and its first bytes matching both. A multipart file may be up to 50 MB; a JSON body takes at most 1 MB, file_base64 included. document_type defaults to other. A refused file writes nothing and answers 422 naming the rule. It is virus-scanned after it is saved and cannot be downloaded until its scan_status is clean.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The file and its details

content_type string
Its type; null or left out reads the extension's.
document_type string
What the document is, as the Documents tab's Type.
expiry_date string
When it expires.
file_base64 string, required
The file's bytes, base64.
file_name string, required
Its name, with its extension.
notes string
Notes, as the tab's Notes.
paper_form_type string
A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
record_date string
A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
  • 201 The document object
    data object, required
    data.content_type string
    Its type.
    data.document_type string
    What the document is, as the Documents tab's Type.
    data.documentable_id string, required
    The client or caregiver.
    data.documentable_type string, required
    Whose file it is on.
    data.expiry_date string
    When it expires, if it does.
    data.file_name string, required
    The file's name.
    data.file_size integer
    Its size in bytes.
    data.id string, required
    The record's id.
    data.inserted_at string
    When it was uploaded.
    data.notes string
    The tab's notes.
    data.paper_form_type string
    A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
    data.record_date string
    A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
    data.scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data.updated_at string
    When it last changed.
    data.uploaded_by string
    Who uploaded it.
  • 422 Unprocessable Content, as the operation's description says. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/documents

List a client's documents

Newest first, as the client page's Documents tab lists them, legacy paper scans included, each with its scan status. The read is recorded on the PHI access log.

Parameter In Required Description
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
document_type query no Only documents of this type; legacy_paper is the paper archive.
form_type query no Only legacy_paper scans of this form type.
from query no Only documents whose record_date is on or after this day (YYYY-MM-DD).
to query no Only documents whose record_date is on or before this day (YYYY-MM-DD).
  • 200 The person's documents object
    data array of object, required
    data[].content_type string
    Its type.
    data[].document_type string
    What the document is, as the Documents tab's Type.
    data[].documentable_id string, required
    The client or caregiver.
    data[].documentable_type string, required
    Whose file it is on.
    data[].expiry_date string
    When it expires, if it does.
    data[].file_name string, required
    The file's name.
    data[].file_size integer
    Its size in bytes.
    data[].id string, required
    The record's id.
    data[].inserted_at string
    When it was uploaded.
    data[].notes string
    The tab's notes.
    data[].paper_form_type string
    A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
    data[].record_date string
    A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
    data[].scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data[].updated_at string
    When it last changed.
    data[].uploaded_by string
    Who uploaded it.
    limit integer, required
    offset integer, required
    total integer, required
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/documents

Upload a document to a client's file

Stores a file on the person's file as the Documents tab's upload does (multipart field file, or JSON file_base64 with file_name and content_type): application/pdf, image/jpeg, image/png, image/gif, image/webp, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, text/plain, its extension matching its type and its first bytes matching both. A multipart file may be up to 50 MB; a JSON body takes at most 1 MB, file_base64 included. document_type defaults to other. A refused file writes nothing and answers 422 naming the rule. It is virus-scanned after it is saved and cannot be downloaded until its scan_status is clean.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The file and its details

content_type string
Its type; null or left out reads the extension's.
document_type string
What the document is, as the Documents tab's Type.
expiry_date string
When it expires.
file_base64 string, required
The file's bytes, base64.
file_name string, required
Its name, with its extension.
notes string
Notes, as the tab's Notes.
paper_form_type string
A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
record_date string
A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
  • 201 The document object
    data object, required
    data.content_type string
    Its type.
    data.document_type string
    What the document is, as the Documents tab's Type.
    data.documentable_id string, required
    The client or caregiver.
    data.documentable_type string, required
    Whose file it is on.
    data.expiry_date string
    When it expires, if it does.
    data.file_name string, required
    The file's name.
    data.file_size integer
    Its size in bytes.
    data.id string, required
    The record's id.
    data.inserted_at string
    When it was uploaded.
    data.notes string
    The tab's notes.
    data.paper_form_type string
    A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
    data.record_date string
    A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
    data.scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data.updated_at string
    When it last changed.
    data.uploaded_by string
    Who uploaded it.
  • 422 Unprocessable Content, as the operation's description says. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/documents/{id}

Delete a document

Removes it as the Documents tab's Delete does; the audit trail keeps it.

Parameter In Required Description
id path yes
  • 200 The deleted document object
    data object, required
    data.content_type string
    Its type.
    data.document_type string
    What the document is, as the Documents tab's Type.
    data.documentable_id string, required
    The client or caregiver.
    data.documentable_type string, required
    Whose file it is on.
    data.expiry_date string
    When it expires, if it does.
    data.file_name string, required
    The file's name.
    data.file_size integer
    Its size in bytes.
    data.id string, required
    The record's id.
    data.inserted_at string
    When it was uploaded.
    data.notes string
    The tab's notes.
    data.paper_form_type string
    A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
    data.record_date string
    A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
    data.scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data.updated_at string
    When it last changed.
    data.uploaded_by string
    Who uploaded it.
  • default An error, in the shared envelope. Error

GET /api/v1/documents/{id}

Get a document

One document on a client's or caregiver's file, with its scan status. The read is recorded on the PHI access log.

Parameter In Required Description
id path yes
  • 200 The document object
    data object, required
    data.content_type string
    Its type.
    data.document_type string
    What the document is, as the Documents tab's Type.
    data.documentable_id string, required
    The client or caregiver.
    data.documentable_type string, required
    Whose file it is on.
    data.expiry_date string
    When it expires, if it does.
    data.file_name string, required
    The file's name.
    data.file_size integer
    Its size in bytes.
    data.id string, required
    The record's id.
    data.inserted_at string
    When it was uploaded.
    data.notes string
    The tab's notes.
    data.paper_form_type string
    A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
    data.record_date string
    A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
    data.scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data.updated_at string
    When it last changed.
    data.uploaded_by string
    Who uploaded it.
  • default An error, in the shared envelope. Error

PATCH /api/v1/documents/{id}

Change a document's type, notes or expiry

As the Documents tab's Edit does. 422 nothing_to_change for a body with none of these fields.

Parameter In Required Description
id path yes

Request body (required) application/json object

The fields to change

document_type string
What the document is, as the Documents tab's Type.
expiry_date string
When it expires.
notes string
Notes, as the tab's Notes.
paper_form_type string
A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
record_date string
A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
  • 200 The document object
    data object, required
    data.content_type string
    Its type.
    data.document_type string
    What the document is, as the Documents tab's Type.
    data.documentable_id string, required
    The client or caregiver.
    data.documentable_type string, required
    Whose file it is on.
    data.expiry_date string
    When it expires, if it does.
    data.file_name string, required
    The file's name.
    data.file_size integer
    Its size in bytes.
    data.id string, required
    The record's id.
    data.inserted_at string
    When it was uploaded.
    data.notes string
    The tab's notes.
    data.paper_form_type string
    A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
    data.record_date string
    A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
    data.scan_status string, required
    The virus scan's verdict; only a clean file can be downloaded.
    data.updated_at string
    When it last changed.
    data.uploaded_by string
    Who uploaded it.
  • 422 Code nothing_to_change: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/documents/{id}/file

Download a document

The file itself, as the Documents tab's Download serves it, and recorded as a download. A file whose virus scan is not clean is 404 not_scanned_clean, as the web refuses it.

Parameter In Required Description
id path yes
  • 200 The file string
  • 404 Code not_scanned_clean: Not Found, as the operation's description says. Error
  • 410 Code file_missing: the record exists and its file does not. Nothing changed. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

Follow-ups

POST /api/v1/clients/{id}/follow-up/log

Log a client's monthly follow-up

As the Log form of Operations > Follow-Ups: completes the client's open monthly follow-up with how they were reached, the day, and optional notes. A client has at most one open. One with nothing open (not due yet, or logged already) is 422 no_open_follow_up and nothing changes. Another agency's client is 404.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json MonthlyFollowUpLogInput

The contact

  • 200 The follow-up object
    data MonthlyFollowUp, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code no_open_follow_up: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

HCB University

GET /api/v1/university/videos

List HCB University videos

The narrated training videos of jobs in the app, in the order /university shows them: by section, then by title. The same for every agency.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of videos object
    data array of UniversityVideo, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

GET /api/v1/university/videos/{slug}

Get an HCB University video

One video with the pages it shows, its chapters, and for each rendered language the video, captions and poster as storage URLs signed for 6 hours. A URL that could not be signed is null. 404 for a slug the catalog does not list.

Parameter In Required Description
slug path yes The video's slug.
  • 200 The video object
    data UniversityVideoDetail, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Imports

POST /api/v1/authorizations/import

Import PARs from InMyTeam's Authorization export

Reads InMyTeam's Authorization export as Import PARs does (format inmyteam_authorizations): each row one PAR service line, its PatientName matched to exactly one of the agency's clients, its Total read in 15-minute units. Needs imports.manage and authorizations.manage. A row whose client is not found, or found twice, fails with the reason. Any other file is 422 not_an_authorization_export. The file is csv (text) or csv_base64, header row first, at most 5,000 rows, in a body of at most 1 MB (the MCP tool takes a larger one). dry_run true runs the same import and rolls it all back, so the counts are the ones the real import would answer and nothing is written: no record, audit row or import history. Sending the same file again writes nothing twice: its rows are skipped with the reason already_on_file, also when two sends run at once. Refusals: 403 forbidden naming the missing permission; 422 file_required (no csv or csv_base64, or base64 that does not decode), empty_file, too_many_rows, csv_parse_error, invalid_dry_run; none writes anything.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The file

csv string
The file as CSV text, header row first.
csv_base64 string
Or the file's bytes, base64.
dry_run boolean
true: answer what the import would do, counted the same way, and write nothing. Left out or false: import.
  • 200 What the import did, or with dry_run true would do object
    data RecordImportResult, required
  • 403 Forbidden, as the operation's description says. Error
  • 422 Codes file_required, not_an_authorization_export: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/import

Import caregivers from a CSV file

Reads the file as Import Caregivers does: HCB's caregiver columns, or InMyTeam's Caregivers export (format inmyteam_caregivers), whose office roles are skipped as office_staff. Needs imports.manage. A key whose member lacks payroll.manage imports each caregiver without the row's pay rates, W-4 and ADP fields, lists the row under reasons.pay_rates_skipped and answers pay_withheld with the count and the words for it. The file is csv (text) or csv_base64, header row first, at most 5,000 rows, in a body of at most 1 MB (the MCP tool takes a larger one). dry_run true runs the same import and rolls it all back, so the counts are the ones the real import would answer and nothing is written: no record, audit row or import history. Sending the same file again writes nothing twice: its rows are skipped with the reason already_on_file, also when two sends run at once. Refusals: 403 forbidden naming the missing permission; 422 file_required (no csv or csv_base64, or base64 that does not decode), empty_file, too_many_rows, csv_parse_error, invalid_dry_run; none writes anything.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The file

csv string
The file as CSV text, header row first.
csv_base64 string
Or the file's bytes, base64.
dry_run boolean
true: answer what the import would do, counted the same way, and write nothing. Left out or false: import.
  • 200 What the import did, or with dry_run true would do object
    data RecordImportResult, required
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code file_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/import

Import clients from a CSV file

Reads the file as Import Clients does: HCB's client columns, or InMyTeam's Patients export as it comes out of InMyTeam (format inmyteam_patients). Needs imports.manage. A row matching a client on file by Medicaid ID fills in only what that client left blank (updated); one matching by name and date of birth is skipped. The file is csv (text) or csv_base64, header row first, at most 5,000 rows, in a body of at most 1 MB (the MCP tool takes a larger one). dry_run true runs the same import and rolls it all back, so the counts are the ones the real import would answer and nothing is written: no record, audit row or import history. Sending the same file again writes nothing twice: its rows are skipped with the reason already_on_file, also when two sends run at once. Refusals: 403 forbidden naming the missing permission; 422 file_required (no csv or csv_base64, or base64 that does not decode), empty_file, too_many_rows, csv_parse_error, invalid_dry_run; none writes anything.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The file

csv string
The file as CSV text, header row first.
csv_base64 string
Or the file's bytes, base64.
dry_run boolean
true: answer what the import would do, counted the same way, and write nothing. Left out or false: import.
  • 200 What the import did, or with dry_run true would do object
    data RecordImportResult, required
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code file_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Integration settings

GET /api/v1/settings/sandata

Read the Sandata settings

As Settings > Sandata shows them; the username and password say only whether each is saved. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The settings object
    data object, required
    data.sandata_agency_id string
    The Sandata Account.
    data.sandata_api_url string
    The Sandata API URL (https).
    data.sandata_batch_size integer
    Visits per send, 1 to 5000.
    data.sandata_custom_cron string
    A five-field cron expression, for a custom schedule.
    data.sandata_default_timezone string
    The timezone visits are sent in.
    data.sandata_enabled string
    Whether visits are sent to Sandata.
    data.sandata_entity_guid string
    The EntityGuid header, sent when set.
    data.sandata_password object, required
    data.sandata_password.set boolean, required
    Whether a value is saved; read it with the secrets operation.
    data.sandata_provider_id string
    The agency's Medicaid provider id (8 to 10 digits).
    data.sandata_send_visit_memo string
    Whether the visit memo is sent.
    data.sandata_submission_schedule string
    When visits are sent: a preset or custom.
    data.sandata_username object, required
    data.sandata_username.set boolean, required
    Whether a value is saved; read it with the secrets operation.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/settings/sandata

Save the Sandata settings

As the tab's Save does, in one transaction with an audit row; send only what changes. A blank username or password keeps the saved one, and a value the tab refuses answers 422 naming the field. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

What to change

sandata_agency_id string
The Sandata Account.
sandata_api_url string
The Sandata API URL (https).
sandata_batch_size integer
Visits per send, 1 to 5000.
sandata_custom_cron string
A five-field cron expression, for a custom schedule.
sandata_default_timezone string
The timezone visits are sent in.
sandata_enabled string
Whether visits are sent to Sandata.
sandata_entity_guid string
The EntityGuid header, sent when set.
sandata_password string
The password; null or blank keeps the saved one.
sandata_provider_id string
The agency's Medicaid provider id (8 to 10 digits).
sandata_send_visit_memo string
Whether the visit memo is sent.
sandata_submission_schedule string
When visits are sent: a preset or custom.
sandata_username string
The username; null or blank keeps the saved one.
  • 200 The settings object
    data object, required
    data.sandata_agency_id string
    The Sandata Account.
    data.sandata_api_url string
    The Sandata API URL (https).
    data.sandata_batch_size integer
    Visits per send, 1 to 5000.
    data.sandata_custom_cron string
    A five-field cron expression, for a custom schedule.
    data.sandata_default_timezone string
    The timezone visits are sent in.
    data.sandata_enabled string
    Whether visits are sent to Sandata.
    data.sandata_entity_guid string
    The EntityGuid header, sent when set.
    data.sandata_password object, required
    data.sandata_password.set boolean, required
    Whether a value is saved; read it with the secrets operation.
    data.sandata_provider_id string
    The agency's Medicaid provider id (8 to 10 digits).
    data.sandata_send_visit_memo string
    Whether the visit memo is sent.
    data.sandata_submission_schedule string
    When visits are sent: a preset or custom.
    data.sandata_username object, required
    data.sandata_username.set boolean, required
    Whether a value is saved; read it with the secrets operation.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/settings/sandata/certification

Read the Sandata certification page

As Settings > Sandata > Certification shows it: the checklist, progress, why each action is refused, and where each sample client and employee stands with Sandata. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The page object
    data object, required
    data.cases array of object
    Sandata's certification test cases, in order, each sent on its own.
    data.cases[].applied boolean
    Round 2: whether the case's change was made. Null in round 1.
    data.cases[].blocked string
    Why a send is refused now; null when it is not.
    data.cases[].id string, required
    The case's id, as POST /settings/sandata/certification/cases/{id} takes it.
    data.cases[].records integer, required
    How many records it sends.
    data.cases[].round integer, required
    1: the sample records as created. 2: changes to records Sandata accepted.
    data.cases[].scenario string, required
    The Sandata scenario it covers.
    data.cases[].state object
    Of those records, how many Sandata holds as they are now (accepted), are waiting for Sandata's answer (waiting), were refused as they are now and go again on a send (refused), were refused too often to go again until they change (parked), cannot be sent as they are (held_back), and are left to send (to_send); each record is in exactly one. Null while Sandata is paused or not set up.
    data.cases[].title string, required
    What the page calls it.
    data.cleanup_refusal string
    Why sample records cannot be removed; null when they can.
    data.completed_count integer, required
    Steps done.
    data.dry_run boolean
    Whether sends are a dry run: written to the server log, nothing sent to Sandata. Only the certification tenant has one.
    data.environment string
    The Sandata environment the sends reach.
    data.generate_refusal string
    Why sample records cannot be created; null when they can.
    data.globally_enabled boolean
    The platform switch: whether Sandata is turned on for agencies. It never pauses the certification tenant; see sandata_open.
    data.parties array of object, required
    Each sample client and employee, and where it stands with Sandata.
    data.parties[].batch string
    Its latest batch's status; null when never sent.
    data.parties[].id string, required
    The record's id.
    data.parties[].kind string, required
    Client or employee.
    data.parties[].name string, required
    Its name.
    data.parties[].state string, required
    Where it stands with Sandata.
    data.percentage number, required
    Steps done, in percent.
    data.sandata_open boolean
    False while Sandata is paused for this agency: the platform switch is off and this is not the certification tenant.
    data.send_refusal string
    Why sample records cannot be sent; null when they can.
    data.steps array of object, required
    The checklist, in order.
    data.steps[].category string, required
    Its section on the page.
    data.steps[].completed boolean, required
    Whether it is done.
    data.steps[].date string
    The day it was marked done; null when not done.
    data.steps[].key string, required
    The step's key.
    data.steps[].notes string
    Its notes; null when none.
    data.steps[].text string, required
    What the page calls it.
    data.test_data_exists boolean
    Whether sample records exist.
    data.total_count integer, required
    Steps in all.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/settings/sandata/certification/cases/{case}

Send one Sandata certification test case

The page's Send on one test case, with its audit row. Live, it makes a round 2 case's change and queues the case's records for Sandata, nothing else. In a dry run it writes the records to the server log and keeps nothing, a round 2 change included. The platform switch never pauses the certification tenant, so both go while it is off; elsewhere a paused Sandata answers 409 sandata_paused. 404 not_found for an unknown case; 422 no_records when there are no sample records for it; 409 not_ready while Sandata has not accepted what the case needs; 409 nothing_to_send when Sandata holds or is answering for every record of it; 500 case_incomplete when its change failed, which changed nothing. Needs agency_settings.manage (403 forbidden otherwise). Refused outside the Sandata certification tenant (422 not_certification_tenant).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
case path yes The case's id, as the page read lists it under cases.
  • 200 Sent or logged object
    data object, required
    data.case string, required
    The case's id.
    data.dry_run boolean, required
    True: written to the server log, nothing sent to Sandata and nothing changed.
    data.records integer, required
    How many records the case holds.
    data.refused object
    POST /settings/sandata/certification/send only: present when this case was refused while the other went; it changed nothing.
    data.refused.code string, required
    The refusal's code, as an error carries it.
    data.refused.message string, required
    Why the case was not sent.
    data.sending integer, required
    Live: how many of them were queued, those Sandata does not hold as they are now, a record it refused included until it is parked. Dry run: how many were written to the server log.
  • 403 Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 409 Codes not_ready, nothing_to_send, sandata_paused: Conflict, as the operation's description says. Error
  • 422 Codes no_records, not_certification_tenant: Unprocessable Content, as the operation's description says. Error
  • 500 Code case_incomplete: Internal Server Error, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/settings/sandata/certification/dry-run

Turn the certification dry run on or off

The page's dry-run switch, with its audit row. On, sending a test case writes its records to the server log and nothing goes to Sandata; off, a test case goes to Sandata's test environment. The switch itself sends nothing. Allowed while Sandata is paused. Refused outside the Sandata certification tenant (422 not_certification_tenant). Answers the whole page. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

The switch

dry_run boolean, required
True writes what would be sent to the server log and sends nothing; false sends to Sandata.
  • 200 The page object
    data object, required
    data.cases array of object
    Sandata's certification test cases, in order, each sent on its own.
    data.cases[].applied boolean
    Round 2: whether the case's change was made. Null in round 1.
    data.cases[].blocked string
    Why a send is refused now; null when it is not.
    data.cases[].id string, required
    The case's id, as POST /settings/sandata/certification/cases/{id} takes it.
    data.cases[].records integer, required
    How many records it sends.
    data.cases[].round integer, required
    1: the sample records as created. 2: changes to records Sandata accepted.
    data.cases[].scenario string, required
    The Sandata scenario it covers.
    data.cases[].state object
    Of those records, how many Sandata holds as they are now (accepted), are waiting for Sandata's answer (waiting), were refused as they are now and go again on a send (refused), were refused too often to go again until they change (parked), cannot be sent as they are (held_back), and are left to send (to_send); each record is in exactly one. Null while Sandata is paused or not set up.
    data.cases[].title string, required
    What the page calls it.
    data.cleanup_refusal string
    Why sample records cannot be removed; null when they can.
    data.completed_count integer, required
    Steps done.
    data.dry_run boolean
    Whether sends are a dry run: written to the server log, nothing sent to Sandata. Only the certification tenant has one.
    data.environment string
    The Sandata environment the sends reach.
    data.generate_refusal string
    Why sample records cannot be created; null when they can.
    data.globally_enabled boolean
    The platform switch: whether Sandata is turned on for agencies. It never pauses the certification tenant; see sandata_open.
    data.parties array of object, required
    Each sample client and employee, and where it stands with Sandata.
    data.parties[].batch string
    Its latest batch's status; null when never sent.
    data.parties[].id string, required
    The record's id.
    data.parties[].kind string, required
    Client or employee.
    data.parties[].name string, required
    Its name.
    data.parties[].state string, required
    Where it stands with Sandata.
    data.percentage number, required
    Steps done, in percent.
    data.sandata_open boolean
    False while Sandata is paused for this agency: the platform switch is off and this is not the certification tenant.
    data.send_refusal string
    Why sample records cannot be sent; null when they can.
    data.steps array of object, required
    The checklist, in order.
    data.steps[].category string, required
    Its section on the page.
    data.steps[].completed boolean, required
    Whether it is done.
    data.steps[].date string
    The day it was marked done; null when not done.
    data.steps[].key string, required
    The step's key.
    data.steps[].notes string
    Its notes; null when none.
    data.steps[].text string, required
    What the page calls it.
    data.test_data_exists boolean
    Whether sample records exist.
    data.total_count integer, required
    Steps in all.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code not_certification_tenant: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/settings/sandata/certification/sample-records

Remove the certification sample records

The page's Remove Sample Data, with its audit row. Refused outside the Sandata certification tenant (422 not_certification_tenant). Needs agency_settings.manage (403 forbidden otherwise).

  • 200 Removed object
    data object, required
    data.clients integer, required
    Sample clients.
    data.employees integer, required
    Sample employees.
    data.visits integer, required
    Sample visits.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code not_certification_tenant: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/settings/sandata/certification/sample-records

Create the certification sample records

The page's Create Sample Records, with its audit row: sample clients, employees and visits in the certification tenant. Refused once Sandata submission is off in Sandata settings (422 not_opted_in) and while sample records exist (409 test_data_exists). Needs agency_settings.manage (403 forbidden otherwise). Refused outside the certification tenant (422 not_certification_tenant).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 Created object
    data object, required
    data.clients integer, required
    Sample clients.
    data.employees integer, required
    Sample employees.
    data.visits integer, required
    Sample visits.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code test_data_exists: Conflict, as the operation's description says. Error
  • 422 Codes not_certification_tenant, not_opted_in: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/settings/sandata/certification/send

Send the sample employees and clients to Sandata

The Employees test case and the Clients one, each sent on its own (POST /settings/sandata/certification/cases/{id}), so one refused does not stop the other: a refused case carries refused. Live, they are queued for Sandata; in a dry run they are written to the server log and nothing is sent. When neither went, the error says why, as for one case. Needs agency_settings.manage (403 forbidden otherwise). Refused while Sandata is paused for the agency (409 sandata_paused), which the platform switch never does to the certification tenant. Refused outside the certification tenant (422 not_certification_tenant).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 Sent object
    data object, required
    data.cases array of object
    Each case's result.
    data.cases[].case string, required
    The case's id.
    data.cases[].dry_run boolean, required
    True: written to the server log, nothing sent to Sandata and nothing changed.
    data.cases[].records integer, required
    How many records the case holds.
    data.cases[].refused object
    POST /settings/sandata/certification/send only: present when this case was refused while the other went; it changed nothing.
    data.cases[].refused.code string, required
    The refusal's code, as an error carries it.
    data.cases[].refused.message string, required
    Why the case was not sent.
    data.cases[].sending integer, required
    Live: how many of them were queued, those Sandata does not hold as they are now, a record it refused included until it is parked. Dry run: how many were written to the server log.
    data.dry_run boolean
    Whether this was a dry run.
    data.queued boolean, required
    True when they were queued for Sandata; false in a dry run.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code sandata_paused: Conflict, as the operation's description says. Error
  • 422 Code not_certification_tenant: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/settings/sandata/certification/send-visits

Send the next sample visit test case to Sandata

Sends the first visit test case whose visits Sandata does not hold yet (POST /settings/sandata/certification/cases/{id}), one case per call. 409 not_ready until Sandata has accepted that case's clients and employees; 422 no_sample_visits when no visit is left to send; 409 dry_run while the dry run is on (a case's own operation dry-runs it). Needs agency_settings.manage (403 forbidden otherwise). Refused while Sandata is paused for the agency (409 sandata_paused), which the platform switch never does to the certification tenant. Refused outside the certification tenant (422 not_certification_tenant).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 Queued object
    data object, required
    data.case string
    The test case sent.
    data.queued_visits integer, required
    Sample visits queued.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Codes dry_run, not_ready, sandata_paused: Conflict, as the operation's description says. Error
  • 422 Codes no_sample_visits, not_certification_tenant: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/settings/sandata/certification/steps/{key}

Change a certification checklist step

As the page's checkbox and notes do, with the same audit row: completed marks the step done today or not done, keeping its notes; notes replaces them (trimmed, 500 characters at most; null or blank empties them). Answers the whole page. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
key path yes The step's key, as the page read lists it.

Request body (required) application/json object

What to change

completed boolean
Done or not done.
notes string
The notes; null or blank empties them.
  • 200 The page object
    data object, required
    data.cases array of object
    Sandata's certification test cases, in order, each sent on its own.
    data.cases[].applied boolean
    Round 2: whether the case's change was made. Null in round 1.
    data.cases[].blocked string
    Why a send is refused now; null when it is not.
    data.cases[].id string, required
    The case's id, as POST /settings/sandata/certification/cases/{id} takes it.
    data.cases[].records integer, required
    How many records it sends.
    data.cases[].round integer, required
    1: the sample records as created. 2: changes to records Sandata accepted.
    data.cases[].scenario string, required
    The Sandata scenario it covers.
    data.cases[].state object
    Of those records, how many Sandata holds as they are now (accepted), are waiting for Sandata's answer (waiting), were refused as they are now and go again on a send (refused), were refused too often to go again until they change (parked), cannot be sent as they are (held_back), and are left to send (to_send); each record is in exactly one. Null while Sandata is paused or not set up.
    data.cases[].title string, required
    What the page calls it.
    data.cleanup_refusal string
    Why sample records cannot be removed; null when they can.
    data.completed_count integer, required
    Steps done.
    data.dry_run boolean
    Whether sends are a dry run: written to the server log, nothing sent to Sandata. Only the certification tenant has one.
    data.environment string
    The Sandata environment the sends reach.
    data.generate_refusal string
    Why sample records cannot be created; null when they can.
    data.globally_enabled boolean
    The platform switch: whether Sandata is turned on for agencies. It never pauses the certification tenant; see sandata_open.
    data.parties array of object, required
    Each sample client and employee, and where it stands with Sandata.
    data.parties[].batch string
    Its latest batch's status; null when never sent.
    data.parties[].id string, required
    The record's id.
    data.parties[].kind string, required
    Client or employee.
    data.parties[].name string, required
    Its name.
    data.parties[].state string, required
    Where it stands with Sandata.
    data.percentage number, required
    Steps done, in percent.
    data.sandata_open boolean
    False while Sandata is paused for this agency: the platform switch is off and this is not the certification tenant.
    data.send_refusal string
    Why sample records cannot be sent; null when they can.
    data.steps array of object, required
    The checklist, in order.
    data.steps[].category string, required
    Its section on the page.
    data.steps[].completed boolean, required
    Whether it is done.
    data.steps[].date string
    The day it was marked done; null when not done.
    data.steps[].key string, required
    The step's key.
    data.steps[].notes string
    Its notes; null when none.
    data.steps[].text string, required
    What the page calls it.
    data.test_data_exists boolean
    Whether sample records exist.
    data.total_count integer, required
    Steps in all.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/settings/sandata/certification/validate

Check the sample records' data format

The page's Check Data Format: every sample record through the Sandata mappers; nothing is sent or saved. Refused while Sandata is paused for the agency (409 sandata_paused), which the platform switch never does to the certification tenant. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 The report object
    data object, required
    data.clients object, required
    data.clients.errors array of object, required
    One per failed record.
    data.clients.errors[].error string, required
    What the mapper refused.
    data.clients.errors[].id string, required
    The record's id.
    data.clients.errors[].name string, required
    The sample record's name.
    data.clients.failed integer, required
    Those that did not.
    data.clients.passed integer, required
    Those that mapped cleanly.
    data.clients.total integer, required
    Sample records checked.
    data.credential_error string
    Set when the Sandata settings are incomplete; null otherwise.
    data.employees object, required
    data.employees.errors array of object, required
    One per failed record.
    data.employees.errors[].error string, required
    What the mapper refused.
    data.employees.errors[].id string, required
    The record's id.
    data.employees.errors[].name string, required
    The sample record's name.
    data.employees.failed integer, required
    Those that did not.
    data.employees.passed integer, required
    Those that mapped cleanly.
    data.employees.total integer, required
    Sample records checked.
    data.overall_pass boolean, required
    Every sample record mapped cleanly.
    data.visits object, required
    data.visits.errors array of object, required
    One per failed record.
    data.visits.errors[].error string, required
    What the mapper refused.
    data.visits.errors[].id string, required
    The record's id.
    data.visits.errors[].name string, required
    The sample record's name.
    data.visits.failed integer, required
    Those that did not.
    data.visits.passed integer, required
    Those that mapped cleanly.
    data.visits.total integer, required
    Sample records checked.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code sandata_paused: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/settings/sandata/test

Test the Sandata connection

The tab's Test Connection, with the saved settings or the values sent in their place; nothing is saved. A failure answers 422 connection_failed with the reason. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body application/json object

Values to test instead of the saved ones

sandata_agency_id string
The Sandata Account.
sandata_api_url string
The Sandata API URL (https).
sandata_entity_guid string
The EntityGuid header, sent when set.
sandata_password string
The password; null or blank tests the saved one.
sandata_username string
The username; null or blank tests the saved one.
  • 200 Connected object
    data object, required
    data.connected boolean, required
    Always true.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code connection_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/settings/telephony

Clear the telephony settings

Back to the shared system number, as the tab's Clear does: the number's webhook is reset first, then every key is removed. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 Cleared object
    data object, required
    data.settings object, required
    data.settings.telephony_match_window_minutes string
    Minutes a call may be from its visit, 1 to 480.
    data.settings.telephony_send_sms_confirmation string
    SMS confirmation; unavailable for now.
    data.settings.twilio_account_sid object, required
    data.settings.twilio_account_sid.masked string, required
    Its last four characters, as ****1234; empty when none.
    data.settings.twilio_account_sid.set boolean, required
    Whether an Account SID is saved.
    data.settings.twilio_auth_token object, required
    data.settings.twilio_auth_token.set boolean, required
    Whether a value is saved; read it with the secrets operation.
    data.settings.twilio_phone_number string
    The agency's own Twilio number, 10 digits.
    data.settings.twilio_record_calls string
    Whether calls are recorded.
    data.warnings array of string, required
    Set when the old number's webhook could not be reset.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/settings/telephony

Read the telephony settings

As Settings > Telephony shows them: the Account SID masked, the Auth Token as whether it is saved. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The settings object
    data object, required
    data.telephony_match_window_minutes string
    Minutes a call may be from its visit, 1 to 480.
    data.telephony_send_sms_confirmation string
    SMS confirmation; unavailable for now.
    data.twilio_account_sid object, required
    data.twilio_account_sid.masked string, required
    Its last four characters, as ****1234; empty when none.
    data.twilio_account_sid.set boolean, required
    Whether an Account SID is saved.
    data.twilio_auth_token object, required
    data.twilio_auth_token.set boolean, required
    Whether a value is saved; read it with the secrets operation.
    data.twilio_phone_number string
    The agency's own Twilio number, 10 digits.
    data.twilio_record_calls string
    Whether calls are recorded.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/settings/telephony

Save the telephony settings

The tab's Test then Save in one call: changed credentials or a new number are tested with Twilio (the account must own the number) and saved only on a pass, then the number's webhook is set. Blank credentials keep the saved ones; all three blank clears the configuration. Moving a number while telephony visits are open goes through with a warning. A failed test answers 422 test_failed. Needs agency_settings.manage (403 forbidden otherwise).

Request body (required) application/json object

What to change

telephony_match_window_minutes string
Minutes, 1 to 480.
twilio_account_sid string
The Account SID; null or blank keeps the saved one.
twilio_auth_token string
The Auth Token; null or blank keeps the saved one.
twilio_phone_number string
The agency's Twilio number.
twilio_record_calls string
Whether calls are recorded.
  • 200 Saved object
    data object, required
    data.cleared boolean
    True when every credential was blank, so it was cleared.
    data.settings object, required
    data.settings.telephony_match_window_minutes string
    Minutes a call may be from its visit, 1 to 480.
    data.settings.telephony_send_sms_confirmation string
    SMS confirmation; unavailable for now.
    data.settings.twilio_account_sid object, required
    data.settings.twilio_account_sid.masked string, required
    Its last four characters, as ****1234; empty when none.
    data.settings.twilio_account_sid.set boolean, required
    Whether an Account SID is saved.
    data.settings.twilio_auth_token object, required
    data.settings.twilio_auth_token.set boolean, required
    Whether a value is saved; read it with the secrets operation.
    data.settings.twilio_phone_number string
    The agency's own Twilio number, 10 digits.
    data.settings.twilio_record_calls string
    Whether calls are recorded.
    data.warnings array of string, required
    What went through but needs attention.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code test_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/settings/telephony/test

Test the telephony settings

The tab's Test Configuration: the credentials authenticate and the account owns the number. Values sent replace the saved ones; nothing is saved. 20 tests a minute per agency (429 rate_limited). Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body application/json object

Values to test instead of the saved ones

twilio_account_sid string
The Account SID; null or blank keeps the saved one.
twilio_auth_token string
The Auth Token; null or blank keeps the saved one.
twilio_phone_number string
The agency's Twilio number.
  • 200 The account owns the number object
    data object, required
    data.owns_number boolean, required
    Always true.
  • 403 Forbidden, as the operation's description says. Error
  • 429 Code rate_limited: Too Many Requests, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/settings/{tab}/secrets/{key}

Reveal a saved credential

One saved credential, as the tab's eye icon shows it, with the same audit row; when the audit row cannot be written nothing is returned. null when none is saved. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
tab path yes sandata or telephony.
key path yes sandata_username or sandata_password (sandata); twilio_account_sid or twilio_auth_token (telephony).
  • 200 The credential object
    data object, required
    data.key string, required
    The credential's key.
    data.value string, required
    Its value; null when none is saved.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Meeting minutes

GET /api/v1/meeting-minutes

List meeting minutes

Minutes are a draft until finalized (POST .../finalize); finalized minutes answer 422 not_draft to a change. A search matches the location, who called the meeting, the notes and old business. The agency's meeting minutes in meeting date order, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
search query no Every word must match a returned name or identifier, case-insensitively. At most 100 characters and 8 words.
meeting_type query no Only meetings of this kind.
meeting_date_from query no Meetings held on or between these days. on or after this date (YYYY-MM-DD, Colorado).
meeting_date_to query no Meetings held on or between these days. on or before this date (YYYY-MM-DD, Colorado).
  • 200 A page of meeting minutes object
    data array of MeetingMinutes, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • 422 Code not_draft: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/meeting-minutes

Create a meeting minutes

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json MeetingMinutesInput

The meeting minutes's fields

  • 201 The created meeting minutes object
    data MeetingMinutes, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/meeting-minutes/{id}

Delete meeting minutes

As the minutes page's Delete does, a draft or finalized: they leave every list and read, and the deletion is kept on the audit trail.

Parameter In Required Description
id path yes
  • 200 The deleted minutes object
    data MeetingMinutes, required
  • default An error, in the shared envelope. Error

GET /api/v1/meeting-minutes/{id}

Get a meeting minutes

Minutes are a draft until finalized (POST .../finalize); finalized minutes answer 422 not_draft to a change. A search matches the location, who called the meeting, the notes and old business.

Parameter In Required Description
id path yes
  • 200 The meeting minutes object
    data MeetingMinutes, required
  • 404 Code not_found: no meeting minutes with that id in this agency, including another agency's. Error
  • 422 Code not_draft: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/meeting-minutes/{id}

Update a meeting minutes

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json MeetingMinutesInput

The fields to change

  • 200 The updated meeting minutes object
    data MeetingMinutes, required
  • 404 Code not_found: no meeting minutes with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the meeting minutes changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/meeting-minutes/{id}/finalize

Finalize meeting minutes

As the minutes page's Finalize does; finalized minutes are never changed again. Minutes already finalized answer 422 not_draft; minutes another request changed while this one ran answer 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The minutes object
    data MeetingMinutes, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code not_draft: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Monthly client reports

GET /api/v1/monthly-client-reports

List a client's monthly reports

A client's monthly reports, newest first, each with its questions and answers. client_id is required; a client of another agency is 404.

Parameter In Required Description
client_id query yes The client.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of reports object
    data array of MonthlyClientReport, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/work-orders/{id}/monthly-report

Get a Work Order month's monthly report

The report the Work Order month holds, as the report page shows it: answers, how it was taken, and its signing state. A Work Order with no report yet, or of another agency, is 404.

Parameter In Required Description
id path yes
  • 200 The report object
    data MonthlyClientReport, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/monthly-report

Save a Work Order month's monthly report

Creates the month's report (201) or updates the one it holds (200): answers, comments and how it was taken. A signed report is 409 record_locked: it is corrected with an addendum, or voided and started again as a new draft. A report the client signed before the electronic record is 422 client_signed. A Work Order of another agency is 404.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json MonthlyClientReportInput

What to save

  • 200 The updated report object
    data MonthlyClientReport, required
  • 201 The created report object
    data MonthlyClientReport, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • 422 Code client_signed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/monthly-report/signatures

Sign a Work Order month's monthly report

Records the office attestation of the month's saved report, typed as the credential's user: the staff member who conducted a phone or video check-in. The first signature locks the report. A line already signed answers 422 already_signed; a report another request changed while this one ran answers 409 stale_record; a voided one 409 voided. A Work Order with no report, or of another agency, is 404. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The signature

signer string, required
Whose line to sign: office, the staff member who conducted a phone or video check-in, signed as you. The client's line is drawn on the device in the app.
  • 200 The report object
    data MonthlyClientReport, required
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code already_signed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

OIG attestations

GET /api/v1/oig-attestations

List OIG attestations

A screen the agency ran outside the app, attested monthly. company_document_id names a company document the agency already holds; another agency's or a deleted one answers 422 company_document_not_found and nothing is recorded. The agency's OIG attestations in review month order, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of OIG attestations object
    data array of OigAttestation, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • 422 Code company_document_not_found: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/oig-attestations

Create a OIG attestation

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json OigAttestationInput

The OIG attestation's fields

  • 201 The created OIG attestation object
    data OigAttestation, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

GET /api/v1/oig-attestations/{id}

Get a OIG attestation

A screen the agency ran outside the app, attested monthly. company_document_id names a company document the agency already holds; another agency's or a deleted one answers 422 company_document_not_found and nothing is recorded.

Parameter In Required Description
id path yes
  • 200 The OIG attestation object
    data OigAttestation, required
  • 404 Code not_found: no OIG attestation with that id in this agency, including another agency's. Error
  • 422 Code company_document_not_found: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Open shifts

GET /api/v1/open-shifts

List the agency's open shifts

The open shifts the caller may see, soonest first, undated last, as the open shifts screen lists them. filter: active (open or assigned, the default), assigned, completed, cancelled, all, with_responses (at least one live response) or no_responses (none); client_id narrows to one client. A caseload member sees their clients' shifts only. Needs open_shifts.view.

Parameter In Required Description
filter query no Which shifts; active by default.
client_id query no Only this client's shifts.
limit query no Rows per page (default 25, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 A page of open shifts object
    data array of object, required
    data[].care_type string
    data[].client object
    The client, by name only: never the address or point.
    data[].client.first_name string
    data[].client.id string
    The record's id.
    data[].client.last_name string
    data[].client_gender string
    data[].cross_streets string
    data[].date_mode string
    data[].end_time string
    HH:MM.
    data[].hours string
    A one-time shift's hours.
    data[].id string
    The record's id.
    data[].inserted_at string
    When it was posted.
    data[].kind string
    data[].lock_version integer
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data[].note string
    data[].ongoing_times object
    An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
    data[].ongoing_times.end string
    HH:MM.
    data[].ongoing_times.ends_next_day boolean
    The end is past midnight.
    data[].ongoing_times.hours string
    The hours that day.
    data[].ongoing_times.run_days array of integer
    data[].ongoing_times.start string
    HH:MM.
    data[].rate_cents integer
    The hourly rate, in cents.
    data[].service_area object
    data[].service_area.id string
    The record's id.
    data[].service_area.name string
    data[].shift_id string
    An ongoing shift's slot.
    data[].start_time string
    HH:MM.
    data[].starts_on string
    The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
    data[].status string
    data[].time_mode string
    data[].zip string
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/open-shifts

Post an open shift

As the Post open shift screen's Publish does. An ongoing shift fills a Shift Plan slot and takes its days and times from the plan: a client with no Shift Plan holding the slot answers 422 no_shift_plan (details.shift_plan_path), an exact date the slot does not run on 422 not_a_run_day, and a slot already posted 409 slot_already_posted (details.open_shift_id). A note that looks like client information answers 422 client_info_found with details.finding; send it again with acknowledged: [details.finding.fingerprint] to post it anyway. An agency with open shifts off answers 409 open_shifts_off. A start sooner than the agency's post lead hours posts it with a warning. Another agency's client answers 404. Needs open_shifts.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The shift

acknowledged array of string
The fingerprints of client_info_found refusals the sender confirmed are not client information.
care_type string, required
The care the shift gives.
client_gender string, required
The client's gender, shown to responders.
client_id string, required
The client the shift is for.
cross_streets string, required
Two nearby major streets, as 'S Chambers Rd & E Hampden Ave'; never a house number.
date_mode string, required
exact needs starts_on; this_week, next_week and within_2_weeks are windows; tbd has no date yet.
end_time string
HH:MM, one-time exact only; earlier than start_time for an overnight shift.
hours string
One-time only, when time_mode is not exact: 0.5 to 24, in halves.
kind string, required
one_time for a single shift; ongoing to fill a Shift Plan slot, whose days and times are the Shift Plan's.
note string
Up to 500 characters for responders. Checked for client information: a match is refused unless acknowledged names its fingerprint.
rate_cents integer, required
The hourly rate shown to responders, in cents.
service_area_id string, required
The agency area the shift is shown at.
shift_id string
Ongoing only: the Shift Plan slot the shift fills.
start_time string
HH:MM, one-time exact only.
starts_on string
The date, for date_mode exact; ignored for a window.
time_mode string
One-time only: exact needs start_time and end_time; am, midday, pm and flexible need hours.
zip string
The client's 5-digit ZIP code, shown to responders.
  • 201 The shift and its warnings object
    data object, required
    data.care_type string
    data.client object
    The client, by name only: never the address or point.
    data.client.first_name string
    data.client.id string
    The record's id.
    data.client.last_name string
    data.client_gender string
    data.cross_streets string
    data.date_mode string
    data.end_time string
    HH:MM.
    data.hours string
    A one-time shift's hours.
    data.id string
    The record's id.
    data.inserted_at string
    When it was posted.
    data.kind string
    data.lock_version integer
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.note string
    data.ongoing_times object
    An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
    data.ongoing_times.end string
    HH:MM.
    data.ongoing_times.ends_next_day boolean
    The end is past midnight.
    data.ongoing_times.hours string
    The hours that day.
    data.ongoing_times.run_days array of integer
    data.ongoing_times.start string
    HH:MM.
    data.rate_cents integer
    The hourly rate, in cents.
    data.service_area object
    data.service_area.id string
    The record's id.
    data.service_area.name string
    data.shift_id string
    An ongoing shift's slot.
    data.start_time string
    HH:MM.
    data.starts_on string
    The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
    data.status string
    data.time_mode string
    data.zip string
    warnings array of object
    What the act was done with that the agency may want to fix; usually empty. Never a refusal: the act was done.
    warnings[].fix object
    Where it is fixed, when a page fixes it.
    warnings[].fix.label string, required
    What the link says.
    warnings[].fix.path string, required
    The app route that fixes it.
    warnings[].id string, required
    The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
    warnings[].message string, required
    For a person to read.
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes open_shifts_off, slot_already_posted: Conflict, as the operation's description says. Error
  • 422 Codes client_info_found, no_shift_plan, not_a_run_day: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/open-shifts/cross-streets

Suggest an open shift's cross streets

Two nearby major streets for the client's stored point, as the Post open shift screen's Find cross streets does; the answer is a suggestion and nothing is saved. A client in the Address Confidentiality Program, one with no point, a lookup that fails or takes over 12 seconds, or no crossing nearby answers 422 cross_streets_not_found: type two nearby major streets. Another agency's client answers 404. Needs open_shifts.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The client

client_id string, required
The client.
  • 200 The cross streets object
    data object, required
    data.cross_streets string, required
    <road> & <road>
  • 404 Not Found, as the operation's description says. Error
  • 422 Code cross_streets_not_found: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/open-shifts/dashboard

Read the open-shifts dashboard

As the open shifts dashboard shows it. With no section: counts (open, open_no_responses, assigned_upcoming, paused) and coverage by area (open, no_responses, within_reach per area). With section: one list's page and total: not_responding (people alerted at least the agency's not_responding_alerts times in not_responding_days days who did not respond), onboarding (candidates and potential caregivers waiting for onboarding), pauses (caregivers paused from open shifts or holding unvoided strikes inside the agency's strike_window_days: each row's strikes, last_strike_kind, last_strike_at, and paused_until, null when not paused), activity (open-shift audit rows of the not_responding_days window, pay values redacted) or alerts_sent (every alert of a shift the caller may see; status narrows it). A caseload member reads only their clients' shifts, and no area, lead or caregiver rows. Another section answers 422 invalid_section, another status 422 invalid_status. Needs open_shifts.administer.

Parameter In Required Description
section query no Which list; the counts and coverage when left out.
status query no alerts_sent only: the alerts of this status.
limit query no Rows per page (default 25, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 The dashboard, or one section's page object
    data object, required
    data.counts object
    No section: the four counts.
    data.coverage array of object
    No section: one row per area holding an open shift.
    data.rows array of object
    data.section string
    data.total integer
  • 422 Codes invalid_section, invalid_status: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/open-shifts/{id}

Read an open shift

One shift as the list answers it. Another agency's shift, or one of a client off a caseload member's clients, answers 404. Needs open_shifts.view.

Parameter In Required Description
id path yes
  • 200 The shift object
    data object, required
    data.care_type string
    data.client object
    The client, by name only: never the address or point.
    data.client.first_name string
    data.client.id string
    The record's id.
    data.client.last_name string
    data.client_gender string
    data.cross_streets string
    data.date_mode string
    data.end_time string
    HH:MM.
    data.hours string
    A one-time shift's hours.
    data.id string
    The record's id.
    data.inserted_at string
    When it was posted.
    data.kind string
    data.lock_version integer
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.note string
    data.ongoing_times object
    An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
    data.ongoing_times.end string
    HH:MM.
    data.ongoing_times.ends_next_day boolean
    The end is past midnight.
    data.ongoing_times.hours string
    The hours that day.
    data.ongoing_times.run_days array of integer
    data.ongoing_times.start string
    HH:MM.
    data.rate_cents integer
    The hourly rate, in cents.
    data.service_area object
    data.service_area.id string
    The record's id.
    data.service_area.name string
    data.shift_id string
    An ongoing shift's slot.
    data.start_time string
    HH:MM.
    data.starts_on string
    The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
    data.status string
    data.time_mode string
    data.zip string
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/open-shifts/{id}

Change an open shift

As the Edit screen's Save does: the fields sent change, the rest keep their values; lock_version is required. A lock_version other than the shift's answers 409 stale_record; a shift whose start has passed, or that is completed or cancelled, 409 open_shift_closed; a kind or slot change on an assigned ongoing shift 409 open_shift_assigned; a move onto a slot already posted 409 slot_already_posted. The note and the Shift Plan are judged as on create. Needs open_shifts.manage.

Parameter In Required Description
id path yes

Request body (required) application/json object

The fields that change

acknowledged array of string
The fingerprints of client_info_found refusals the sender confirmed are not client information.
care_type string
The care the shift gives.
client_gender string
The client's gender, shown to responders.
cross_streets string
Two nearby major streets, as 'S Chambers Rd & E Hampden Ave'; never a house number.
date_mode string
exact needs starts_on; this_week, next_week and within_2_weeks are windows; tbd has no date yet.
end_time string
HH:MM, one-time exact only; earlier than start_time for an overnight shift.
hours string
One-time only, when time_mode is not exact: 0.5 to 24, in halves.
kind string
one_time for a single shift; ongoing to fill a Shift Plan slot, whose days and times are the Shift Plan's.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
note string
Up to 500 characters for responders. Checked for client information: a match is refused unless acknowledged names its fingerprint.
rate_cents integer
The hourly rate shown to responders, in cents.
service_area_id string
The agency area the shift is shown at.
shift_id string
Ongoing only: the Shift Plan slot the shift fills.
start_time string
HH:MM, one-time exact only.
starts_on string
The date, for date_mode exact; ignored for a window.
time_mode string
One-time only: exact needs start_time and end_time; am, midday, pm and flexible need hours.
zip string
The client's 5-digit ZIP code, shown to responders.
  • 200 The shift and its warnings object
    data object, required
    data.care_type string
    data.client object
    The client, by name only: never the address or point.
    data.client.first_name string
    data.client.id string
    The record's id.
    data.client.last_name string
    data.client_gender string
    data.cross_streets string
    data.date_mode string
    data.end_time string
    HH:MM.
    data.hours string
    A one-time shift's hours.
    data.id string
    The record's id.
    data.inserted_at string
    When it was posted.
    data.kind string
    data.lock_version integer
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.note string
    data.ongoing_times object
    An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
    data.ongoing_times.end string
    HH:MM.
    data.ongoing_times.ends_next_day boolean
    The end is past midnight.
    data.ongoing_times.hours string
    The hours that day.
    data.ongoing_times.run_days array of integer
    data.ongoing_times.start string
    HH:MM.
    data.rate_cents integer
    The hourly rate, in cents.
    data.service_area object
    data.service_area.id string
    The record's id.
    data.service_area.name string
    data.shift_id string
    An ongoing shift's slot.
    data.start_time string
    HH:MM.
    data.starts_on string
    The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
    data.status string
    data.time_mode string
    data.zip string
    warnings array of object
    What the act was done with that the agency may want to fix; usually empty. Never a refusal: the act was done.
    warnings[].fix object
    Where it is fixed, when a page fixes it.
    warnings[].fix.label string, required
    What the link says.
    warnings[].fix.path string, required
    The app route that fixes it.
    warnings[].id string, required
    The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
    warnings[].message string, required
    For a person to read.
  • 409 Codes open_shift_assigned, open_shift_closed, slot_already_posted, stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/open-shifts/{id}/assign

Assign a caregiver to an open shift

As the responder row's Assign does: the caregiver takes the shift, and an ongoing shift's caregiver is also picked on the client's Shift Plan slot (nothing is generated). A caregiver who did not respond is accepted when the agency's api_may_assign_non_responder is on; when it is off, 422 not_a_responder. An inactive or deleted caregiver answers 422 caregiver_not_active; a shift already assigned 409 open_shift_assigned ("Already assigned to <name>"); a completed or cancelled one 409 open_shift_closed; a client with no Shift Plan 422 no_shift_plan (details.shift_plan_path), with the whole assign rolled back. A schedule clash, a posted rate that differs from the caregiver's pay rate, or a start that has passed is answered as a warning (open_shifts.schedule_clash, open_shifts.rate_differs, open_shifts.start_passed) and the shift is still assigned. Another agency's shift or caregiver answers 404. Needs open_shifts.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The caregiver

caregiver_id string, required
The caregiver to assign.
  • 200 The assigned shift, its notes and its warnings object
    data object, required
    data.notes array of string
    What the assign did to the Shift Plan, for an ongoing shift: who takes the slot from the next Generate and who keeps the current Work Order until then.
    data.open_shift object
    data.open_shift.care_type string
    data.open_shift.client object
    The client, by name only: never the address or point.
    data.open_shift.client.first_name string
    data.open_shift.client.id string
    The record's id.
    data.open_shift.client.last_name string
    data.open_shift.client_gender string
    data.open_shift.cross_streets string
    data.open_shift.date_mode string
    data.open_shift.end_time string
    HH:MM.
    data.open_shift.hours string
    A one-time shift's hours.
    data.open_shift.id string
    The record's id.
    data.open_shift.inserted_at string
    When it was posted.
    data.open_shift.kind string
    data.open_shift.lock_version integer
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.open_shift.note string
    data.open_shift.ongoing_times object
    An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
    data.open_shift.ongoing_times.end string
    HH:MM.
    data.open_shift.ongoing_times.ends_next_day boolean
    The end is past midnight.
    data.open_shift.ongoing_times.hours string
    The hours that day.
    data.open_shift.ongoing_times.run_days array of integer
    data.open_shift.ongoing_times.start string
    HH:MM.
    data.open_shift.rate_cents integer
    The hourly rate, in cents.
    data.open_shift.service_area object
    data.open_shift.service_area.id string
    The record's id.
    data.open_shift.service_area.name string
    data.open_shift.shift_id string
    An ongoing shift's slot.
    data.open_shift.start_time string
    HH:MM.
    data.open_shift.starts_on string
    The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
    data.open_shift.status string
    data.open_shift.time_mode string
    data.open_shift.zip string
    data.shift_plan_path string
    The client's Shift Plan, for an ongoing shift; null for a one-time one.
    warnings array of object
    What the act was done with that the agency may want to fix; usually empty. Never a refusal: the act was done.
    warnings[].fix object
    Where it is fixed, when a page fixes it.
    warnings[].fix.label string, required
    What the link says.
    warnings[].fix.path string, required
    The app route that fixes it.
    warnings[].id string, required
    The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
    warnings[].message string, required
    For a person to read.
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes open_shift_assigned, open_shift_closed: Conflict, as the operation's description says. Error
  • 422 Codes caregiver_not_active, no_shift_plan, not_a_responder: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/open-shifts/{id}/cancel

Cancel an open shift

As the card's Cancel shift does. A shift already completed or cancelled answers 409 open_shift_closed ("This shift is already cancelled"). Needs open_shifts.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The cancelled shift object
    data object, required
    data.care_type string
    data.client object
    The client, by name only: never the address or point.
    data.client.first_name string
    data.client.id string
    The record's id.
    data.client.last_name string
    data.client_gender string
    data.cross_streets string
    data.date_mode string
    data.end_time string
    HH:MM.
    data.hours string
    A one-time shift's hours.
    data.id string
    The record's id.
    data.inserted_at string
    When it was posted.
    data.kind string
    data.lock_version integer
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.note string
    data.ongoing_times object
    An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
    data.ongoing_times.end string
    HH:MM.
    data.ongoing_times.ends_next_day boolean
    The end is past midnight.
    data.ongoing_times.hours string
    The hours that day.
    data.ongoing_times.run_days array of integer
    data.ongoing_times.start string
    HH:MM.
    data.rate_cents integer
    The hourly rate, in cents.
    data.service_area object
    data.service_area.id string
    The record's id.
    data.service_area.name string
    data.shift_id string
    An ongoing shift's slot.
    data.start_time string
    HH:MM.
    data.starts_on string
    The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
    data.status string
    data.time_mode string
    data.zip string
  • 409 Code open_shift_closed: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/open-shifts/{id}/complete

Close an assigned open shift as completed

As the card's Completed does: the shift moves to completed with outcome completed, and its Shift Plan pick and Visit stay as they are. Before the shift's start it answers 409 not_started while the agency's complete_before_start is off. A shift that is not assigned, a second complete included, answers 409 not_assigned. Another agency's shift, or one off a caseload member's clients, answers 404. Needs open_shifts.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The completed shift object
    data object, required
    data.care_type string
    data.client object
    The client, by name only: never the address or point.
    data.client.first_name string
    data.client.id string
    The record's id.
    data.client.last_name string
    data.client_gender string
    data.cross_streets string
    data.date_mode string
    data.end_time string
    HH:MM.
    data.hours string
    A one-time shift's hours.
    data.id string
    The record's id.
    data.inserted_at string
    When it was posted.
    data.kind string
    data.lock_version integer
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.note string
    data.ongoing_times object
    An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
    data.ongoing_times.end string
    HH:MM.
    data.ongoing_times.ends_next_day boolean
    The end is past midnight.
    data.ongoing_times.hours string
    The hours that day.
    data.ongoing_times.run_days array of integer
    data.ongoing_times.start string
    HH:MM.
    data.rate_cents integer
    The hourly rate, in cents.
    data.service_area object
    data.service_area.id string
    The record's id.
    data.service_area.name string
    data.shift_id string
    An ongoing shift's slot.
    data.start_time string
    HH:MM.
    data.starts_on string
    The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
    data.status string
    data.time_mode string
    data.zip string
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes not_assigned, not_started: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/open-shifts/{id}/no-show

Mark an assigned open shift a no-show

As the card's No-show does, once the shift's start has passed: the assignment is undone as an unassign does it (a scheduled Visit is cancelled, reason caregiver_call_off; one under way is left for the office and answered as an open_shifts.needs_attention warning), the shift is cancelled with outcome no_show, its responders and the assignee are told it is cancelled, and the assignee is struck once. When the strikes in the agency's window reach its strikes_before_pause, the caregiver is paused from responding to open shifts. Before the start it answers 409 not_started ("No-show can be marked once the shift has started"); a shift that is not assigned, a second no-show included, 409 not_assigned; a shift assigned to someone else while the call ran 409 stale_record. Another agency's shift, or one off a caseload member's clients, answers 404. Needs open_shifts.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The cancelled shift and its warnings object
    data object, required
    data.care_type string
    data.client object
    The client, by name only: never the address or point.
    data.client.first_name string
    data.client.id string
    The record's id.
    data.client.last_name string
    data.client_gender string
    data.cross_streets string
    data.date_mode string
    data.end_time string
    HH:MM.
    data.hours string
    A one-time shift's hours.
    data.id string
    The record's id.
    data.inserted_at string
    When it was posted.
    data.kind string
    data.lock_version integer
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.note string
    data.ongoing_times object
    An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
    data.ongoing_times.end string
    HH:MM.
    data.ongoing_times.ends_next_day boolean
    The end is past midnight.
    data.ongoing_times.hours string
    The hours that day.
    data.ongoing_times.run_days array of integer
    data.ongoing_times.start string
    HH:MM.
    data.rate_cents integer
    The hourly rate, in cents.
    data.service_area object
    data.service_area.id string
    The record's id.
    data.service_area.name string
    data.shift_id string
    An ongoing shift's slot.
    data.start_time string
    HH:MM.
    data.starts_on string
    The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
    data.status string
    data.time_mode string
    data.zip string
    warnings array of object
    What the act was done with that the agency may want to fix; usually empty. Never a refusal: the act was done.
    warnings[].fix object
    Where it is fixed, when a page fixes it.
    warnings[].fix.label string, required
    What the link says.
    warnings[].fix.path string, required
    The app route that fixes it.
    warnings[].id string, required
    The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
    warnings[].message string, required
    For a person to read.
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes not_assigned, not_started, stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/open-shifts/{id}/responses

List who responded to an open shift

The shift's live responses (a withdrawn one is not listed), as the coordinator's card lists them: active caregivers first, then nearest to the shift's service area, then by when they responded. limit defaults to 50 (at most 100). home_area is answered only to a holder of open_shifts.administer. Another agency's shift, or one off a caseload member's clients, answers 404. Needs open_shifts.manage: a view-only credential answers 403.

Parameter In Required Description
id path yes
limit query no Rows per page (default 50, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 A page of responses object
    data array of object, required
    data[].active boolean
    The caregiver is active.
    data[].caregiver_id string
    The caregiver; null for a candidate.
    data[].completed integer
    Open shifts this caregiver has completed.
    data[].home_area object
    The caregiver's home service area. Present only for a holder of open_shifts.administer; null when none is set.
    data[].home_area.id string
    The record's id.
    data[].home_area.name string
    data[].id string
    The record's id.
    data[].miles integer
    Whole miles from the caregiver's home area to the shift's service area; null when either has no known point.
    data[].name string
    Last, First.
    data[].open_shift_id string
    The record's id.
    data[].phone string
    data[].responded_at string
    When they responded.
    data[].role string
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/open-shifts/{id}/unassign

Remove the caregiver from an open shift

As the card's Remove assignment does: the shift is open again and its live responders, other than the caregiver who left, are told. A one-time cover's scheduled Visit is cancelled (reason schedule_change) and the temporary Assignment it made is closed; an ongoing shift's Shift Plan pick is cleared and the slot's Work Order archived while its start has not passed. A Visit already under way, or an ongoing shift whose start passed, is left for the office and answered as a warning (open_shifts.needs_attention). A shift that is not assigned answers 409 open_shift_not_assigned. Another agency's shift answers 404. Needs open_shifts.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The reopened shift and its warnings object
    data object, required
    data.care_type string
    data.client object
    The client, by name only: never the address or point.
    data.client.first_name string
    data.client.id string
    The record's id.
    data.client.last_name string
    data.client_gender string
    data.cross_streets string
    data.date_mode string
    data.end_time string
    HH:MM.
    data.hours string
    A one-time shift's hours.
    data.id string
    The record's id.
    data.inserted_at string
    When it was posted.
    data.kind string
    data.lock_version integer
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.note string
    data.ongoing_times object
    An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
    data.ongoing_times.end string
    HH:MM.
    data.ongoing_times.ends_next_day boolean
    The end is past midnight.
    data.ongoing_times.hours string
    The hours that day.
    data.ongoing_times.run_days array of integer
    data.ongoing_times.start string
    HH:MM.
    data.rate_cents integer
    The hourly rate, in cents.
    data.service_area object
    data.service_area.id string
    The record's id.
    data.service_area.name string
    data.shift_id string
    An ongoing shift's slot.
    data.start_time string
    HH:MM.
    data.starts_on string
    The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
    data.status string
    data.time_mode string
    data.zip string
  • 404 Not Found, as the operation's description says. Error
  • 409 Code open_shift_not_assigned: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/service-areas

List the agency's service areas

The areas open shifts are posted at, by their place in the list, as the areas page lists them; include_archived adds the archived ones after the rest, by name. Needs open_shifts.view.

Parameter In Required Description
include_archived query no Add the archived areas.
limit query no Rows per page (default 100, at most 500; a larger value is served as 500).
offset query no Rows to skip.
  • 200 A page of areas object
    data array of object, required
    data[].archived boolean, required
    Archived: kept for the shifts that name it, offered for none.
    data[].county string
    A Colorado county.
    data[].id string, required
    The record's id.
    data[].latitude string, required
    The latitude of the area's centre.
    data[].longitude string, required
    The longitude of the area's centre.
    data[].name string, required
    The area's name.
    data[].position integer, required
    Its place in the agency's list, 1 first; an archived area keeps its last.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/service-areas

Add a service area

As the areas page's Add does: last in the list, or at position, the others moving to make room. A name the agency already holds, archived included, answers 422 validation_failed naming name. Needs agency_settings.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The area

county string
A Colorado county (Douglas), or null for none.
latitude number, required
The latitude of the area's centre.
longitude number, required
The longitude of the area's centre.
name string, required
The area's name, as the agency writes it (Denver — Downtown, Parker).
position integer
Optional; last when left out. Its place in the agency's list, 1 first; the other areas move to make room, and a place past the end puts it last.
  • 201 The area object
    data object, required
    data.archived boolean, required
    Archived: kept for the shifts that name it, offered for none.
    data.county string
    A Colorado county.
    data.id string, required
    The record's id.
    data.latitude string, required
    The latitude of the area's centre.
    data.longitude string, required
    The longitude of the area's centre.
    data.name string, required
    The area's name.
    data.position integer, required
    Its place in the agency's list, 1 first; an archived area keeps its last.
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/service-areas/import-starter

Add the Denver-metro starter areas

Adds each area of the starter list whose name the agency does not hold, archived included, after its last area, as the areas page's Use the starter list does. A second call adds none and answers inserted 0. Needs agency_settings.manage.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 How many were added object
    data object, required
    data.inserted integer, required
    The areas added.
  • default An error, in the shared envelope. Error

PATCH /api/v1/service-areas/{id}

Change a service area

Renames it, moves it (position, clamped to the list), changes its county or point, archives it (archived true, closing the gap it leaves) or restores it (archived false, last unless a position is sent). A field left out keeps its value. Another agency's area answers 404. Needs agency_settings.manage.

Parameter In Required Description
id path yes

Request body (required) application/json object

The fields that change

archived boolean
true archives the area: it keeps its id and stays on what names it, and is offered for nothing new; false restores it, last in the list unless a position is sent.
county string
A Colorado county (Douglas), or null for none.
latitude number
The latitude of the area's centre.
longitude number
The longitude of the area's centre.
name string
The area's name, as the agency writes it (Denver — Downtown, Parker).
position integer
Its place in the agency's list, 1 first; the other areas move to make room, and a place past the end puts it last.
  • 200 The area object
    data object, required
    data.archived boolean, required
    Archived: kept for the shifts that name it, offered for none.
    data.county string
    A Colorado county.
    data.id string, required
    The record's id.
    data.latitude string, required
    The latitude of the area's centre.
    data.longitude string, required
    The longitude of the area's centre.
    data.name string, required
    The area's name.
    data.position integer, required
    Its place in the agency's list, 1 first; an archived area keeps its last.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Paper capture

GET /api/v1/paper-capture/applications/latest

A record's latest paper update

The newest paper update to the record not undone, the data of its "From paper" badge, or data null; undoable says whether the badge offers Undo. Open without the paper-capture consent. 422 invalid_target_kind or invalid_id for a parameter it cannot read.

Parameter In Required Description
target_kind query yes
target_id query yes
  • 200 The paper update object
    data object, required
  • 422 Code invalid_target_kind: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/applications/{id}/undo

Undo a paper update

Undo, as the record page's "From paper" badge does: every value the update wrote and nobody changed since is restored, rows it added are deleted, and lines names each field left alone; the form can then be applied again. Open without the paper-capture consent. Already undone answers 409 already_reverted; a record that is not editable 422 not_editable; an update that created its record (undoable false) 422 created_from_paper; answers the record now refuses (a question form) 422 invalid_answers with field_ids and errors, as apply does. Undo writes the record its apply wrote, so it needs what applying did: besides clients.manage, a Work Order work_orders.manage, a timesheet timesheets.manage, a Plan of Care or supervisory visit care_plans.manage, and a Time and Services Card timesheets.manage too; without it 403 forbidden names the permission and nothing is restored. Another agency's update answers 404.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The paper update object
    data object, required
  • 403 Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Code already_reverted: Conflict, as the operation's description says. Error
  • 422 Codes created_from_paper, invalid_answers, not_editable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/paper-capture/forms

List paper forms

The Paper inbox's forms, newest first, each with its state, form type, target record, the sentence the inbox shows for a failure, the actions it offers (read, discard, choose_target, find_target for a form that matched no record of a kind it never creates, choose_client, choose_form_type with form_type_choices, review, view for an applied form), review_url (the page Review or View opens), unprinted (read from a layout HCB never printed), the scan it was read from (scan_id) and total_count. status narrows them (422 invalid_status for another); scan_id narrows them to one upload's forms, which appear once the scan is prepared. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required.

Parameter In Required Description
limit query no Rows per page (default 50, at most 100; a larger value is served as 100).
offset query no Rows to skip.
status query no
scan_id query no Only the forms read from this scan, the id an upload answered (422 invalid_id for another value).
  • 200 The forms object
    data array of object, required
    limit integer
    This page's size.
    offset integer
    Where it starts.
    total_count integer, required
    All of them, for status.
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 422 Code invalid_status: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/paper-capture/forms/{id}

Discard a paper form

Discard, as the inbox does; an applied form cannot be discarded. A form whose state does not offer the action answers 422 with the inbox's sentence. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's form answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The form object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/paper-capture/forms/{id}

A paper form, as its review shows it

The inbox's fields with the review's: mode, its rows (each field's current and read values, state, attention, the check's sentence, the decision it starts with, blank_allowed: false on a row naming who the client is, and kept, the sentence on a row the apply never writes, such as a stored Medicaid ID), notes (in review the unprinted-layout warning and the checks; once applied what the save said), the summary line (once applied, when and by whom), applied_rows once applied (each value written from paper as after_text beside the value it replaced as before_text, as the applied review shows them), its pages (images are GET /api/v1/paper-capture/pages/{id}/image), the records Choose record offers, and the draft a revised plan was replaced by. A Plan of Care or supervisory visit whose record is signed, revised or not editable says so in notes, and actions add revise_plan for a member with care_plans.manage (POST /api/v1/plans-of-care/{id}/revise on target.id), reopen_visit for a member with care_plans.manage (POST /api/v1/supervisory-visits/{id}/reopen with a reason, on target.id) or retarget_to_draft, as the review offers them; paper revises a signed record, never changes it in place. A PHI view. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's form answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The form object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/forms/{id}/apply

Apply a paper form to its record

Apply, as the review does, with one decision per row: accept, keep_current, blank or value. A row left out of decisions is not written, a New row included (the review screen preselects accept for one; this endpoint does not), and an apply that writes nothing puts no From paper on the record. A record changed since get answers 409 stale with the rows as they are now; a needs-attention row left undecided 422 needs_attention naming its field_ids; values the record refuses 422 validation_failed; any other refusal 422 with the review's sentence. A Work Order's Time and Services Card also writes each day as a paper_scan care log; care_log_warnings lists the office draft care logs that took the paper's values, the days the caregiver or an import already logged (kept as they are), the paper days no longer drafts, and each day's differences from the plan; for either card, it also lists each day whose delivery another source recorded, where the paper's times were not written and the recorded times stand (kind recorded; those fields are left out of what the apply wrote). None of these refuses the apply. Besides clients.manage, applying needs the target record's own permission: a Work Order work_orders.manage, a timesheet timesheets.manage, a Plan of Care or supervisory visit care_plans.manage, and a Time and Services Card timesheets.manage too, since it writes the month's timesheet and care logs; without it 403 forbidden names the permission. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's form answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The decisions

decisions array of object, required
decisions[].choice string, required
What to do with the row.
decisions[].field string, required
The row's field_id.
decisions[].shown_current string
The row's current, as GET /api/v1/paper-capture/forms/{id} answered it, sent back unchanged: a record changed since answers 409 stale.
decisions[].value string
The value to write, for choice value.
  • 201 The paper update object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes needs_attention, validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/forms/{id}/client

Choose the client of an unmatched client sheet

The review's client picker for a client sheet that matched no client; until the sheet is applied, choosing another client points it there instead. A form whose state does not offer the action answers 422 with the inbox's sentence. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's form answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The client

client_id string, required
  • 200 The form object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/forms/{id}/draft

Apply a paper form to the draft that replaced its plan or visit

For a plan of care revised, or a supervisory visit reopened for correction, since the page was printed: draft_id is get's draft_id. A form whose state does not offer the action answers 422 with the inbox's sentence. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's form answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The draft

draft_id string, required
The draft.
  • 200 The form object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/forms/{id}/form-type

Choose an unprinted page's form type

The form-type picker: form_key is one of form_type_choices. The page is then read again, which sends it to Anthropic and spends reading credit. A form whose state does not offer the action answers 422 with the inbox's sentence. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's form answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The form type

form_key string, required
  • 200 The form object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/forms/{id}/merge

Join two paper forms' pages

Join with, as the inbox does: every page of from_form_id moves to this form, which waits for a Read; from_form_id is joined in and leaves the inbox. A read already done on either form is discarded, so a new Read is needed. Forms of two different form types or records answer 422 mismatch, a page both forms hold 422 duplicate_page, and a form that is being read, applied, discarded or joined already, or already holds every page, 422 not_mergeable, each with the inbox's sentence, as every inbox action refuses. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's form answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The form to join in

from_form_id string, required
The form whose pages move to this one.
  • 200 The form object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes duplicate_page, not_mergeable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/forms/{id}/read

Read a paper form

Read, or Read again, as the inbox does: the page is sent to Anthropic and spends reading credit. A form waiting for its form type answers 422 awaiting_form_type: choose it first (POST /api/v1/paper-capture/forms/{id}/form-type). A form whose state does not offer the action answers 422 with the inbox's sentence. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's form answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The form object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Code awaiting_form_type: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/forms/{id}/target

Choose a paper form's record

Choose record, as the inbox does: target_id is one of get's candidates or, when actions include find_target, the id of any of the agency's records of the form's kind (a Work Order for a Time and Services Card or Monthly Client Report, a supervisory visit for a Supervisory Visit form), as the review's record search finds them. A form whose state does not offer the action answers 422 with the inbox's sentence. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's form answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The record

target_id string, required
  • 200 The form object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/paper-capture/pages/{id}/image

A paper form page's image

A URL for the page's image, valid for 300 seconds, issued once the view is recorded. An image the 30-day purge removed answers 410 image_removed; the store not answering 503 storage_unavailable. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required. Another agency's page answers 404.

Parameter In Required Description
id path yes
  • 200 The image's URL object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 410 Code image_removed: Gone, as the operation's description says. Error
  • 503 Code storage_unavailable: Service Unavailable, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/scans

Upload a paper scan

Multipart field file (.jpg, .jpeg, .png, .heic, .pdf), up to 10 MB, as the upload control takes one: the agency's prepaid reading credit is checked against the pages first (422 insufficient_credit), then it is stored and read in the background, and its forms appear in GET /api/v1/paper-capture/forms. The same file uploaded again answers the scan already on file, existing true. A larger file, up to 25 MB, goes through POST /api/v1/paper-capture/scans/uploads. More than the agency's daily uploads answers 429 daily_upload_limit; a type it does not read 422 unsupported_file; over the limit 413 file_too_large. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) multipart/form-data object

The file

file string, required
The photo or scan.
origin_target_id string
That record's id.
origin_target_kind string
The kind of record the upload is made from, as a record page's upload control sends it; leave out for the Paper inbox's.
  • 201 The scan object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 413 Code file_too_large: Request Entity Too Large, as the operation's description says. Error
  • 422 Codes insufficient_credit, unsupported_file: Unprocessable Content, as the operation's description says. Error
  • 429 Code daily_upload_limit: Too Many Requests, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/paper-capture/scans/uploads

Request a slot to upload a large paper scan

For a file larger than 10 MB, up to 25 MB: answers upload_url, single-use, bound to this credential and this agency, valid for 30 minutes. PUT the file's bytes to it (PUT /api/v1/paper-capture/scans/uploads/{token}) with the same credential; the answer is the scan. The name and the origin record are checked now (422 unsupported_file, 422 origin_target_not_found), the credit and the bytes when they arrive. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The file's details

file_name string, required
The file's name, with its extension (.jpg, .jpeg, .png, .heic, .pdf).
origin_target_id string
That record's id.
origin_target_kind string
The kind of record the upload is made from, as a record page's upload control sends it; leave out for the Paper inbox's.
  • 201 The slot object
    data object, required
    data.content_type string
    data.expires_at string
    data.file_name string
    data.max_file_size integer
    The largest file the slot takes, in bytes.
    data.method string
    PUT.
    data.upload_url string
    Where to PUT the file's bytes, once, with this credential.
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 422 Codes origin_target_not_found, unsupported_file: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/paper-capture/scans/uploads/{token}

Upload a paper scan's bytes to its slot

The body is the file's bytes, nothing else (JSON, form or multipart answer 415), up to 25 MB; over it 413 file_too_large. Sent with the credential that requested the slot: another credential's or agency's slot answers 404, as an unknown one does. A slot stores one scan: used answers 409 upload_slot_used with the scan's id in details, one another PUT is still storing 409 upload_slot_in_progress, one past expires_at 410 upload_slot_expired. A file the upload refuses (422) leaves the slot usable until it expires. Without the agency's paper-capture consent (Settings > Data sharing) it answers 403 paper_capture_consent_required.

Parameter In Required Description
token path yes The slot's token, from its upload_url.

Request body (required) application/octet-stream string

The file's bytes

  • 201 The scan object
    data object, required
  • 403 Code paper_capture_consent_required: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes upload_slot_in_progress, upload_slot_used: Conflict, as the operation's description says. Error
  • 410 Code upload_slot_expired: Gone, as the operation's description says. Error
  • 413 Code file_too_large: Request Entity Too Large, as the operation's description says. Error
  • 415 Unsupported Media Type, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Payroll

DELETE /api/v1/caregivers/{id}/adp-hire

Clear a send to ADP that RUN does not have

As "I checked RUN: not there" on ADP workers does: clears the caregiver's send ADP did not answer (or one still in flight two minutes after it started), or one waiting in RUN's New Hire Wizard that was never finished, so Add to ADP is offered again. 409 hire_not_abandonable for any other (none open, or a send still in flight). 403 read_only for a read-only agency. Credentials whose member holds payroll.send_to_adp only (403 forbidden otherwise); 404 for a caregiver this agency does not have, before anything else; 409 payroll_integration_off while the agency's ADP API connection is off; 409 not_api_connection while it sends payroll by file or SFTP.

Parameter In Required Description
id path yes
  • 200 The cleared send object
    data object, required
    data.caregiver_id string, required
    The caregiver.
    data.message string, required
    The sentence ADP workers shows on the caregiver's row; null where it offers Add to ADP again.
    data.status string, required
    Where the send stands: sent (ADP named the worker, now linked), pending_in_adp (an ADP user finishes it in RUN's New Hire Wizard), unconfirmed (ADP did not answer: check RUN's new hires before sending again), abandoned (cleared by "I checked RUN: not there").
  • 403 Code read_only: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes hire_not_abandonable, not_api_connection, payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/caregivers/{id}/adp-hire

Add a caregiver to ADP as a new hire

As Add to ADP on ADP workers does: sends the caregiver to RUN as a new hire (worker.hire) with the legal first and last name, address, hire date and SSN, each left out when missing (RUN's New Hire Wizard asks for it); an ADP user finishes the hire there. Sent once, never retried. Answers what the caregiver's row shows: sent (ADP named the worker; it is now linked), pending_in_adp (linked by the next sync once the hire is finished), or unconfirmed (ADP did not answer: check RUN's new hires before sending again, then DELETE this to clear it). At full access only: 403 submission_blocked while the agency's HomeCareBilling billing blocks submission, 403 read_only for a read-only agency. 409 hire_push_off unless the connection is RUN with allow_hire_push on; 409 already_linked for a caregiver with an ADP worker or an open send; 422 hire_refused when ADP refused the hire; 502 adp_unreachable when the request never reached ADP (nothing sent). Credentials whose member holds payroll.send_to_adp only (403 forbidden otherwise); 404 for a caregiver this agency does not have, before anything else; 409 payroll_integration_off while the agency's ADP API connection is off; 409 not_api_connection while it sends payroll by file or SFTP.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 Where the send stands object
    data object, required
    data.caregiver_id string, required
    The caregiver.
    data.message string, required
    The sentence ADP workers shows on the caregiver's row; null where it offers Add to ADP again.
    data.status string, required
    Where the send stands: sent (ADP named the worker, now linked), pending_in_adp (an ADP user finishes it in RUN's New Hire Wizard), unconfirmed (ADP did not answer: check RUN's new hires before sending again), abandoned (cleared by "I checked RUN: not there").
  • 403 Codes read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes already_linked, hire_push_off, not_api_connection, payroll_integration_off: Conflict, as the operation's description says. Error
  • 422 Code hire_refused: Unprocessable Content, as the operation's description says. Error
  • 502 Code adp_unreachable: Bad Gateway, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/cash-advances

List the agency's cash advances

US-102.37: as the Cash advances page lists them, newest first, filtered by status, search (the caregiver's name) and deduct_in_month (YYYY-MM, the payroll month an advance is deducted in; absent is every month, where the page starts at the current one). totals sums amount and remaining_balance over every advance the filters match, not this page.

Parameter In Required Description
status query no One of outstanding, partially_repaid, fully_repaid, written_off.
search query no Part of the caregiver's name (at most 100 characters).
deduct_in_month query no YYYY-MM: the payroll month the advances are deducted in.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of cash advances object
    data array of object, required
    data[].advance_date string
    data[].amount string
    The amount advanced.
    data[].caregiver_id string
    The record's id.
    data[].caregiver_name string
    "Last, First". In GET /cash-advances; a write's answer leaves it out.
    data[].check_number string
    The check the advance was paid by.
    data[].deduct_in_month string
    The 1st of the payroll month the advance is deducted in.
    data[].id string
    The record's id.
    data[].reason string
    Why it was advanced, as typed.
    data[].remaining_balance string
    What is still owed.
    data[].status string
    outstanding, partially_repaid, fully_repaid or written_off.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
    totals object, required
    Over every advance the filters match, not this page.
    totals.amount string
    The amounts advanced.
    totals.remaining_balance string
    What is still owed.
  • default An error, in the shared envelope. Error

POST /api/v1/cash-advances

Advance cash to a caregiver

Records a cash advance to one of the agency's caregivers, as Cash advances does; payroll recovers it. A caregiver of another agency answers 422.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The advance

advance_date string, required
YYYY-MM-DD.
amount string, required
A positive decimal.
caregiver_id string, required
The caregiver.
check_number string
The check the advance was paid by, at most 20 characters.
deduct_in_month string
The payroll month the advance is deducted in, held as the 1st of that month; absent, the advance date's month.
reason string
Why it is advanced; optional.
  • 201 The advance object
    data object, required
    data.advance_date string
    data.amount string
    The amount advanced.
    data.caregiver_id string
    The record's id.
    data.caregiver_name string
    "Last, First". In GET /cash-advances; a write's answer leaves it out.
    data.check_number string
    The check the advance was paid by.
    data.deduct_in_month string
    The 1st of the payroll month the advance is deducted in.
    data.id string
    The record's id.
    data.reason string
    Why it was advanced, as typed.
    data.remaining_balance string
    What is still owed.
    data.status string
    outstanding, partially_repaid, fully_repaid or written_off.
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/cash-advances/{id}/repayments

Record a repayment of an advance

Lowers the advance's remaining balance by amount, as Cash advances does. A repaid or written-off advance answers 422. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The repayment

amount string, required
A positive decimal.
notes string
Free text on the repayment.
repayment_date string, required
YYYY-MM-DD.
  • 200 The advance object
    data object, required
    data.advance_date string
    data.amount string
    The amount advanced.
    data.caregiver_id string
    The record's id.
    data.caregiver_name string
    "Last, First". In GET /cash-advances; a write's answer leaves it out.
    data.check_number string
    The check the advance was paid by.
    data.deduct_in_month string
    The 1st of the payroll month the advance is deducted in.
    data.id string
    The record's id.
    data.reason string
    Why it was advanced, as typed.
    data.remaining_balance string
    What is still owed.
    data.status string
    outstanding, partially_repaid, fully_repaid or written_off.
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/cash-advances/{id}/write-off

Write off what remains of an advance

As Cash advances does, with written_off_reason. A repaid or written-off advance answers 422. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Why

written_off_reason string
Why it is written off.
  • 200 The advance object
    data object, required
    data.advance_date string
    data.amount string
    The amount advanced.
    data.caregiver_id string
    The record's id.
    data.caregiver_name string
    "Last, First". In GET /cash-advances; a write's answer leaves it out.
    data.check_number string
    The check the advance was paid by.
    data.deduct_in_month string
    The 1st of the payroll month the advance is deducted in.
    data.id string
    The record's id.
    data.reason string
    Why it was advanced, as typed.
    data.remaining_balance string
    What is still owed.
    data.status string
    outstanding, partially_repaid, fully_repaid or written_off.
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/payroll-exports

Start a payroll export for a pay period

A pending export for billing_period_start to billing_period_end, with the agency's ADP company code, as Payroll does before it generates the file.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The pay period

billing_period_end string, required
YYYY-MM-DD.
billing_period_start string, required
YYYY-MM-DD.
  • 201 The export object
    data object, required
    data.adp_co_code string
    data.billing_period_end string
    data.billing_period_start string
    data.file_ready boolean
    Whether GET .../file has a file to return.
    data.format string
    adp (Workforce Now) or adp_run.
    data.id string
    The record's id.
    data.status string
    pending, generated or exported.
  • default An error, in the shared envelope. Error

POST /api/v1/payroll-exports/{id}/check

Check a payroll export before sending it to ADP

As Payroll exports > Check lists them: every line ADP would refuse and why, with the page where each is fixed, sorted unsendable, refusal, warning, then by caregiver last name. Changes nothing; any member at every access level, no Idempotency-Key. An id naming none of the agency's exports answers 404 not_found, whatever else holds; then 409 payroll_integration_off while the ADP payroll integration is off for the agency.

Parameter In Required Description
id path yes
  • 200 The findings object
    data array of object, required
    data[].caregiver_id string, required
    The caregiver, or null for the export as a whole.
    data[].code string, required
    Which rule found it.
    data[].fix_path string, required
    The HomeCareBilling page where it is fixed.
    data[].message string, required
    The sentence Payroll exports > Check shows.
    data[].severity string, required
    unsendable (no line of the ADP file can be written), refusal (ADP refuses this line; the rest goes) or warning (sent as it is).
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 409 Code payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/payroll-exports/{id}/file

Download a payroll export's ADP file

The generated CSV, as Payroll exports > Download serves it. A pending export answers 409 not_generated; a file that is gone 410 file_missing. With format adp_import, the file ADP imports as it is, built from the timesheets and cash advances the export was generated from, as Download for ADP builds it: RUN's Time Sheet Import (file Monthly-03012026-03312026.csv and the like) or the Workforce Now paydata file (PR{co}EPI.csv), every line ADP would refuse left out (POST /payroll-exports/{id}/check names them). With entry_sheet, the RUN sheet the office types from, as Entry sheet (to type from) builds it. A format answers 409 payroll_integration_off while the ADP payroll integration is off for the agency, and adp_import answers 422 with the check's unsendable code (product_unknown, no_company_code) and message when no line can be written. Any member at every access level. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes
format query no adp_import or entry_sheet builds that file (US-111.6); leave it out for the stored file.
  • 200 The CSV string
  • 404 Not Found, as the operation's description says. Error
  • 409 Code not_generated (the export is pending) or payroll_integration_off (a format was asked while the ADP payroll integration is off). Error
  • 410 Code file_missing: the record exists and its file does not. Nothing changed. Error
  • 422 Code unknown_file_format, or the pre-send check's unsendable code (product_unknown, no_company_code) with its message: no line of the ADP file can be written. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

POST /api/v1/payroll-exports/{id}/generate

Generate a payroll export's ADP file

Builds the ADP CSV (format adp for Workforce Now, adp_run for RUN) from the period's approved timesheets, overtime included, as Payroll does, and answers the export and its warnings. A generated export can be generated again; an exported one answers 422 export_already_finalized; no approved timesheets 422 no_approved_timesheets; no ADP company code 422 adp_settings_missing. 1099 contractors are left out of the file (a warning counts them and their hours); a period whose every caregiver is a contractor answers 422 all_caregivers_contractors. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
format query yes
  • 200 The export and its warnings object
    data object, required
    data.adp_co_code string
    data.billing_period_end string
    data.billing_period_start string
    data.file_ready boolean
    Whether GET .../file has a file to return.
    data.format string
    adp (Workforce Now) or adp_run.
    data.id string
    The record's id.
    data.status string
    pending, generated or exported.
    warnings array of string, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes adp_settings_missing, all_caregivers_contractors, export_already_finalized, no_approved_timesheets: Unprocessable Content, as the operation's description says. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

POST /api/v1/payroll-exports/{id}/mark-exported

Mark a payroll export sent to ADP

As Payroll exports does once the file is uploaded to ADP. With record_repayments true, the cash advances the payroll deducts are then repaid in one transaction, and cash_advance_repayments_recorded counts them; if that fails, none is recorded, the export stays marked exported, and warnings says so. A caregiver the file deducted more from than was still owed is named in warnings, as the repayment is capped at the balance. Marking it again records no second repayment. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

Options

record_repayments boolean
true also records, for the payroll that deducts the month's cash advances, a repayment of each advance for its remaining balance, dated the period end and naming the export, as Payroll exports' Mark Downloaded does with its box checked. Default false.
  • 200 The export object
    cash_advance_repayments_recorded integer
    With record_repayments true, how many repayments were recorded.
    data object, required
    data.adp_co_code string
    data.billing_period_end string
    data.billing_period_start string
    data.file_ready boolean
    Whether GET .../file has a file to return.
    data.format string
    adp (Workforce Now) or adp_run.
    data.id string
    The record's id.
    data.status string
    pending, generated or exported.
    warnings array of string
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/payroll-exports/{id}/submissions

Send a payroll export to ADP

As Payroll exports > Send to ADP does: checks the generated export, then queues one line per caregiver to post to ADP and answers the submission at once; poll GET /payroll-exports/{id}/submissions/{submission_id} for each line's result. A caregiver the check refuses, or with no linked ADP worker, is a refused line and the rest go. A press while a send of the export is a standing send answers that send; one ADP already has answers the last send with unchanged true. With resend true, as Fix and resend does: reads what ADP holds for the period, then replaces each line ADP accepted before by its item ids and adds the rest, superseding the earlier send. 409 needs_choice (details.lines, both figures per caregiver) when a line's hours in ADP are not what was sent; send again with choices. 409 resend_required when the hours changed after a send ADP holds lines of (use resend), 409 awaiting_confirmation while an earlier send is unconfirmed, 409 export_exported for an export marked downloaded, 502 read_back_failed when ADP did not answer the read-back. On an SFTP drop connection the send uploads the export's Workforce Now paydata file to the agency's ADP folder once: every caregiver in the file is a sent line, and the export is not marked exported; once ADP holds the file, resend answers 409 not_replaceable. 422 unsendable (with the findings' messages) when the check finds an export ADP cannot take, 422 not_sendable_status for an export that is not generated. Any member at full access, with a key or a grant holding hcb.submit; 403 submission_blocked while the agency's HomeCareBilling billing blocks submission (Download for ADP still works), 403 read_only for a read-only agency or key, 403 insufficient_scope for a grant without hcb.submit; 404 for an export or submission this agency does not have; 409 payroll_integration_off while the agency's ADP API connection is off; 409 not_api_connection while it sends payroll by file.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

Nothing to send; resend and choices for Fix and resend

choices object
Per caregiver id, replace (HomeCareBilling's hours) or keep (ADP's), for each line a 409 needs_choice listed.
resend boolean
true for Fix and resend: lines ADP accepted before are replaced by their ADP item ids, new ones added.
  • 200 The submission object
    data object, required
    data.attempt integer, required
    1 for the first send of the export, one more per resend.
    data.confirmed_at string
    When every line was answered.
    data.id string, required
    The record's id.
    data.line_count integer, required
    How many caregivers' lines the submission has.
    data.lines array of object, required
    data.lines[].caregiver_id string
    The caregiver the line pays.
    data.lines[].error_code string
    ADP's code, or HomeCareBilling's when it never reached ADP.
    data.lines[].error_message string
    Why the line was refused.
    data.lines[].id string, required
    The record's id.
    data.lines[].label string, required
    What Payroll exports shows for the line.
    data.lines[].status string, required
    pending and posting while it goes; accepted; refused by ADP, or before it was posted (error_code not_sent, not_linked or a check rule); unconfirmed while a post that may have been written is confirmed; sent when dropped as a file.
    data.message string
    With unchanged: what Payroll exports shows.
    data.payroll_export_id string, required
    The payroll export sent.
    data.sent_at string
    When posting began.
    data.status string, required
    queued and sending while it goes; sent when ADP accepted every line, partially_refused or refused when it refused some or all; unconfirmed when a post may have been written and is being confirmed; superseded once a resend replaced it.
    data.unchanged boolean
    Present and true when ADP already had these hours: nothing was sent, and this is the last send that ADP accepted in full.
  • 403 Codes insufficient_scope, read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes awaiting_confirmation, export_exported, needs_choice, not_api_connection, not_replaceable, payroll_integration_off, resend_required: Conflict, as the operation's description says. Error
  • 422 Code not_sendable_status: Unprocessable Content, as the operation's description says. Error
  • 502 Code read_back_failed: Bad Gateway, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/payroll-exports/{id}/submissions/{submission_id}

Read a send to ADP and its lines

As Payroll exports shows a send's results: the submission's status and, per caregiver, the line's status, label and ADP's error, never the hours or rates posted. Changes nothing: any member at every access level. 404 for an export or submission this agency does not have; 409 payroll_integration_off while the agency's ADP API connection is off.

Parameter In Required Description
id path yes
submission_id path yes The submission's id.
limit query no Rows per page (default 50, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 The submission object
    data object, required
    data.attempt integer, required
    1 for the first send of the export, one more per resend.
    data.confirmed_at string
    When every line was answered.
    data.id string, required
    The record's id.
    data.line_count integer, required
    How many caregivers' lines the submission has.
    data.lines array of object, required
    data.lines[].caregiver_id string
    The caregiver the line pays.
    data.lines[].error_code string
    ADP's code, or HomeCareBilling's when it never reached ADP.
    data.lines[].error_message string
    Why the line was refused.
    data.lines[].id string, required
    The record's id.
    data.lines[].label string, required
    What Payroll exports shows for the line.
    data.lines[].status string, required
    pending and posting while it goes; accepted; refused by ADP, or before it was posted (error_code not_sent, not_linked or a check rule); unconfirmed while a post that may have been written is confirmed; sent when dropped as a file.
    data.message string
    With unchanged: what Payroll exports shows.
    data.payroll_export_id string, required
    The payroll export sent.
    data.sent_at string
    When posting began.
    data.status string, required
    queued and sending while it goes; sent when ADP accepted every line, partially_refused or refused when it refused some or all; unconfirmed when a post may have been written and is being confirmed; superseded once a resend replaced it.
    data.unchanged boolean
    Present and true when ADP already had these hours: nothing was sent, and this is the last send that ADP accepted in full.
  • 404 Not Found, as the operation's description says. Error
  • 409 Code payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/payroll-summary

Read the Payroll Summary of a month or one of its pay periods

US-102.37: each caregiver's hours, rates, pay and cash advance, as the Payroll Summary page computes them, sorted by name and paged; totals are over every row. period is "month" (or absent) for the whole month or a pay period's index (pay_periods lists them, from the agency's pay period frequency); anything else is the whole month, and period_start and period_end say which was read. A cash advance another payroll file holds is in the row's cash_advance_held, worded as the page words it, and is not in cash_advance or the totals.

Parameter In Required Description
year query yes The payroll month's year.
month query yes The payroll month, 1 to 12.
period query no "month" for the whole month, or a pay period's index (0, 1, ...).
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of the Payroll Summary object
    adp_left_out object
    The 1099 contractors the ADP files leave out over every row of the period, and their hours.
    adp_left_out.count integer
    How many contractors.
    adp_left_out.hours string
    Their hours, all regular.
    data array of PayrollSummaryRow, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    pay_periods array of object, required
    The month's pay periods, from the agency's pay period frequency.
    pay_periods[].index integer
    The period's index, the period parameter that reads it.
    pay_periods[].period_end string
    pay_periods[].period_start string
    period_end string, required
    The last day read.
    period_start string, required
    The first day read.
    total integer, required
    Every matching row.
    totals object, required
    Over every row of the period, not this page; a row with no pay counts 0 in total_pay.
    totals.attendant_hours string
    totals.cash_advance string
    totals.daily_overtime_hours string
    totals.overtime_hours string
    totals.regular_hours string
    totals.total_pay string
    totals.travel_hours string
    warnings array of string, required
    The page's attendant classification warnings.
  • default An error, in the shared envelope. Error

GET /api/v1/payroll/connection

Read the ADP payroll connection

As Settings > Payroll shows it: which ADP the agency runs, how payroll reaches it, the methods offered, the file settings, and whether each secret is set (never its value). An agency with no connection yet gets one, sent as a file to an unknown ADP. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while the ADP payroll integration is off for the agency.

  • 200 The connection object
    data object, required
    data.certificate_expires_at string, required
    When the ADP API certificate expires; null when there is none (own_api only).
    data.enabled boolean, required
    Whether the ADP payroll integration is on for the agency (Settings > Payroll's switch).
    data.health object, required
    data.health.certificate_expires_at string, required
    When the ADP API certificate expires.
    data.health.consecutive_failures integer, required
    Failures since the last success.
    data.health.last_failure_at string, required
    The last failed one.
    data.health.last_success_at string, required
    The last successful token request or call to ADP.
    data.health.message string, required
    The sentence the reconnect banner shows while the connection needs attention; null otherwise.
    data.health.paused_until string, required
    While ADP is not answering and HomeCareBilling has paused calls to it, when it tries again; null otherwise.
    data.health.status string, required
    The connection's state.
    data.health.status_reason string, required
    Why the connection needs attention: token_refused, circuit_open, certificate_expired, method_paused, or the code Test connection recorded; null otherwise.
    data.method string, required
    How payroll reaches ADP.
    data.methods_offered array of string, required
    The sending methods Settings > Payroll offers for this product: built, fitting the product and switched on.
    data.notice string, required
    On a change, "Sending switched to the file, because that method is not offered for this ADP." when the method was not offered for the product and the file was stored instead (or, when the marketplace is kept for an ADP product other than the one the agency's ADP Marketplace subscription is for, a sentence naming both products: the connection waits for that product's order); otherwise null.
    data.product string, required
    Which ADP the agency runs: run, wfn or unknown.
    data.secrets_set object, required
    data.secrets_set.certificate_pem boolean, required
    Whether certificate_pem is set. The value is never answered.
    data.secrets_set.client_id boolean, required
    Whether client_id is set. The value is never answered.
    data.secrets_set.client_secret boolean, required
    Whether client_secret is set. The value is never answered.
    data.secrets_set.private_key_pem boolean, required
    Whether private_key_pem is set. The value is never answered.
    data.secrets_set.sftp_private_key boolean, required
    Whether sftp_private_key is set. The value is never answered.
    data.settings object, required
    data.settings.allow_hire_push boolean, required
    Whether a caregiver may be added to ADP from HomeCareBilling (RUN's Add to ADP).
    data.settings.employee_id_template string, required
    Which RUN Time Sheet Import template keys each caregiver: payroll_assigned (ADP's Employee ID) or time_clock (the Time Clock ID).
    data.settings.mark_exported_on string, required
    When a sent export is marked exported.
    data.settings.rate_mode string, required
    How API methods send a pay rate.
    data.settings.rate_tolerance string, required
    How far ADP's rate may differ from HomeCareBilling's before a warning.
    data.settings.run_company_code string, required
    RUN's company code or IID, 1 to 10 letters and numbers; null when unset.
    data.settings.run_file_version string, required
    The RUN Time Sheet Import file version.
    data.settings.send_contractors boolean, required
    Whether 1099 contractors' hours go to ADP too.
    data.settings.sftp_folder string, required
    The SFTP drop's folder; null when unset.
    data.settings.sftp_host string, required
    The SFTP drop's host; null when unset.
    data.settings.sftp_host_key_fingerprint string, required
    The SHA-256 host key fingerprint the SFTP server presented at the first successful Test connection, trusted from then on; null until then.
    data.settings.sftp_port integer, required
    The SFTP drop's port, 1 to 65535; null when unset, which connects on 22.
    data.settings.sftp_user string, required
    The SFTP drop's user; null when unset.
    data.sftp_key_fingerprint string, required
    The SHA-256 fingerprint (SHA256:..., as ssh-keygen -lf prints it) of the SFTP drop key's public half; null when no key is set. The key is never answered.
    data.status string, required
    The connection's state.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/payroll/connection

Change the ADP payroll connection

As Settings > Payroll's Save and switch do, through the same checks; send only what changes. A RUN company code that is not 1 to 10 letters and numbers answers 422 naming run_company_code; a method not offered for the product stores file, and notice says so. A body turning enabled on is taken while the integration is off for the agency, when the platform and its plan allow it. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while the ADP payroll integration is off for the agency.

Request body (required) application/json object

What to change

allow_hire_push boolean
RUN: let HomeCareBilling start new hires in RUN (Add to ADP on ADP workers), which sends the caregiver's SSN. Off by default.
employee_id_template string
payroll_assigned (ADP's Employee ID, the default) or time_clock (the Time Clock ID).
enabled boolean
Turn the ADP payroll integration on or off for the agency. Off keeps the connection, its settings and earning codes.
mark_exported_on string
API methods: all_accepted (the default) marks the export exported when ADP accepts every line; manual leaves it to Mark Downloaded.
method string
How payroll reaches ADP; one of methods_offered. Any other is stored as file, with notice saying so.
product string
Which ADP the agency runs: run (signs in at runpayroll.adp.com), wfn (workforcenow.adp.com) or unknown.
run_company_code string
RUN's company code or IID, 1 to 10 letters and numbers; null or blank clears it.
run_file_version string
The RUN Time Sheet Import file version.
send_contractors boolean
Send 1099 contractors' hours to ADP too.
  • 200 The connection as saved object
    data object, required
    data.certificate_expires_at string, required
    When the ADP API certificate expires; null when there is none (own_api only).
    data.enabled boolean, required
    Whether the ADP payroll integration is on for the agency (Settings > Payroll's switch).
    data.health object, required
    data.health.certificate_expires_at string, required
    When the ADP API certificate expires.
    data.health.consecutive_failures integer, required
    Failures since the last success.
    data.health.last_failure_at string, required
    The last failed one.
    data.health.last_success_at string, required
    The last successful token request or call to ADP.
    data.health.message string, required
    The sentence the reconnect banner shows while the connection needs attention; null otherwise.
    data.health.paused_until string, required
    While ADP is not answering and HomeCareBilling has paused calls to it, when it tries again; null otherwise.
    data.health.status string, required
    The connection's state.
    data.health.status_reason string, required
    Why the connection needs attention: token_refused, circuit_open, certificate_expired, method_paused, or the code Test connection recorded; null otherwise.
    data.method string, required
    How payroll reaches ADP.
    data.methods_offered array of string, required
    The sending methods Settings > Payroll offers for this product: built, fitting the product and switched on.
    data.notice string, required
    On a change, "Sending switched to the file, because that method is not offered for this ADP." when the method was not offered for the product and the file was stored instead (or, when the marketplace is kept for an ADP product other than the one the agency's ADP Marketplace subscription is for, a sentence naming both products: the connection waits for that product's order); otherwise null.
    data.product string, required
    Which ADP the agency runs: run, wfn or unknown.
    data.secrets_set object, required
    data.secrets_set.certificate_pem boolean, required
    Whether certificate_pem is set. The value is never answered.
    data.secrets_set.client_id boolean, required
    Whether client_id is set. The value is never answered.
    data.secrets_set.client_secret boolean, required
    Whether client_secret is set. The value is never answered.
    data.secrets_set.private_key_pem boolean, required
    Whether private_key_pem is set. The value is never answered.
    data.secrets_set.sftp_private_key boolean, required
    Whether sftp_private_key is set. The value is never answered.
    data.settings object, required
    data.settings.allow_hire_push boolean, required
    Whether a caregiver may be added to ADP from HomeCareBilling (RUN's Add to ADP).
    data.settings.employee_id_template string, required
    Which RUN Time Sheet Import template keys each caregiver: payroll_assigned (ADP's Employee ID) or time_clock (the Time Clock ID).
    data.settings.mark_exported_on string, required
    When a sent export is marked exported.
    data.settings.rate_mode string, required
    How API methods send a pay rate.
    data.settings.rate_tolerance string, required
    How far ADP's rate may differ from HomeCareBilling's before a warning.
    data.settings.run_company_code string, required
    RUN's company code or IID, 1 to 10 letters and numbers; null when unset.
    data.settings.run_file_version string, required
    The RUN Time Sheet Import file version.
    data.settings.send_contractors boolean, required
    Whether 1099 contractors' hours go to ADP too.
    data.settings.sftp_folder string, required
    The SFTP drop's folder; null when unset.
    data.settings.sftp_host string, required
    The SFTP drop's host; null when unset.
    data.settings.sftp_host_key_fingerprint string, required
    The SHA-256 host key fingerprint the SFTP server presented at the first successful Test connection, trusted from then on; null until then.
    data.settings.sftp_port integer, required
    The SFTP drop's port, 1 to 65535; null when unset, which connects on 22.
    data.settings.sftp_user string, required
    The SFTP drop's user; null when unset.
    data.sftp_key_fingerprint string, required
    The SHA-256 fingerprint (SHA256:..., as ssh-keygen -lf prints it) of the SFTP drop key's public half; null when no key is set. The key is never answered.
    data.status string, required
    The connection's state.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code payroll_integration_off: Conflict, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/payroll/connection/connect-code

Get an ADP Marketplace connect code

As Settings > Payroll's Connect in ADP Marketplace does: a new single-use code to paste into the ADP Marketplace checkout form when buying HomeCareBilling's connector, and when it expires (7 days). A new code replaces the old one, and the connection waits for its ADP Marketplace order. The code is answered once and never stored. Issued only where the tab offers one: 409 marketplace_not_offered unless the connection's ADP product is RUN and HomeCareBilling's ADP Marketplace listing is set; 409 already_connected while the connection is connected through ADP Marketplace, waiting for its ADP administrator's consent, or needs attention (a new code would stop its sending); nothing changes either way. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while connecting through ADP Marketplace is off for the agency.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 201 The code object
    data object, required
    data.connect_code string, required
    The single-use code to paste into the ADP Marketplace checkout form. Answered only here, never stored or shown again; a new code replaces the old.
    data.expires_at string, required
    When the code stops working, 7 days after it was made.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Codes already_connected, marketplace_not_offered, payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/payroll/connection/credentials

Save the ADP API Central credentials

As Settings > Payroll's credentials do: the client ID and secret API Central issued and the certificate it signed for the request from POST /payroll/connection/csr; send only what changes. A certificate that is not one, fits neither HomeCareBilling's request nor its current key, or has expired answers 422 invalid_certificate with the tab's sentence, and nothing is saved. Answers the connection, never a secret. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while sending with the agency's own API credentials is off for it.

Request body (required) application/json object

What API Central issued

certificate_pem string
The certificate API Central signed for the request from POST /payroll/connection/csr, PEM; absent or blank keeps the saved one.
client_id string
The API Central project's client ID; absent or blank keeps the saved one.
client_secret string
The API Central project's client secret; absent or blank keeps the saved one. Never answered.
  • 200 The connection as saved object
    data object, required
    data.certificate_expires_at string, required
    When the ADP API certificate expires; null when there is none (own_api only).
    data.enabled boolean, required
    Whether the ADP payroll integration is on for the agency (Settings > Payroll's switch).
    data.health object, required
    data.health.certificate_expires_at string, required
    When the ADP API certificate expires.
    data.health.consecutive_failures integer, required
    Failures since the last success.
    data.health.last_failure_at string, required
    The last failed one.
    data.health.last_success_at string, required
    The last successful token request or call to ADP.
    data.health.message string, required
    The sentence the reconnect banner shows while the connection needs attention; null otherwise.
    data.health.paused_until string, required
    While ADP is not answering and HomeCareBilling has paused calls to it, when it tries again; null otherwise.
    data.health.status string, required
    The connection's state.
    data.health.status_reason string, required
    Why the connection needs attention: token_refused, circuit_open, certificate_expired, method_paused, or the code Test connection recorded; null otherwise.
    data.method string, required
    How payroll reaches ADP.
    data.methods_offered array of string, required
    The sending methods Settings > Payroll offers for this product: built, fitting the product and switched on.
    data.notice string, required
    On a change, "Sending switched to the file, because that method is not offered for this ADP." when the method was not offered for the product and the file was stored instead (or, when the marketplace is kept for an ADP product other than the one the agency's ADP Marketplace subscription is for, a sentence naming both products: the connection waits for that product's order); otherwise null.
    data.product string, required
    Which ADP the agency runs: run, wfn or unknown.
    data.secrets_set object, required
    data.secrets_set.certificate_pem boolean, required
    Whether certificate_pem is set. The value is never answered.
    data.secrets_set.client_id boolean, required
    Whether client_id is set. The value is never answered.
    data.secrets_set.client_secret boolean, required
    Whether client_secret is set. The value is never answered.
    data.secrets_set.private_key_pem boolean, required
    Whether private_key_pem is set. The value is never answered.
    data.secrets_set.sftp_private_key boolean, required
    Whether sftp_private_key is set. The value is never answered.
    data.settings object, required
    data.settings.allow_hire_push boolean, required
    Whether a caregiver may be added to ADP from HomeCareBilling (RUN's Add to ADP).
    data.settings.employee_id_template string, required
    Which RUN Time Sheet Import template keys each caregiver: payroll_assigned (ADP's Employee ID) or time_clock (the Time Clock ID).
    data.settings.mark_exported_on string, required
    When a sent export is marked exported.
    data.settings.rate_mode string, required
    How API methods send a pay rate.
    data.settings.rate_tolerance string, required
    How far ADP's rate may differ from HomeCareBilling's before a warning.
    data.settings.run_company_code string, required
    RUN's company code or IID, 1 to 10 letters and numbers; null when unset.
    data.settings.run_file_version string, required
    The RUN Time Sheet Import file version.
    data.settings.send_contractors boolean, required
    Whether 1099 contractors' hours go to ADP too.
    data.settings.sftp_folder string, required
    The SFTP drop's folder; null when unset.
    data.settings.sftp_host string, required
    The SFTP drop's host; null when unset.
    data.settings.sftp_host_key_fingerprint string, required
    The SHA-256 host key fingerprint the SFTP server presented at the first successful Test connection, trusted from then on; null until then.
    data.settings.sftp_port integer, required
    The SFTP drop's port, 1 to 65535; null when unset, which connects on 22.
    data.settings.sftp_user string, required
    The SFTP drop's user; null when unset.
    data.sftp_key_fingerprint string, required
    The SHA-256 fingerprint (SHA256:..., as ssh-keygen -lf prints it) of the SFTP drop key's public half; null when no key is set. The key is never answered.
    data.status string, required
    The connection's state.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code payroll_integration_off: Conflict, as the operation's description says. Error
  • 422 Code invalid_certificate: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/payroll/connection/csr

Make the ADP API Central certificate request

As Settings > Payroll's Create certificate request does: makes a new key pair, keeps its private key in HomeCareBilling, and answers the request to give API Central to sign. A live connection keeps its current key until the certificate signed for this request is saved. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while sending with the agency's own API credentials is off for it.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 201 The request object
    data object, required
    data.csr_pem string, required
    The certificate request to give API Central, PEM. HomeCareBilling keeps its private key; no answer carries it.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/payroll/connection/sftp

Save the ADP SFTP drop's settings and key

As Settings > Payroll's SFTP form does: the host, port, user and folder ADP gave the agency for its Automated Paydata Integration, and the private key file; send only what changes. A key that is not an OpenSSH or PEM private key without a passphrase answers 422 invalid_private_key with the tab's sentence, a port that is not a whole number from 1 to 65535 answers 422 invalid_port, and nothing is saved. A new host or port forgets the trusted host key. Answers the connection: the key only as secrets_set.sftp_private_key and sftp_key_fingerprint, never its value. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while the SFTP drop is off for the agency.

Request body (required) application/json object

The SFTP drop's settings

folder string
The folder ADP picks paydata files up from; absent, blank or null keeps the saved one.
host string
The SFTP server ADP gave the agency, a host name; absent, blank or null keeps the saved one. A new host trusts the next Test connection's host key.
port integer | string
The SFTP server's port, 1 to 65535; absent or null keeps the saved one, an empty string clears it, and none saved connects on 22. A new port trusts the next Test connection's host key.
private_key string
The private key file ADP gave the agency (OpenSSH or PEM, no passphrase), as text; absent, blank or null keeps the saved one. Never answered.
user string
The SFTP user ADP gave the agency; absent, blank or null keeps the saved one.
  • 200 The connection as saved object
    data object, required
    data.certificate_expires_at string, required
    When the ADP API certificate expires; null when there is none (own_api only).
    data.enabled boolean, required
    Whether the ADP payroll integration is on for the agency (Settings > Payroll's switch).
    data.health object, required
    data.health.certificate_expires_at string, required
    When the ADP API certificate expires.
    data.health.consecutive_failures integer, required
    Failures since the last success.
    data.health.last_failure_at string, required
    The last failed one.
    data.health.last_success_at string, required
    The last successful token request or call to ADP.
    data.health.message string, required
    The sentence the reconnect banner shows while the connection needs attention; null otherwise.
    data.health.paused_until string, required
    While ADP is not answering and HomeCareBilling has paused calls to it, when it tries again; null otherwise.
    data.health.status string, required
    The connection's state.
    data.health.status_reason string, required
    Why the connection needs attention: token_refused, circuit_open, certificate_expired, method_paused, or the code Test connection recorded; null otherwise.
    data.method string, required
    How payroll reaches ADP.
    data.methods_offered array of string, required
    The sending methods Settings > Payroll offers for this product: built, fitting the product and switched on.
    data.notice string, required
    On a change, "Sending switched to the file, because that method is not offered for this ADP." when the method was not offered for the product and the file was stored instead (or, when the marketplace is kept for an ADP product other than the one the agency's ADP Marketplace subscription is for, a sentence naming both products: the connection waits for that product's order); otherwise null.
    data.product string, required
    Which ADP the agency runs: run, wfn or unknown.
    data.secrets_set object, required
    data.secrets_set.certificate_pem boolean, required
    Whether certificate_pem is set. The value is never answered.
    data.secrets_set.client_id boolean, required
    Whether client_id is set. The value is never answered.
    data.secrets_set.client_secret boolean, required
    Whether client_secret is set. The value is never answered.
    data.secrets_set.private_key_pem boolean, required
    Whether private_key_pem is set. The value is never answered.
    data.secrets_set.sftp_private_key boolean, required
    Whether sftp_private_key is set. The value is never answered.
    data.settings object, required
    data.settings.allow_hire_push boolean, required
    Whether a caregiver may be added to ADP from HomeCareBilling (RUN's Add to ADP).
    data.settings.employee_id_template string, required
    Which RUN Time Sheet Import template keys each caregiver: payroll_assigned (ADP's Employee ID) or time_clock (the Time Clock ID).
    data.settings.mark_exported_on string, required
    When a sent export is marked exported.
    data.settings.rate_mode string, required
    How API methods send a pay rate.
    data.settings.rate_tolerance string, required
    How far ADP's rate may differ from HomeCareBilling's before a warning.
    data.settings.run_company_code string, required
    RUN's company code or IID, 1 to 10 letters and numbers; null when unset.
    data.settings.run_file_version string, required
    The RUN Time Sheet Import file version.
    data.settings.send_contractors boolean, required
    Whether 1099 contractors' hours go to ADP too.
    data.settings.sftp_folder string, required
    The SFTP drop's folder; null when unset.
    data.settings.sftp_host string, required
    The SFTP drop's host; null when unset.
    data.settings.sftp_host_key_fingerprint string, required
    The SHA-256 host key fingerprint the SFTP server presented at the first successful Test connection, trusted from then on; null until then.
    data.settings.sftp_port integer, required
    The SFTP drop's port, 1 to 65535; null when unset, which connects on 22.
    data.settings.sftp_user string, required
    The SFTP drop's user; null when unset.
    data.sftp_key_fingerprint string, required
    The SHA-256 fingerprint (SHA256:..., as ssh-keygen -lf prints it) of the SFTP drop key's public half; null when no key is set. The key is never answered.
    data.status string, required
    The connection's state.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code payroll_integration_off: Conflict, as the operation's description says. Error
  • 422 Codes invalid_port, invalid_private_key: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/payroll/connection/test

Test the ADP connection

As Settings > Payroll's Test connection does, for the connection's method. With the agency's own API Central credentials: one read at ADP with the saved credentials, recording the answer on the connection (active on success, needs_attention with the reason on a failure); connected false with the tab's sentence when ADP refused, did not answer, or a credential is missing. With the SFTP drop: signs in with the saved key and lists the folder, answering "Connected. {folder} holds {count} files." or which step failed; the first success trusts the server's host key; nothing is written to the server. 409 not_api_connection, recording nothing, while the connection sends payroll by file. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while the connection's method is off for the agency.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 What ADP answered object
    data object, required
    data.connected boolean, required
    Whether ADP answered with the saved credentials, or the SFTP drop signed in and listed its folder.
    data.message string, required
    The sentence Settings > Payroll's Test connection shows.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Codes not_api_connection, payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/payroll/earning-mappings

List the ADP earning mappings

As /payroll/earnings shows them: all twelve slots, every hour kind for employees then contractors, each the saved code or else HomeCareBilling's proposal (saved false). A fixed set, so not paged. Credentials whose member holds payroll.view or agency_settings.view only (403 forbidden otherwise); 409 payroll_integration_off while the ADP payroll integration is off for the agency.

  • 200 The slots object
    data array of object, required
    data[].earning_code string, required
    The ADP earning code carrying these hours; null when the slot is unmapped.
    data[].file_column integer, required
    The Workforce Now file's "Hours N" pair, 3 to 50, or null for the file's own column.
    data[].hour_kind string, required
    The kind of hours.
    data[].rate_code string, required
    The ADP rate code, or null.
    data[].saved boolean, required
    true for a saved code; false for HomeCareBilling's proposal, used until one is saved.
    data[].source string, required
    admin when a member saved it, adp_default when read from ADP; null on a proposal.
    data[].worker_type string, required
    Employees or contractors.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/payroll/earning-mappings

Save one ADP earning mapping

As a row's Save on /payroll/earnings does: sets the slot hour_kind and worker_type name, or clears it with a null or blank earning_code. A refused field answers 422 naming it. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while the ADP payroll integration is off for the agency.

Request body (required) application/json object

The slot and its codes

earning_code string, required
The ADP earning code, 1 to 10 letters or digits as on your ADP Earnings Codes report (upcased and trimmed); null or blank clears the slot back to its proposal.
file_column integer
The Workforce Now "Hours N" pair, 3 to 50, not used by another slot. Left out keeps it; null clears it.
hour_kind string, required
The kind of hours to map.
rate_code string
On RUN, BASE, RATE_2 to RATE_5 or HRLY4SLRY1; elsewhere up to 10 letters, digits or underscores. Left out keeps it; null clears it.
worker_type string, required
employee or contractor.
  • 200 The slot as saved object
    data object, required
    data.earning_code string, required
    The ADP earning code carrying these hours; null when the slot is unmapped.
    data.file_column integer, required
    The Workforce Now file's "Hours N" pair, 3 to 50, or null for the file's own column.
    data.hour_kind string, required
    The kind of hours.
    data.rate_code string, required
    The ADP rate code, or null.
    data.saved boolean, required
    true for a saved code; false for HomeCareBilling's proposal, used until one is saved.
    data.source string, required
    admin when a member saved it, adp_default when read from ADP; null on a proposal.
    data.worker_type string, required
    Employees or contractors.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code payroll_integration_off: Conflict, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/payroll/earning-mappings/sync

Sync ADP's earning codes now

As /payroll/earnings' Sync from ADP does: queues a read of the agency's ADP earning codes, rate codes and pay cycles, which proposes the regular and overtime mappings ADP holds and lets Payroll exports > Check compare exports with them. One sync per agency waits at a time. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while the agency's ADP API connection is off; 409 not_api_connection while it sends payroll by file or SFTP.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 Queued object
    data object, required
    data.queued boolean, required
    True: the sync is queued, or already waiting to run.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Codes not_api_connection, payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/payroll/w4-changes

List the caregivers whose W-4 change payroll has not been sent

US-102.37: the Payroll Summary's W-4 panel, longest waiting first: each caregiver whose filing status or dependents changed since POST /caregivers/{id}/w4-sent-to-payroll last cleared it, with the values now on file.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of W-4 changes object
    data array of W4Change, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

GET /api/v1/payroll/workers

List the ADP workers and their caregivers

As /payroll/workers lists them, by ADP name: each ADP worker of the agency's API connection with the caregiver it is linked to, how, and the row's warning. filter=no_adp_worker lists instead the caregivers no ADP worker is linked to. Credentials whose member holds payroll.view or agency_settings.view only (403 forbidden otherwise); 409 payroll_integration_off while the agency's ADP API connection is off; 409 not_api_connection while it sends payroll by file or SFTP.

Parameter In Required Description
filter query no all (default), needs_person (no caregiver yet), linked, or no_adp_worker (caregivers no ADP worker is linked to).
limit query no Rows per page (default 50, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 A page of workers object
    data array of object, required
    data[].adp_hire_date string
    The hire date ADP holds.
    data[].adp_name string
    The worker's name as ADP spells it.
    data[].adp_status string, required
    The worker's status in ADP.
    data[].adp_status_date string
    When that status began, in ADP.
    data[].adp_worker_id string
    ADP's employee or file number for the worker.
    data[].associate_oid string
    ADP's id for the worker.
    data[].caregiver_id string, required
    The paired caregiver; null while the worker needs a person.
    data[].caregiver_name string
    The paired caregiver's name.
    data[].id string, required
    The worker link, the id POST /payroll/workers/{id}/link takes; null for a caregiver with no ADP worker.
    data[].linked_at string
    When it was linked.
    data[].linked_by_name string
    Who linked it, for a manual link.
    data[].match_method string
    How the pairing was made: by ADP number, by name with birth or hire date, by a person (manual), or by HomeCareBilling adding the worker to ADP.
    data[].missing_from_adp boolean, required
    True when ADP's last complete worker list no longer held this worker; it then reads terminated.
    data[].warning string
    What /payroll/workers warns about the row: a different ADP number in HomeCareBilling, or another caregiver already holding this one.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Codes not_api_connection, payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/payroll/workers/sync

Sync the ADP workers now

As /payroll/workers' Sync from ADP does: queues a read of every ADP worker, which updates the rows and links the ones the evidence leaves no doubt about. One sync per agency waits at a time. Credentials whose member holds agency_settings.manage only (403 forbidden otherwise); 409 payroll_integration_off while the agency's ADP API connection is off; 409 not_api_connection while it sends payroll by file or SFTP.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 Queued object
    data object, required
    data.queued boolean, required
    True: the sync is queued, or already waiting to run.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Codes not_api_connection, payroll_integration_off: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/service-rates/import

Import the agency's rates from a CSV file

Reads the file as Service rates > Import reads it (at most 5,000 rows; columns matched by name), with effective_date for its rows (today when absent). A rate cell with more than two places is rounded half-up to cents rather than refused. preview true answers the first rows checked and writes nothing: each row's rate_per_unit as it would be stored (null for a cell that is no rate, refused in errors) and its notes, which name any rounding ("6.9575 rounded to 6.96"); otherwise every new rate is created and duplicates skipped, and the counts answered.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The file

csv string
The file as CSV text, header row first.
csv_base64 string
Or the file's bytes, base64.
effective_date string
YYYY-MM-DD, for the file's rows; today when left out.
preview boolean
Check the rows and write nothing.
  • 200 The preview or the import's counts object
    data object, required
  • default An error, in the shared envelope. Error

PUT /api/v1/service-rates/schedule-source

Choose the fee schedule the agency bills against

use_system_fee_schedule true bills against the system's published schedule, false against the agency's own rates, as the service rates page's switch sets it. Nothing stored is changed; the setting changes which rate is used. Sending the current value changes nothing.

Request body (required) application/json object

The choice

use_system_fee_schedule boolean, required
true bills against the system's schedule, false the agency's own rates.
  • 200 The choice as saved object
    data object, required
  • default An error, in the shared envelope. Error

DELETE /api/v1/service-rates/{id}

Delete one of the agency's own rates

As the service rates page deletes one. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The rate object
    data object, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/service-rates/{id}/transition

Change a rate from a date

Closes the rate the day before effective_date and opens its successor at rate_per_unit from that day, as the rate list's Change Rate does. Only rate_per_unit and effective_date are read: the successor keeps the rate's code, modifiers and description. A closed rate answers 422 rate_already_closed, before any date is looked at, so a retried transition never opens a second successor. An effective_date that is missing or not YYYY-MM-DD answers 422 missing_effective_date; one not after the current one 422 effective_date_must_be_after_current; either one carries any other refused field's error in details. A rate_per_unit that is not a number, or a start date another rate of the same code and modifiers already has, answers 422 with the field's error in details. Another agency's record answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The new rate and its first day

effective_date string, required
YYYY-MM-DD.
rate_per_unit string | number, required
The new rate, a decimal, as text (a leading $ is allowed) or a JSON number.
  • 200 The rate object
    data object, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes effective_date_must_be_after_current, missing_effective_date, rate_already_closed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Pipeline

GET /api/v1/prospects

List prospects

Someone the agency is following up as a possible client or caregiver, from the Pipeline pages. A status moves only along the pipeline; converting one is POST /api/v1/prospects/{id}/convert. The agency's prospects in newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
search query no Every word must match a returned name or identifier, case-insensitively. At most 100 characters and 8 words.
prospect_type query no Only potential clients or employees.
  • 200 A page of prospects object
    data array of Prospect, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/prospects

Create a prospect

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json ProspectCreate

The prospect's fields

  • 201 The created prospect object
    data Prospect, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/prospects/{id}

Delete a prospect

Deletes the prospect, as the Pipeline page does. A converted prospect answers 422 cannot_delete_converted: its client or caregiver points back to it.

Parameter In Required Description
id path yes
  • 200 The deleted prospect object
    data Prospect, required
  • 422 Code cannot_delete_converted: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/prospects/{id}

Get a prospect

Someone the agency is following up as a possible client or caregiver, from the Pipeline pages. A status moves only along the pipeline; converting one is POST /api/v1/prospects/{id}/convert.

Parameter In Required Description
id path yes
  • 200 The prospect object
    data Prospect, required
  • 404 Code not_found: no prospect with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/prospects/{id}

Update a prospect

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json ProspectInput

The fields to change

  • 200 The updated prospect object
    data Prospect, required
  • 404 Code not_found: no prospect with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the prospect changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/prospects/{id}/convert

Convert a prospect to a client or caregiver

Makes the client (for a potential client) or the caregiver (for a potential employee) from the prospect and marks it converted, as the Pipeline page's Convert does. A potential client's type follows its insurance (private makes a private-insurance client, anything else a Medicaid one), and its Medicaid ID, contact person and address are carried over; a Medicaid ID another client already holds is left off and named in warnings. The person is looked for first, as a create is: a client already on file with the same Medicaid ID and name is linked rather than made twice (converted_to_id is that client), and namesakes on file are counted; both are named in warnings, never refused. Only a prospect at onboarding converts; any other answers 422 invalid_status_for_conversion. A prospect carries no date of birth, so when the agency already has a client or caregiver of the same name that nothing tells apart, nothing is written and the answer is 409 possible_match, whose details list the matches; send the request again with same_person_id (one of the matches, which is linked) or create_new (a new record is made): the list of the matches' ids passes over only those (and, with hidden_seen, as many on cards the caller cannot open as the 409 counted in hidden), so a namesake filed meanwhile is asked about, and true passes over every namesake on file, seen or not. Warn, never block: either answer converts.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

The answer to a possible match (empty on the first call)

as string
Start onboarding (US-122.23), as the Pipeline page's Start onboarding does: an open caregiver lead at any stage (new to onboarding) is moved to onboarding and becomes a caregiver with status potential, its open-shift responses, alerts and portal devices moving with it; a former employee's re-hire lead sets that caregiver card back to potential instead of making one. A closed lead answers 422 lead_not_open, a client lead 422 not_employee_lead. Send it again with the possible-match answer. Absent: convert at onboarding into an active caregiver or a client.
create_new boolean | array of string
The answer to a 409 possible_match when the prospect is someone else: a new record is made, and warnings counts the namesakes passed over. A list of record ids names the namesakes the caller was shown, and makes the record only if it names every namesake on file now that the caller can open, and, with hidden_seen, no more than that many on cards it cannot; one filed since (or one the 409 counted in more and did not list) answers 409 possible_match again. true is an explicit "create regardless": the record is made, passing over every namesake on file, including any the caller never saw. false or absent makes nothing.
hidden_seen integer
With a create_new list: the hidden count of the 409 possible_match it answers, the namesakes on cards the caller cannot open, which are never named. The list then also passes over up to that many of them, as the Pipeline page's "Someone else" does; one more than that (filed since) answers 409 possible_match again. Absent or 0 passes over none.
same_person_id string
The answer to a 409 possible_match: the id of one of its matches, which is the same person. The prospect is linked to that record and nothing is made. An id that is no longer one of the prospect's namesakes answers 409 possible_match again.
  • 200 The converted prospect and what it became object
    data object, required
    data.converted_to_id string, required
    The client or caregiver the prospect became: a new record, or the client already on file it was linked to.
    data.converted_to_type string, required
    What was made.
    data.prospect Prospect, required
    data.warnings array of string, required
    What the conversion did not do as asked: a Medicaid ID left off, an existing client linked, namesakes on file. Usually empty.
  • 409 Code possible_match: someone of this name is already on file and nothing tells them apart. Nothing was written. The shared envelope's details is {type, matches, more, hidden, warnings}: type is client or caregiver (what would be made); matches lists the namesakes on file with nothing to tell them from the prospect, oldest first, each {id, name}, at most 20; more counts the ones past those 20, never named (a create_new list cannot name them, so with more above 0 the answer is same_person_id or create_new true); hidden counts namesakes on cards the caller cannot open, never named (0 while every member reaches every client and caregiver); the message then says how many, as the Pipeline page does, and a create_new list passes them over when it carries hidden_seen set to that count; warnings are the warnings the conversion would carry. Answer with same_person_id or create_new. Code stale_record: the prospect, or the clients and caregivers it is matched against, changed while it converted (a card of this name or Medicaid ID was filed meanwhile, twice). Nothing was written; send the same request again. Error
  • 422 Code invalid_status_for_conversion: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Plans of care

POST /api/v1/cfc-calculator

Make a new client from a CFC calculator and import it

As the import page's "New client from a calculator": the card makes the client, and the calculator is imported for it as POST /api/v1/clients/{id}/cfc-calculator does. When the card's Medicaid ID (or, with none, its name) is already on file for the same person, no client is made and the import is for that client (outcome existing). When the Medicaid ID is on file under another name, nothing is written (outcome conflict, 200, import null): correct the ID, or import for that client with POST /api/v1/clients/{id}/cfc-calculator. A card the client form would refuse (no name, a malformed Medicaid ID) is 422. A file over max_file_size (5 MB) answers 422 file_too_large, and a body over the upload cap, which holds a 10 MB file, 413. What the file holds is judged by the job: a file the parser cannot read ends it failed, unreadable_calculator, and a scan (a PDF with no text, PNG or JPG) ends it failed, paper_capture_consent_required, unless the agency has accepted the paper_capture consent (POST /api/v1/consents/paper_capture).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) multipart/form-data object

A multipart form: the calculator in the field `file` (.xlsx, .pdf, .png, .jpg or .jpeg, at most 5 MB), the client's card read from it (last_name and first_name, and medicaid_id, address and phone when the calculator has them; address as one line, "street, city, ST 12345"), and optionally task_names[] naming the tasks to import when not all of them.

address string
file string, required
first_name string, required
last_name string, required
medicaid_id string
phone string
task_names array of string
  • 200 outcome conflict: the Medicaid ID is on file under another name; nothing was written object
    data CfcNewClient, required
  • 202 The client, made or found, and its import job; GET /api/v1/cfc-imports/{id} until it has ended object
    data CfcNewClient, required
  • 413 Request Entity Too Large, as the operation's description says. Error
  • 422 Code file_too_large: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/cfc-imports/{id}

Read a CFC calculator job

A preview or import job: queued or running until its worker ends it, then succeeded with its rows or plans, or failed with its error.

Parameter In Required Description
id path yes
  • 200 The job object
    data CfcImportJob, required
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/cfc-calculator

Import a CFC calculator into a client's Plans of Care

Starts an import as the CFC import page does: one current Plan of Care per service on the sheet, each making that service's current plan past, every task or the task_names sent (422 invalid_task_names for any other value). Answers 202 with the job; when it succeeds it carries the new plans and warnings. A file over max_file_size (5 MB) answers 422 file_too_large, and a body over the upload cap, which holds a 10 MB file, 413. What the file holds is judged by the job: a file the parser cannot read ends it failed, unreadable_calculator, and a scan (a PDF with no text, PNG or JPG) ends it failed, paper_capture_consent_required, unless the agency has accepted the paper_capture consent (POST /api/v1/consents/paper_capture).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) multipart/form-data object

A multipart form with the calculator in the field `file`: .xlsx, .pdf, .png, .jpg or .jpeg, at most 5 MB; for an import, optionally task_names[] fields naming the tasks to import when not all of them.

file string, required
task_names array of string
  • 202 The job, queued; GET /api/v1/cfc-imports/{id} until it has ended object
    data CfcImportJob, required
  • 413 Request Entity Too Large, as the operation's description says. Error
  • 422 Codes file_too_large, invalid_task_names: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/cfc-calculator/preview

Preview a CFC calculator import

Starts a preview: when it succeeds the job carries each task with the per-day minutes an import would write for this client, or over_cap, and the warnings an import would carry. Changes no plan. A file over max_file_size (5 MB) answers 422 file_too_large, and a body over the upload cap, which holds a 10 MB file, 413. What the file holds is judged by the job: a file the parser cannot read ends it failed, unreadable_calculator, and a scan (a PDF with no text, PNG or JPG) ends it failed, paper_capture_consent_required, unless the agency has accepted the paper_capture consent (POST /api/v1/consents/paper_capture).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) multipart/form-data object

A multipart form with the calculator in the field `file`: .xlsx, .pdf, .png, .jpg or .jpeg, at most 5 MB; for an import, optionally task_names[] fields naming the tasks to import when not all of them.

file string, required
task_names array of string
  • 202 The job, queued; GET /api/v1/cfc-imports/{id} until it has ended object
    data CfcImportJob, required
  • 413 Request Entity Too Large, as the operation's description says. Error
  • 422 Code file_too_large: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/plans-of-care

List plans of care

A client's Plan of Care for one service, with its tasks (task, frequency, minutes). The current plan for a service is the one in force; creating a new one makes it past. The agency's plans of care in effective date, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
client_id query no Only records of this client.
  • 200 A page of plans of care object
    data array of PlanOfCare, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/plans-of-care

Create a plan of care

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json PlanOfCareCreate

The plan of care's fields

  • 201 The created plan of care object
    data PlanOfCare, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

GET /api/v1/plans-of-care/{id}

Get a plan of care

A client's Plan of Care for one service, with its tasks (task, frequency, minutes). The current plan for a service is the one in force; creating a new one makes it past.

Parameter In Required Description
id path yes
  • 200 The plan of care object
    data PlanOfCare, required
  • 404 Code not_found: no plan of care with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/plans-of-care/{id}

Update a plan of care

Changes the fields sent. A tasks list replaces the plan's tasks; leave it out to keep them. Plans have no lock_version and, as on the web, the last save wins. Lowering a task below what the client's Work Orders schedule is saved, with an over_authorized warning in warnings; tasks adding up to more hours a week than the plan authorizes are saved too, with a care_planning.task_hours_over_authorization warning after it.

Parameter In Required Description
id path yes

Request body (required) application/json PlanOfCareUpdate

The fields to change

  • 200 The updated plan of care object
    data PlanOfCare, required
  • 404 Code not_found: no plan of care with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the plan of care changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/plans-of-care/{id}/revise

Revise a signed Plan of Care

As the plan page's Revise does: the signed current plan is voided with the reason given and kept as signed, and a copy becomes the client's current plan as a new draft, which is the answer (its replaces_id names the original). Needs care_plans.manage (403 forbidden otherwise). Without a reason it answers 422 reason_required; a draft 422 not_signed, a plan no longer current 422 not_current, a voided plan 409 voided.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Why it is revised

reason string, required
Why the signed plan is revised, 3 to 1000 characters. It is kept with the voided original.
  • 201 The new draft object
    data PlanOfCare, required
  • 403 Forbidden, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes not_current, not_signed, reason_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/plans-of-care/{id}/signatures

Sign a Plan of Care as its supervisor

Records the plan's supervisor line as a typed signature by the credential's user, as the plan page's typed office signature does. The plan's first signature keeps its consent wording with it and locks it. The client's line is signed on a device, on the plan page. A line already signed answers 422 already_signed, a voided plan 409 voided, a plan changed since its first signature 409 content_changed. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The signature

signer_name string, required
The supervisor's name as the signature records it; the credential's user is the signer.
  • 201 The plan object
    data PlanOfCare, required
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 409 Code content_changed: Conflict, as the operation's description says. Error
  • 422 Code already_signed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Printed forms

GET /api/v1/print/{form}

Print a form

The form as its print page renders it for this agency: the same HTML, with the print layout, as the web prints, or that page as a PDF with format=pdf. Every other query parameter is the print route's own, by its name there: the record ids its path takes, an earlier revision's id, and a list print's filters, as the page's own Print link carries them. A parameter the form does not read answers 400 naming the ones it reads. A record of another agency, or an id that names none, answers 404. The forms, with the ids each takes: client_list (The client list; reads status, temporary, client_type, search, sort_by, show_archived); client_report (A client report; reads cols, status, client_type, search, page); client_birthdays (The client birthday list; reads month); caregiver_list (The caregiver list; reads status, search, show_archived); caregiver_report (A caregiver report; reads cols, status, search, page); caregiver_envelopes (Envelopes for every caregiver flagged for one; reads address); caregiver_envelope (An envelope addressed to a caregiver: caregiver_id; reads address); oig_screening (An OIG screening's proof: id); oig_attestation (An OIG monthly attestation: id); plan_of_care (A plan of care: plan_id; reads addenda_through); care_log (A care log's day: id; reads addenda_through); half_month_summary (A caregiver's half of a month for one client, as signed: id); client_care_plans (Every service plan of a client: client_id); phone_task_card (A client's phone task card, the codes a caregiver keys on the phone line: client_id); provider_care_plan_template (The blank provider care plan); provider_care_plan (A provider care plan: id); provider_care_plan_revision (An earlier revision of a provider care plan: id, revision_id); client_information_sheet (A client information sheet: client_id); client_information_sheet_employee (A client information sheet, the caregiver's copy: client_id); client_emergency_information (A client's emergency information: client_id; reads blank, addenda_through); client_emergency_wallet_card (A client's emergency wallet card: client_id); client_emergency_information_revision (An earlier revision of a client's emergency information: client_id, id; reads blank, addenda_through); client_envelope (An envelope addressed to a client: client_id); health_summary (A client's health summary: client_id); missed_visit (A missed visit form: client_id); attempted_visit (An attempted visit form: client_id); client_communication_report (A client's communication report: client_id; reads from, to, sort); satisfaction_survey (A satisfaction survey: client_id, id); caregiver_communication_report (A caregiver's communication notes: caregiver_id; reads from, to, contact_type, search, sort); caregiver_communication_note (One caregiver communication note: id); compliance_report (A caregiver's compliance report: caregiver_id); file_checklist (A caregiver's employee file checklist: caregiver_id); reference_check (A caregiver's reference check form: caregiver_id); caregiver_new_hire (A caregiver's new-hire sheet: caregiver_id); client_consent_form (A client's intake notice (disclosure notice or rights acknowledgement): client_id, id; reads addenda_through); complaint (A complaint: id; reads addenda_through); meeting_minutes (Meeting minutes: id); meeting_minutes_template (The blank meeting minutes); incident (A critical incident: id; reads addenda_through); supervisory_visit (A supervisory visit: id; reads blank, addenda_through); supervisory_visits_planned (A month's planned supervisory visits; reads month, page); work_order (A Work Order: id; reads month); shift_plan (A client's Shift Plan, every shift's Work Order: client_id); client_work_orders (Every Work Order of a client for a month (month=YYYY-MM): client_id; reads month); work_order_blank (The blank Work Order); work_order_blank_card (The empty Time and Services Card; reads service, half, month); work_order_report (A Work Order's monthly client report: id; reads blank, month, report, addenda_through); work_order_card (A Work Order's Time and Services Card: id; reads blank, month, half); work_order_batch (Time and Services Cards in a batch, or with form=report the Monthly Client Reports; reads month, form, blank, half, stacks, monthly_print, service_type, status, wo_type, completeness, caregiver_id, client_id, shift_number, exclude_completed, part, include_ids, page_half); work_order_month (The month-start print of every Time and Services Card; reads month, form, blank, half, stacks, monthly_print, service_type, status, wo_type, completeness, caregiver_id, client_id, shift_number, exclude_completed, part, include_ids, page_half); work_order_schedule (Every Work Order in force with its daily times and hours; reads page); timesheet (A timesheet: id; reads blank); cash_advances (A month's cash advances, or with month=all&status=owed every advance still owed; reads month, status, search); expiring_authorizations (The authorizations (PARs) ending within 30, 60 or 90 days, soonest first; reads days, renewed); evv_issues (The EVV issue log by caregiver (caregiver_id and status filter it); reads caregiver_id, status); evaluations_due (The caregivers whose annual evaluation falls due in a month (month=1..12); reads month); hospital_stays (A month's client hospital stays and the care recorded on those days (month=YYYY-MM); reads month, page).

Parameter In Required Description
form path yes The printed form.
format query no html (the default) or pdf.
  • 200 The printed form string
  • 400 Code bad_request: a query parameter the form does not read (the message names the ones it reads), a record id or required path parameter missing, or a format other than html or pdf. Error
  • 404 Not Found, as the operation's description says. Error
  • 422 Code print_refused: the print page itself refused, as it does on the web (a Work Order month outside its dates), and the message is the page's; or the print could not be made from the parameters sent, and the message names them and what the form takes. Error
  • 503 Code temporarily_unavailable: the page or its PDF could not be rendered in time, or the PDF renderer failed. Nothing changed; try again. Error
  • default An error, in the shared envelope. Error

GET /api/v1/print/{form}/{id}

Print a form's record as a PDF

The form for one record as a PDF: {id} is the record id followed by .pdf, the id the form's route names first by id (a plan of care's plan_id, a client form's client_id, a revision form's own id), and the query carries the rest of the route's parameters, as GET /api/v1/print/{form} takes them. A parameter the form does not read answers 400 naming the ones it reads. A form that names no record (a list, a blank template, a batch) is read with format=pdf there instead.

Parameter In Required Description
form path yes The printed form.
id path yes The record id, then .pdf.
  • 200 The printed form string
  • 400 Code bad_request: a query parameter the form does not read (the message names the ones it reads), a record id or required path parameter missing, or a format other than html or pdf. Error
  • 422 Code print_refused: the print page itself refused, as it does on the web (a Work Order month outside its dates), and the message is the page's; or the print could not be made from the parameters sent, and the message names them and what the form takes. Error
  • 503 Code temporarily_unavailable: the page or its PDF could not be rendered in time, or the PDF renderer failed. Nothing changed; try again. Error
  • default An error, in the shared envelope. Error

Provider care plans

POST /api/v1/clients/{id}/pcsp-documents

Store a client's PCSP

Stores the PCSP as the plan form's upload does (a multipart field file, up to 50 MB); its id is the source_document_id a plan is then saved with and previewed from.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) multipart/form-data object

The PCSP

file string, required
  • 201 The stored document object
    data object, required
    data.client_id string, required
    The client.
    data.content_type string
    Its type.
    data.file_name string
    Its name.
    data.id string, required
    The record's id.
    data.uploaded_at string
    When it was stored.
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

GET /api/v1/provider-care-plans

List a client's provider care plans

Newest first, as the client's Provider care plans tab lists them. Another agency's client answers 404.

Parameter In Required Description
client_id query yes The client whose plans to list.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of plans object
    data array of object, required
    data[].authorizations_reconciled_at string
    When its authorisations were last fully reconciled.
    data[].certification_end_date string
    The certification period's end.
    data[].certification_start_date string
    The certification period's start.
    data[].client_id string, required
    The client.
    data[].created_at string
    When it was created.
    data[].current_revision_id string
    Its current revision.
    data[].id string, required
    The record's id.
    data[].source_document_id string
    The PCSP it was imported from.
    data[].status string, required
    Whether it is the client's current plan.
    data[].updated_at string
    When it last changed.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/provider-care-plans

Create a provider care plan

Creates the client's plan, born current, as the plan form does. The certification period is decided as the form decides it: the PCSP's period wins where the client's active certification is silent; where both speak and disagree, the request must send certification_choice (422 certification_disagreement names both periods otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The plan

certification_choice string
Which period wins when the PCSP's and the client's certification disagree.
certification_end_date string
The PCSP's certification end, YYYY-MM-DD.
certification_start_date string
The PCSP's certification start, YYYY-MM-DD.
change_note string
Why this revision.
client_id string
For a new plan: the client.
content object
The plan's fields, by key, as get_provider_care_plan shows them.
source_document_id string
The PCSP stored for the client, with store_pcsp; a new plan only, where null means none.
  • 201 The plan object
    data object, required
    data.authorizations_reconciled_at string
    When its authorisations were last fully reconciled.
    data.certification_end_date string
    The certification period's end.
    data.certification_start_date string
    The certification period's start.
    data.client_id string, required
    The client.
    data.content object, required
    The current revision's fields, by key.
    data.created_at string
    When it was created.
    data.current_revision_id string
    Its current revision.
    data.id string, required
    The record's id.
    data.reconciliation_outcome object
    The last reconciliation's rows.
    data.source_document_id string
    The PCSP it was imported from.
    data.status string, required
    Whether it is the client's current plan.
    data.updated_at string
    When it last changed.
  • 422 Code certification_disagreement: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/provider-care-plans/{id}

Read a provider care plan

The plan and its current revision's content.

Parameter In Required Description
id path yes
  • 200 The plan object
    data object, required
    data.authorizations_reconciled_at string
    When its authorisations were last fully reconciled.
    data.certification_end_date string
    The certification period's end.
    data.certification_start_date string
    The certification period's start.
    data.client_id string, required
    The client.
    data.content object, required
    The current revision's fields, by key.
    data.created_at string
    When it was created.
    data.current_revision_id string
    Its current revision.
    data.id string, required
    The record's id.
    data.reconciliation_outcome object
    The last reconciliation's rows.
    data.source_document_id string
    The PCSP it was imported from.
    data.status string, required
    Whether it is the client's current plan.
    data.updated_at string
    When it last changed.
  • default An error, in the shared envelope. Error

PATCH /api/v1/provider-care-plans/{id}

Revise a provider care plan

Saves a new revision, as the plan form's Save does; earlier revisions are kept. client_id and source_document_id are a new plan's only: sending either, null included, is 422 create_only. The certification period is decided as the form decides it: the PCSP's period wins where the client's active certification is silent; where both speak and disagree, the request must send certification_choice (422 certification_disagreement names both periods otherwise).

Parameter In Required Description
id path yes

Request body (required) application/json object

The revision

certification_choice string
Which period wins when the PCSP's and the client's certification disagree.
certification_end_date string
The PCSP's certification end, YYYY-MM-DD.
certification_start_date string
The PCSP's certification start, YYYY-MM-DD.
change_note string
Why this revision.
client_id string
For a new plan: the client.
content object
The plan's fields, by key, as get_provider_care_plan shows them.
source_document_id string
The PCSP stored for the client, with store_pcsp; a new plan only, where null means none.
  • 200 The plan object
    data object, required
    data.authorizations_reconciled_at string
    When its authorisations were last fully reconciled.
    data.certification_end_date string
    The certification period's end.
    data.certification_start_date string
    The certification period's start.
    data.client_id string, required
    The client.
    data.content object, required
    The current revision's fields, by key.
    data.created_at string
    When it was created.
    data.current_revision_id string
    Its current revision.
    data.id string, required
    The record's id.
    data.reconciliation_outcome object
    The last reconciliation's rows.
    data.source_document_id string
    The PCSP it was imported from.
    data.status string, required
    Whether it is the client's current plan.
    data.updated_at string
    When it last changed.
  • 422 Codes certification_disagreement, create_only: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/provider-care-plans/{id}/mark-current

Make a provider care plan the client's current one

As the plan page's Mark current does; the client's other current plan becomes past.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The plan object
    data object, required
    data.authorizations_reconciled_at string
    When its authorisations were last fully reconciled.
    data.certification_end_date string
    The certification period's end.
    data.certification_start_date string
    The certification period's start.
    data.client_id string, required
    The client.
    data.content object, required
    The current revision's fields, by key.
    data.created_at string
    When it was created.
    data.current_revision_id string
    Its current revision.
    data.id string, required
    The record's id.
    data.reconciliation_outcome object
    The last reconciliation's rows.
    data.source_document_id string
    The PCSP it was imported from.
    data.status string, required
    Whether it is the client's current plan.
    data.updated_at string
    When it last changed.
  • default An error, in the shared envelope. Error

POST /api/v1/provider-care-plans/{id}/reconciliation

Record a reconciliation outcome

Records the rows of a reconciliation done without an apply, and whether nothing is left outstanding (which clears the not-yet-reconciled banner).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The outcome

complete boolean
Whether nothing is left outstanding.
rows array of object
One per service row.
  • 200 The plan object
    data object, required
    data.authorizations_reconciled_at string
    When its authorisations were last fully reconciled.
    data.certification_end_date string
    The certification period's end.
    data.certification_start_date string
    The certification period's start.
    data.client_id string, required
    The client.
    data.content object, required
    The current revision's fields, by key.
    data.created_at string
    When it was created.
    data.current_revision_id string
    Its current revision.
    data.id string, required
    The record's id.
    data.reconciliation_outcome object
    The last reconciliation's rows.
    data.source_document_id string
    The PCSP it was imported from.
    data.status string, required
    Whether it is the client's current plan.
    data.updated_at string
    When it last changed.
  • default An error, in the shared envelope. Error

POST /api/v1/provider-care-plans/{id}/reconciliation/apply

Apply a previewed PCSP's authorisations

Applies the preview the token was minted for, with the decisions, as the reconcile page's Apply does; each row's outcome is answered, and a refused row is a result, not an error. A token already spent answers 409 already_applied, a stale one 409 expired, and another member's PCSP 422 identity_mismatch.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The token and decisions

decisions object
excluded, choices and supersessions.
decisions.choices object
Row index => the authorization id it updates.
decisions.excluded array of integer
Row indexes to leave out.
decisions.supersessions object
Authorization id => end_date or leave.
token string, required
The token the preview answered.
  • 200 Each row's outcome object
    data object, required
    data.complete boolean, required
    Whether nothing is left outstanding.
    data.results array of object, required
  • 409 Code already_applied: Conflict, as the operation's description says. Error
  • 422 Code identity_mismatch: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/provider-care-plans/{id}/reconciliation/preview

Preview a PCSP's authorisations

Reads the plan's PCSP and proposes its authorisations, as the reconcile page does, numbering each row. When something can be applied it answers a single-use token, good for expires_in_seconds, that POST .../reconciliation/apply takes with the decisions; the preview it applies is this one. A plan with no PCSP answers 422 no_source_document; an unreadable one 422 unreadable_document.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The preview object
    data object, required
    data.candidates array of object, required
    Each proposed authorisation, with its index.
    data.expires_in_seconds integer
    How long the token is good for.
    data.identity_mismatch array of object
    Set when the PCSP names another member; nothing can be applied.
    data.service_plan_type string
    initial, csr or revision.
    data.supersessions array of object
    data.token string
    The apply token, or null when nothing can be applied.
  • 410 Code file_missing: the record exists and its file does not. Nothing changed. Error
  • 422 Codes no_source_document, unreadable_document: Unprocessable Content, as the operation's description says. Error
  • 500 Code internal_error: a failure on our side, which was logged. When its message says nothing changed (the file store refused the request, the virus scan could not be queued, the upload could not be read), nothing did, the same request fails the same way until it is fixed, and the Idempotency-Key stays free. Error
  • 503 Code storage_unavailable (the file store did not answer) or, on an upload, temporarily_unavailable (its uploaded file could not be read): nothing changed, and the same request can succeed later. Retry after the Retry-After seconds; a write retried with the same Idempotency-Key runs again. Error
  • default An error, in the shared envelope. Error

Provider type modifiers

GET /api/v1/provider-type-modifiers

List provider types and their modifiers

Every provider type the agency bills, with its billing code and modifiers: the agency's own set where it changed one, the system default otherwise.

  • 200 The provider types object
    data array of object, required
    data[].agency_owned boolean
    Whether the agency has its own copy of the template. Its first certification save on a system template makes that copy; modifier changes write the agency's offering and make no copy.
    data[].billing_code string
    The HCPCS code it bills.
    data[].certification_text string
    The certification its cards print, in English.
    data[].certification_translations object
    Its translations, by language code.
    data[].certification_version string
    What a certification save sends back, to refuse one saved since.
    data[].code string, required
    The provider type's code, as the path takes it.
    data[].id string
    The record's id.
    data[].modifiers array of string, required
    The modifiers it bills, and the batch validation expects.
    data[].name string
    The provider type's name.
  • default An error, in the shared envelope. Error

PUT /api/v1/provider-type-modifiers/{code}

Set a provider type's modifiers

Sets the modifiers a provider type bills and the rule the batch validation checks, together, as Settings does. It writes the agency's offering for that set and makes no copy of a system template (agency_owned stays as it was). expected_modifiers is the set the caller read: a set changed since answers 409 stale_modifiers and writes nothing. A value that is not a two-character modifier, more than four, or two programs answers 422 validation_failed; a well-formed modifier no fee schedule prices is saved and named in warnings. Needs billing.manage (403 forbidden otherwise).

Parameter In Required Description
code path yes The provider type's code.

Request body (required) application/json object

The new set and the one read

expected_modifiers array of string, required
The modifiers as they were read (find_provider_type_modifiers).
modifiers array of string, required
The modifiers to bill, at most four.
  • 200 The provider type object
    data object, required
    data.agency_owned boolean
    Whether the agency has its own copy of the template. Its first certification save on a system template makes that copy; modifier changes write the agency's offering and make no copy.
    data.billing_code string
    The HCPCS code it bills.
    data.certification_text string
    The certification its cards print, in English.
    data.certification_translations object
    Its translations, by language code.
    data.certification_version string
    What a certification save sends back, to refuse one saved since.
    data.code string, required
    The provider type's code, as the path takes it.
    data.id string
    The record's id.
    data.modifiers array of string, required
    The modifiers it bills, and the batch validation expects.
    data.name string
    The provider type's name.
    data.warnings array of object, required
    What the saved set warns of; usually empty. Never a refusal: the set is saved. Each names its rule (catalog.unpriced_modifier: a modifier no fee schedule in force today or later prices on the billing code; it bills as entered) and the message.
    data.warnings[].message string, required
    What the admin is warned of.
    data.warnings[].rule_id string, required
    The rule that raised it.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code stale_modifiers: Conflict, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Recurring batches

GET /api/v1/batches/{id}/recurring-proposal

What Make recurring would create from a batch

As the batch page's Make recurring dialog proposes it: the cadence and period 1 read from the claims' service dates, the default name and send settings (auto, 09:00 Mountain, on the weekday the batch was sent), and one page of the batch's claims, each with the warnings it would carry (lines_total counts them all). Computed on every call and never stored. Refused: 422 not_upload_source for a batch not made from an uploaded file, 422 not_proposable when the claims cannot repeat as one week, two weeks or a month (the message says why), 403 submission_blocked or insufficient_scope as Submit refuses. Another agency's batch answers 404 not_found.

Parameter In Required Description
id path yes
limit query no Rows per page (default 50, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 The proposal object
    data object, required
    data.anchor_date string
    Period 0's first day.
    data.batch_id string
    The batch.
    data.cadence string
    data.limit integer
    data.lines array of object
    data.lines_total integer
    data.name string
    data.offset integer
    data.period object
    data.period.period_end string, required
    The last day billed.
    data.period.period_start string, required
    The first day billed.
    data.submit_mode string
    data.submit_time string
    data.submit_weekday integer
  • 403 Code submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 422 Codes not_proposable, not_upload_source: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/recurring-runs/{id}/hold

Hold a recurring run

As the run banner's Hold: a created run is held, so it is not sent until someone submits its batch (POST /api/v1/batches/{id}/submit). A run already held answers it unchanged; a run in any other state 409 run_status, with the banner's words. Needs a credential holding hcb.submit and an agency at full access, as Submit does: 403 insufficient_scope for a credential without hcb.write or hcb.submit, 403 read_only for a read-only agency, 403 submission_blocked while the agency's billing blocks submission; nothing is written. Another agency's run answers 404 not_found and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The run object
    data RecurringRun, required
  • 403 Codes insufficient_scope, read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 409 Code run_status: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/recurring-runs/{id}/rerun

Re-run a recurring period

As the schedule page's Send again: a cancelled, failed or skipped run's period gets a fresh batch from the schedule's current lines, and the run is created again with a new notice and send time. Its old batch is cancelled first: 422 batch_in_progress while it is still being prepared (changed within the hour). Refused, writing nothing: 409 run_status for a run that has not left (created, held or submitted); 422 schedule_ended; 422 nothing_to_bill when every line is already billed by another batch; 422 no_submission_access when the schedule's owner may not submit; 422 patient_limit_exceeded over the plan's client limit; 422 too_many_claims when the period has more claims than HCPF accepts in one batch, so the schedule must be split. Needs a credential holding hcb.submit and an agency at full access, as Submit does: 403 insufficient_scope for a credential without hcb.write or hcb.submit, 403 read_only for a read-only agency, 403 submission_blocked while the agency's billing blocks submission; nothing is written. Another agency's run answers 404 not_found and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The run object
    data RecurringRun, required
  • 403 Codes insufficient_scope, read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 409 Code run_status: Conflict, as the operation's description says. Error
  • 422 Codes batch_in_progress, no_submission_access, nothing_to_bill, patient_limit_exceeded, schedule_ended, too_many_claims: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/recurring-schedules

List recurring schedules

The agency's recurring schedules, newest first, as the schedule list shows them, each with next_period.

Parameter In Required Description
limit query no Rows per page (default 50, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 A page of schedules object
    data array of RecurringSchedule | object, required
    data[].next_period object
    The period the schedule bills next, the one Skip acts on; null once it has none.
    data[].next_period.period_end string, required
    The last day billed.
    data[].next_period.period_start string, required
    The first day billed.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/recurring-schedules

Make a batch recurring

As Make recurring's confirm: a schedule from the proposal, with any of name, submit_mode, submit_weekday, submit_time and end_date over it, and one line per claim copied field for field (a line whose claim HCPF denied starts paused). 409 schedule_exists, naming it, when the batch already has a live schedule; 422 not_upload_source and 422 not_proposable as the proposal refuses; 404 not_found for a batch this agency does not have; 400 bad_request without batch_id. Line warnings (not paid last period, an EVV visit each week, a PAR ending, more hours a week than the PAR allows) never stop the write: warnings lists each with its line_id. Every write needs a credential holding hcb.submit and an agency at full access, as Submit does: 403 insufficient_scope for a credential without hcb.write or hcb.submit, 403 read_only for a read-only agency, 403 submission_blocked while the agency's billing blocks submission; nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The batch and settings

batch_id string, required
The uploaded batch to make recurring.
end_date string
No run is made for a period starting after it, YYYY-MM-DD.
name string
The schedule's name.
submit_mode string
auto sends each run at its send time unless held; approval waits for a Submit.
submit_time string
The time a run is sent, HH:MM or HH:MM:SS, Mountain time.
submit_weekday integer
The day a run is sent, Monday 1 to Sunday 7, in Mountain time.
  • 201 The schedule and its line warnings object
    data RecurringSchedule | object, required
    data.next_period object
    The period the schedule bills next, the one Skip acts on; null once it has none.
    data.next_period.period_end string, required
    The last day billed.
    data.next_period.period_start string, required
    The first day billed.
    warnings array of object, required
    warnings[].authorization_id string
    The PAR an over_weekly_allowance warning was judged against; null for every other code.
    warnings[].code string, required
    What to check.
    warnings[].line_id string
    The line it is about.
    warnings[].message string, required
    The words the schedule page shows.
  • 400 Code bad_request: Bad Request, as the operation's description says. Error
  • 403 Codes insufficient_scope, read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 409 Code schedule_exists: Conflict, as the operation's description says. Error
  • 422 Codes not_proposable, not_upload_source: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/recurring-schedules/{id}

Get a recurring schedule

As the schedule page shows it: the schedule, next_period (the run Skip acts on), one page of its lines (limit and offset page them, lines_total counts them) each with its warnings, and its newest 20 runs with runs_total. Another agency's schedule answers 404 not_found.

Parameter In Required Description
id path yes
limit query no Rows per page (default 50, at most 100; a larger value is served as 100).
offset query no Rows to skip.
  • 200 The schedule object
    data RecurringSchedule | object | object, required
    data.next_period object
    The period the schedule bills next, the one Skip acts on; null once it has none.
    data.next_period.period_end string, required
    The last day billed.
    data.next_period.period_start string, required
    The first day billed.
    data.lines array of RecurringScheduleLine
    data.lines_total integer
    data.runs array of RecurringRun
    data.runs_total integer
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/recurring-schedules/{id}

Change a recurring schedule

As the schedule page's settings form and its Pause, Resume and End: the settings sent are saved (with the lock_version read; 409 stale_record when it changed since, 400 bad_request without one), then status moves the schedule. A switch to approval clears the scheduled send of the schedule's runs not yet sent; a send-setting change moves their send time. 422 schedule_ended for an ended schedule; 422 invalid_status for a status that is none. Line warnings (not paid last period, an EVV visit each week, a PAR ending, more hours a week than the PAR allows) never stop the write: warnings lists each with its line_id. Every write needs a credential holding hcb.submit and an agency at full access, as Submit does: 403 insufficient_scope for a credential without hcb.write or hcb.submit, 403 read_only for a read-only agency, 403 submission_blocked while the agency's billing blocks submission; nothing is written. Another agency's schedule, line or run answers 404 not_found and nothing is written.

Parameter In Required Description
id path yes

Request body (required) application/json object

What to change

end_date string
YYYY-MM-DD; null clears it.
lock_version integer
The lock_version the schedule was read with; required when a setting (name, submit_mode, submit_weekday, submit_time, end_date) is sent. A schedule changed since answers 409 stale_record.
name string
The schedule's name.
status string
Pause (paused), resume (active) or end (ended, final) the schedule.
submit_mode string
auto sends each run at its send time unless held; approval waits for a Submit.
submit_time string
The time a run is sent, HH:MM or HH:MM:SS, Mountain time.
submit_weekday integer
The day a run is sent, Monday 1 to Sunday 7, in Mountain time.
  • 200 The schedule and its line warnings object
    data RecurringSchedule | object, required
    data.next_period object
    The period the schedule bills next, the one Skip acts on; null once it has none.
    data.next_period.period_end string, required
    The last day billed.
    data.next_period.period_start string, required
    The first day billed.
    warnings array of object, required
    warnings[].authorization_id string
    The PAR an over_weekly_allowance warning was judged against; null for every other code.
    warnings[].code string, required
    What to check.
    warnings[].line_id string
    The line it is about.
    warnings[].message string, required
    The words the schedule page shows.
  • 400 Code bad_request: Bad Request, as the operation's description says. Error
  • 403 Codes insufficient_scope, read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Codes invalid_status, schedule_ended: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/recurring-schedules/{id}/lines

Add a line to a recurring schedule

As the schedule page's Add line: a line billed from the next run on, after the last. 422 validation_failed names a missing member_id, procedure_code, units or charge_amount; 422 schedule_ended for an ended schedule. Line warnings (not paid last period, an EVV visit each week, a PAR ending, more hours a week than the PAR allows) never stop the write: warnings lists each with its line_id. Every write needs a credential holding hcb.submit and an agency at full access, as Submit does: 403 insufficient_scope for a credential without hcb.write or hcb.submit, 403 read_only for a read-only agency, 403 submission_blocked while the agency's billing blocks submission; nothing is written. Another agency's schedule, line or run answers 404 not_found and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The line

charge_amount string, required
Amount billed each period.
diagnosis_code_1 string
A diagnosis code.
diagnosis_code_2 string
A diagnosis code.
diagnosis_code_3 string
A diagnosis code.
diagnosis_code_4 string
A diagnosis code.
member_id string, required
The Medicaid member id.
modifier_1 string
A modifier.
modifier_2 string
A modifier.
modifier_3 string
A modifier.
modifier_4 string
A modifier.
par_number string
The prior authorization request number.
patient_dob string
The member's date of birth, YYYY-MM-DD. Written only; never answered.
patient_first_name string
The member's first name.
patient_last_name string
The member's last name.
place_of_service string
The place of service code, e.g. 99.
procedure_code string, required
The procedure code, e.g. T1019.
rendering_npi string
The rendering provider's NPI.
units string, required
Units billed each period.
  • 201 The line and its warnings object
    data RecurringScheduleLine, required
    warnings array of object, required
    warnings[].authorization_id string
    The PAR an over_weekly_allowance warning was judged against; null for every other code.
    warnings[].code string, required
    What to check.
    warnings[].line_id string
    The line it is about.
    warnings[].message string, required
    The words the schedule page shows.
  • 403 Codes insufficient_scope, read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 422 Codes schedule_ended, validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/recurring-schedules/{id}/lines/{line_id}

Delete a recurring line

As the schedule page's Delete: the line is removed; the claims runs made from it keep their data. 422 schedule_ended for an ended schedule. Every write needs a credential holding hcb.submit and an agency at full access, as Submit does: 403 insufficient_scope for a credential without hcb.write or hcb.submit, 403 read_only for a read-only agency, 403 submission_blocked while the agency's billing blocks submission; nothing is written. Another agency's schedule, line or run answers 404 not_found and nothing is written.

Parameter In Required Description
id path yes
line_id path yes The line's id.
  • 200 The deleted line object
    data RecurringScheduleLine, required
    warnings array of object, required
    warnings[].authorization_id string
    The PAR an over_weekly_allowance warning was judged against; null for every other code.
    warnings[].code string, required
    What to check.
    warnings[].line_id string
    The line it is about.
    warnings[].message string, required
    The words the schedule page shows.
  • 403 Codes insufficient_scope, read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 422 Code schedule_ended: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/recurring-schedules/{id}/lines/{line_id}

Change, pause or resume a recurring line

As the schedule page's line editor and its Pause and Resume: the fields sent are saved (runs already made keep their claims), then status pauses or resumes the line. 422 schedule_ended for an ended schedule. Line warnings (not paid last period, an EVV visit each week, a PAR ending, more hours a week than the PAR allows) never stop the write: warnings lists each with its line_id. Every write needs a credential holding hcb.submit and an agency at full access, as Submit does: 403 insufficient_scope for a credential without hcb.write or hcb.submit, 403 read_only for a read-only agency, 403 submission_blocked while the agency's billing blocks submission; nothing is written. Another agency's schedule, line or run answers 404 not_found and nothing is written.

Parameter In Required Description
id path yes
line_id path yes The line's id.

Request body (required) application/json object

What to change

charge_amount string
Amount billed each period.
diagnosis_code_1 string
A diagnosis code. Null clears it.
diagnosis_code_2 string
A diagnosis code. Null clears it.
diagnosis_code_3 string
A diagnosis code. Null clears it.
diagnosis_code_4 string
A diagnosis code. Null clears it.
member_id string
The Medicaid member id.
modifier_1 string
A modifier. Null clears it.
modifier_2 string
A modifier. Null clears it.
modifier_3 string
A modifier. Null clears it.
modifier_4 string
A modifier. Null clears it.
par_number string
The prior authorization request number. Null clears it.
patient_dob string
The member's date of birth, YYYY-MM-DD. Written only; never answered. Null clears it.
patient_first_name string
The member's first name. Null clears it.
patient_last_name string
The member's last name. Null clears it.
place_of_service string
The place of service code, e.g. 99.
procedure_code string
The procedure code, e.g. T1019.
rendering_npi string
The rendering provider's NPI. Null clears it.
status string
paused leaves the line out of runs until it is set active again, whatever paused it.
units string
Units billed each period.
  • 200 The line and its warnings object
    data RecurringScheduleLine, required
    warnings array of object, required
    warnings[].authorization_id string
    The PAR an over_weekly_allowance warning was judged against; null for every other code.
    warnings[].code string, required
    What to check.
    warnings[].line_id string
    The line it is about.
    warnings[].message string, required
    The words the schedule page shows.
  • 403 Codes insufficient_scope, read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 422 Code schedule_ended: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/recurring-schedules/{id}/skip-next

Skip a recurring schedule's next run

As Skip next week: the period next_period names is skipped, its run (made already or not) recorded skipped with no batch sent. period_start must be that period's start: any other answers 409 period_moved with the next_period as it stands now, so a retried skip never reaches a second period (a repeated Idempotency-Key replays the first answer). 409 run_status when that period's run has already left (sent, skipped or cancelled); 409 already_delivered when its batch was already handed to HCPF; 422 schedule_ended when the schedule has no next period; 400 bad_request without period_start. Every write needs a credential holding hcb.submit and an agency at full access, as Submit does: 403 insufficient_scope for a credential without hcb.write or hcb.submit, 403 read_only for a read-only agency, 403 submission_blocked while the agency's billing blocks submission; nothing is written. Another agency's schedule, line or run answers 404 not_found and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The period seen

period_start string, required
The next_period.period_start this schedule was read with. Any other answers 409 period_moved, so a repeated skip never skips a second period.
  • 200 The skipped run object
    data RecurringRun, required
  • 400 Code bad_request: Bad Request, as the operation's description says. Error
  • 403 Codes insufficient_scope, read_only, submission_blocked: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 409 Codes already_delivered, period_moved, run_status: Conflict, as the operation's description says. Error
  • 422 Code schedule_ended: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Refused clocks

GET /api/v1/refused-clocks

List refused clocks

The clocks a cancelled, completed or verified visit refused, which the server kept for the office: nothing on the visit records them, so the office enters the time itself, then marks each reviewed. Only those not yet reviewed, on visits not deleted, newest first; total counts what remains under the same after. An unknown after id is 400.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
after query no The id of the last clock you read: the page starts after it, so clocks you reviewed meanwhile never make you skip any. Use it instead of offset to work through the list.
  • 200 A page of refused clocks object
    data array of RefusedClock, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Bad Request, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/refused-clocks/{id}/review

Mark a refused clock reviewed

Marks an open refused clock reviewed by the credential's user, with an audit row, once the office has acted on it; it leaves the list. Idempotent: one already reviewed answers as it is, with no second audit row. One on a deleted visit, or not this agency's, is 404; 500 review_failed means nothing was saved, so retry.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The reviewed clock object
    data RefusedClock, required
  • 404 Not Found, as the operation's description says. Error
  • 500 Code review_failed: Internal Server Error, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Remittances

GET /api/v1/remittances

List remittances

HCPF's 835 remittances: what it paid, denied and reversed. The agency's remittances in receipt order, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
  • 200 A page of remittances object
    data array of Remittance, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

GET /api/v1/remittances/{id}

Get a remittance

What HCPF paid, denied and reversed on one remittance, claim by claim, with each reason in plain English. lines is paged by limit and offset; lines_total counts them all, and a client wanting every line reads until offset reaches it.

Parameter In Required Description
id path yes
limit query no Rows per page (default 500, at most 1000; a larger value is served as 1000).
offset query no Rows to skip.
  • 200 The remittance object
    data RemittanceDetail, required
  • default An error, in the shared envelope. Error

Report templates

PATCH /api/v1/report-questions/{id}

Edit a report question

Its wording and its type's settings, as the page's Edit does. Past reports keep the old wording. Needs agency_settings.manage (403 forbidden otherwise). A change the page confirms first answers 409 confirmation_required unless confirm is true.

Parameter In Required Description
id path yes

Request body (required) application/json object

What to change

confirm boolean
Confirm a change the page would ask about.
describes string
text: the key of the question it explains; null or an empty string clears it.
heading string
consent_text: its heading.
item_type string
Its kind, which never changes: the type it has is accepted, any other is refused.
label_en string, required
The English text.
label_secondary string
The text in the agency's print language; null or an empty string removes it.
multiline boolean
text: whether the answer is a paragraph.
option_labels object
choice and multi_choice: a caption for each code, keyed by code. It replaces the stored captions. A code it names must be in the options, or be one this same write removes from them, whose caption is dropped with it. Sent without it, an options change keeps the captions of the codes still listed.
options array of string
choice and multi_choice: the option codes, in print order.
print_region string
yes_no on the supervisory sheet: where it prints. A new one prints in the table unless told otherwise. The sheet's own band questions print below both tables and take none.
  • 200 The question object
    data object, required
    data.active boolean
    Whether new reports ask it.
    data.advisory boolean
    Whether a statute or the agency's paper asks for it.
    data.config object
    Its type's settings.
    data.id string, required
    The record's id.
    data.item_type string
    What kind of question it is.
    data.labels object, required
    Its text by language code (en, and the print language).
    data.position integer
    Its place on the form.
    data.printed boolean
    Whether it prints.
    data.question_key string, required
    Its frozen key; answers are kept under it.
    data.report_type string, required
    Its report type.
    data.required_to_sign boolean
    Whether it must be answered before signing.
    data.seeded boolean
    Whether it ships with the form.
    data.translated boolean
    Whether it prints in the second language.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code confirmation_required: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/report-questions/{id}/deactivate

Hide a report question

New reports stop asking it; past reports keep it. Needs agency_settings.manage (403 forbidden otherwise). A change the page confirms first answers 409 confirmation_required unless confirm is true.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

Confirmation

confirm boolean
Confirm a change the page would ask about first.
  • 200 The question object
    data object, required
    data.active boolean
    Whether new reports ask it.
    data.advisory boolean
    Whether a statute or the agency's paper asks for it.
    data.config object
    Its type's settings.
    data.id string, required
    The record's id.
    data.item_type string
    What kind of question it is.
    data.labels object, required
    Its text by language code (en, and the print language).
    data.position integer
    Its place on the form.
    data.printed boolean
    Whether it prints.
    data.question_key string, required
    Its frozen key; answers are kept under it.
    data.report_type string, required
    Its report type.
    data.required_to_sign boolean
    Whether it must be answered before signing.
    data.seeded boolean
    Whether it ships with the form.
    data.translated boolean
    Whether it prints in the second language.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code confirmation_required: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/report-questions/{id}/flag

Set a report question's flag

translated, required_to_sign or printed, to the value sent, as the page's toggles set them. Setting a flag to what it already is changes nothing. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The flag and its value

flag string, required
The flag to set.
value boolean, required
What to set it to.
  • 200 The question object
    data object, required
    data.active boolean
    Whether new reports ask it.
    data.advisory boolean
    Whether a statute or the agency's paper asks for it.
    data.config object
    Its type's settings.
    data.id string, required
    The record's id.
    data.item_type string
    What kind of question it is.
    data.labels object, required
    Its text by language code (en, and the print language).
    data.position integer
    Its place on the form.
    data.printed boolean
    Whether it prints.
    data.question_key string, required
    Its frozen key; answers are kept under it.
    data.report_type string, required
    Its report type.
    data.required_to_sign boolean
    Whether it must be answered before signing.
    data.seeded boolean
    Whether it ships with the form.
    data.translated boolean
    Whether it prints in the second language.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/report-questions/{id}/move

Move a report question up or down

One place, as the page's arrows do; answers the template's questions in their new order. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Which way

direction string, required
Which way.
  • 200 The questions object
    data array of object, required
    data[].active boolean
    Whether new reports ask it.
    data[].advisory boolean
    Whether a statute or the agency's paper asks for it.
    data[].config object
    Its type's settings.
    data[].id string, required
    The record's id.
    data[].item_type string
    What kind of question it is.
    data[].labels object, required
    Its text by language code (en, and the print language).
    data[].position integer
    Its place on the form.
    data[].printed boolean
    Whether it prints.
    data[].question_key string, required
    Its frozen key; answers are kept under it.
    data[].report_type string, required
    Its report type.
    data[].required_to_sign boolean
    Whether it must be answered before signing.
    data[].seeded boolean
    Whether it ships with the form.
    data[].translated boolean
    Whether it prints in the second language.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/report-questions/{id}/reactivate

Show a hidden report question

As the page's Restore does. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The question object
    data object, required
    data.active boolean
    Whether new reports ask it.
    data.advisory boolean
    Whether a statute or the agency's paper asks for it.
    data.config object
    Its type's settings.
    data.id string, required
    The record's id.
    data.item_type string
    What kind of question it is.
    data.labels object, required
    Its text by language code (en, and the print language).
    data.position integer
    Its place on the form.
    data.printed boolean
    Whether it prints.
    data.question_key string, required
    Its frozen key; answers are kept under it.
    data.report_type string, required
    Its report type.
    data.required_to_sign boolean
    Whether it must be answered before signing.
    data.seeded boolean
    Whether it ships with the form.
    data.translated boolean
    Whether it prints in the second language.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/report-templates/{report_type}

Read a report template

The report type's questions, hidden ones included, in order, and its printed form settings, as Settings > Report templates shows them. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
report_type path yes The report type.
  • 200 The template object
    data object, required
    data.form object, required
    data.form.orientation string, required
    How it prints.
    data.form.report_type string, required
    The report type.
    data.form.title string
    The printed title; null prints the default.
    data.form.version integer
    How many times it has been saved.
    data.questions array of object, required
    data.questions[].active boolean
    Whether new reports ask it.
    data.questions[].advisory boolean
    Whether a statute or the agency's paper asks for it.
    data.questions[].config object
    Its type's settings.
    data.questions[].id string, required
    The record's id.
    data.questions[].item_type string
    What kind of question it is.
    data.questions[].labels object, required
    Its text by language code (en, and the print language).
    data.questions[].position integer
    Its place on the form.
    data.questions[].printed boolean
    Whether it prints.
    data.questions[].question_key string, required
    Its frozen key; answers are kept under it.
    data.questions[].report_type string, required
    Its report type.
    data.questions[].required_to_sign boolean
    Whether it must be answered before signing.
    data.questions[].seeded boolean
    Whether it ships with the form.
    data.questions[].translated boolean
    Whether it prints in the second language.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/report-templates/{report_type}/apply-preset

Apply a shipped preset to a report template

Replaces the questions with the preset's, as the page's presets do; every question stays editable. An unknown preset answers 422 unknown_preset. Needs agency_settings.manage (403 forbidden otherwise). A change the page confirms first answers 409 confirmation_required unless confirm is true.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
report_type path yes The report type.

Request body (required) application/json object

The preset

confirm boolean
Confirm a change the page would ask about first.
preset string, required
The preset's name.
  • 200 The questions object
    data array of object, required
    data[].active boolean
    Whether new reports ask it.
    data[].advisory boolean
    Whether a statute or the agency's paper asks for it.
    data[].config object
    Its type's settings.
    data[].id string, required
    The record's id.
    data[].item_type string
    What kind of question it is.
    data[].labels object, required
    Its text by language code (en, and the print language).
    data[].position integer
    Its place on the form.
    data[].printed boolean
    Whether it prints.
    data[].question_key string, required
    Its frozen key; answers are kept under it.
    data[].report_type string, required
    Its report type.
    data[].required_to_sign boolean
    Whether it must be answered before signing.
    data[].seeded boolean
    Whether it ships with the form.
    data[].translated boolean
    Whether it prints in the second language.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code confirmation_required: Conflict, as the operation's description says. Error
  • 422 Code unknown_preset: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/report-templates/{report_type}/form

Save a report template's printed form

Its title (null, blank or left out prints the default) and orientation, written whole. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
report_type path yes The report type.

Request body (required) application/json object

The form

orientation string, required
How it prints.
title string
The printed title; null, blank or left out prints the default.
  • 200 The form object
    data object, required
    data.orientation string, required
    How it prints.
    data.report_type string, required
    The report type.
    data.title string
    The printed title; null prints the default.
    data.version integer
    How many times it has been saved.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/report-templates/{report_type}/questions

Add a question to a report template

At the end, as the page's Add does; its key is made from the English text and never changes. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
report_type path yes The report type.

Request body (required) application/json object

The question

describes string
text: the key of the question it explains; null or an empty string clears it.
heading string
consent_text: its heading.
item_type string
What kind of question it is; the report type's first kind when omitted.
label_en string, required
The English text.
label_secondary string
The text in the agency's print language; null or an empty string removes it.
multiline boolean
text: whether the answer is a paragraph.
option_labels object
choice and multi_choice: a caption for each code, keyed by code. It replaces the stored captions. A code it names must be in the options, or be one this same write removes from them, whose caption is dropped with it. Sent without it, an options change keeps the captions of the codes still listed.
options array of string
choice and multi_choice: the option codes, in print order.
print_region string
yes_no on the supervisory sheet: where it prints. A new one prints in the table unless told otherwise. The sheet's own band questions print below both tables and take none.
  • 201 The question object
    data object, required
    data.active boolean
    Whether new reports ask it.
    data.advisory boolean
    Whether a statute or the agency's paper asks for it.
    data.config object
    Its type's settings.
    data.id string, required
    The record's id.
    data.item_type string
    What kind of question it is.
    data.labels object, required
    Its text by language code (en, and the print language).
    data.position integer
    Its place on the form.
    data.printed boolean
    Whether it prints.
    data.question_key string, required
    Its frozen key; answers are kept under it.
    data.report_type string, required
    Its report type.
    data.required_to_sign boolean
    Whether it must be answered before signing.
    data.seeded boolean
    Whether it ships with the form.
    data.translated boolean
    Whether it prints in the second language.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Reports

POST /api/v1/query

Count the agency's records

The aggregate the AI assistant and the query_data tool answer: a count (the default query_type), a per-status breakdown, a count within a date range, or the records missing required fields, for one kind of record. Answers counts only, never a record. An entity and query_type pair the assistant cannot answer is 422 unsupported_query; a malformed date or an unknown status is 422 invalid_filters. Stores nothing, so it needs no Idempotency-Key and is allowed with a read-only key.

Request body (required) application/json object

The question

entity string, required
filters object
filters.date_from string
filters.date_to string
filters.status string
query_type string
  • 200 The answer object
    data object, required
  • 422 Codes invalid_filters, unsupported_query: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Responses

GET /api/v1/responses

List responses

The files HCPF sent back: acknowledgments of the agency's batches, and remittances. The agency's responses in receipt order, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
response_type query no Only responses of this kind: ta1 acknowledges an interchange, x999 a file, era835 is a remittance; the remaining value is a claim-level acknowledgment HCPF does not send in practice.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
  • 200 A page of responses object
    data array of Response, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

GET /api/v1/responses/{id}

Get a response

The files HCPF sent back: acknowledgments of the agency's batches, and remittances.

Parameter In Required Description
id path yes
  • 200 The response object
    data Response, required
  • 404 Code not_found: no response with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

Service authorizations

GET /api/v1/authorizations

List service authorizations

A service authorization is a PAR: the units of a service HCPF authorized for a client. Each carries the units used, committed and remaining; those are the authorization's own figures, not a client-wide total. The agency's service authorizations in end-date order, soonest first, deleted ones left out unless include_deleted=true. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
client_id query no Only records of this client.
service_code query no Only records of this HCPCS code, like T1019, in any letter case.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
include_deleted query no true also lists deleted records, with deleted_at set, so a sync learns of deletions.
  • 200 A page of service authorizations object
    data array of ServiceAuthorization, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/authorizations

Create a service authorization

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json ServiceAuthorizationCreate

The service authorization's fields

  • 201 The created service authorization object
    data ServiceAuthorization, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/authorizations/{id}

Delete a service authorization

Soft-deletes the PAR, as the web does. An active PAR answers 422 cannot_delete_active. lock_version is the one the PAR was read with: a PAR changed since answers 409 stale_record.

Parameter In Required Description
id path yes
lock_version query yes The lock_version the record was read with: missing answers 400, changed since 409 stale_record.
  • 200 The deleted authorization object
    data ServiceAuthorization, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code cannot_delete_active: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/authorizations/{id}

Get a service authorization

A service authorization is a PAR: the units of a service HCPF authorized for a client. Each carries the units used, committed and remaining; those are the authorization's own figures, not a client-wide total.

Parameter In Required Description
id path yes
  • 200 The service authorization object
    data ServiceAuthorization, required
  • 404 Code not_found: no service authorization with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/authorizations/{id}

Update a service authorization

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json ServiceAuthorizationUpdate

The fields to change

  • 200 The updated service authorization object
    data ServiceAuthorization, required
  • 404 Code not_found: no service authorization with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the service authorization changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/authorizations/{id}/recertifications

Start a PAR's recertification

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

The recertification

case_manager string
The case manager handling the renewal.
notes string
Free text.
target_date string
When the renewal is due, YYYY-MM-DD; null leaves it unset.
  • 201 The recertification, requested object
    data Recertification, required
  • default An error, in the shared envelope. Error

POST /api/v1/authorizations/{id}/transition

Change a service authorization's status

Moves the PAR to status, as the web's status buttons do; a transition the PAR's status does not allow answers 422 validation_failed. lock_version is the one the PAR was read with: a PAR changed since answers 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The new status

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
status string, required
The new status.
  • 200 The authorization object
    data ServiceAuthorization, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/eligibility-verified

Mark a client's eligibility verified

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The client object
    data Client, required
  • default An error, in the shared envelope. Error

POST /api/v1/eligibility-checks

Record a client's eligibility check

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The check

client_id string, required
The client checked, from find_client.
coverage_month integer, required
The coverage month, 1 to 12.
coverage_year integer, required
The coverage year.
method string
How it was checked; hcpf_portal when left out.
note string
Free text on the check.
status string, required
What the check found.
verified_on string
When it was checked (YYYY-MM-DD); today when left out.
  • 201 The check object
    data EligibilityCheck, required
  • default An error, in the shared envelope. Error

GET /api/v1/recertifications

List recertifications

The open renewals of the agency's service authorizations: requested or in progress. The agency's recertifications in requested date, oldest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of recertifications object
    data array of Recertification, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/recertifications/{id}/complete

Complete a recertification with its renewing PAR

Creates the renewing PAR from authorization, as the web's renewal form does, for the renewed PAR's client and linked back to it. A renewed recertification answers 422 already_renewed.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The renewing PAR

authorization ServiceAuthorizationRenewal, required
  • 200 The recertification, renewed object
    data Recertification, required
  • 422 Code already_renewed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/recertifications/{id}/in-progress

Mark a recertification in progress

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The recertification object
    data Recertification, required
  • default An error, in the shared envelope. Error

GET /api/v1/revenue-at-risk

Revenue at risk

The dollars of billable care at risk in the next 14 or 30 days: the unused value of active PARs that end inside the window with no renewal on file, plus scheduled visits inside the window that no active or pending PAR covers, at HCPF's published rates in whole dollars. The rows are the PARs and visits behind the total, the largest first, unpriced ones last. Scheduled visits count only as far ahead as the schedule has made them. Nothing here blocks a claim.

Parameter In Required Description
within_days query no 14 or 30 (default 30).
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 The revenue at risk object
    data array of RevenueAtRisk, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    summary object, required
    summary.total string, required
    unused.value plus uncovered.value, in whole dollars.
    summary.truncated boolean, required
    True when the window held more PARs or visits than one read values; the total is then a floor.
    summary.uncovered object, required
    Scheduled care with no PAR.
    summary.uncovered.count integer, required
    Rows, priced or not.
    summary.uncovered.value string, required
    Whole dollars, the priced rows only.
    summary.unpriced_count integer, required
    Rows with no published rate, left out of the total.
    summary.unused object, required
    Authorized care ending unused.
    summary.unused.count integer, required
    Rows, priced or not.
    summary.unused.value string, required
    Whole dollars, the priced rows only.
    summary.within_days integer, required
    The window read.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

Service rates

GET /api/v1/service-rates

List service rates

What the agency is paid per unit for a billing code and modifiers. The agency's service rates in billing-code order, newest rate first per code. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
  • 200 A page of service rates object
    data array of ServiceRate, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/service-rates

Create a service rate

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json ServiceRateCreate

The service rate's fields

  • 201 The created service rate object
    data ServiceRate, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

GET /api/v1/service-rates/{id}

Get a service rate

What the agency is paid per unit for a billing code and modifiers.

Parameter In Required Description
id path yes
  • 200 The service rate object
    data ServiceRate, required
  • 404 Code not_found: no service rate with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/service-rates/{id}

Update a service rate

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json ServiceRateUpdate

The fields to change

  • 200 The updated service rate object
    data ServiceRate, required
  • 404 Code not_found: no service rate with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the service rate changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

Settings lists

GET /api/v1/cfc-programs

List the CFC programs and their tasks

Every category, offered or not, each with its tasks in order, as Settings > CFC programs shows them. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The programs object
    data array of object, required
    data[].active boolean, required
    Whether the agency offers it.
    data[].category string, required
    The category.
    data[].position integer
    Its place.
    data[].tasks array of object, required
    Its tasks, in order.
    data[].tasks[].active boolean, required
    Whether it is offered.
    data[].tasks[].category string, required
    Its category.
    data[].tasks[].id string, required
    The record's id.
    data[].tasks[].minutes_per_task string
    Minutes each time.
    data[].tasks[].position integer
    Its place in the category.
    data[].tasks[].task_name string, required
    The task.
    data[].tasks[].times_per_week integer
    Times a week.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/cfc-programs/{category}

Offer or stop offering a CFC program

As the page's toggle does. Turning off the last active category answers 422 last_active_category. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
category path yes A CFC program category.

Request body (required) application/json object

Whether it is offered

active boolean, required
Whether the agency offers it.
  • 200 The category object
    data object, required
    data.active boolean, required
    Whether it is offered.
    data.category string, required
    The category.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code last_active_category: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/cfc-programs/{category}/tasks

Add a task to a CFC program

At the end of the category, as the page's Add does. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
category path yes A CFC program category.

Request body (required) application/json object

The task

minutes_per_task string, required
Minutes each time.
task_name string, required
The task.
times_per_week integer, required
Times a week.
  • 201 The task object
    data object, required
    data.active boolean, required
    Whether it is offered.
    data.category string, required
    Its category.
    data.id string, required
    The record's id.
    data.minutes_per_task string
    Minutes each time.
    data.position integer
    Its place in the category.
    data.task_name string, required
    The task.
    data.times_per_week integer
    Times a week.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/cfc-tasks/{id}

Change a CFC task

Its name, minutes or times a week; send only what changes. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
id path yes

Request body (required) application/json object

What to change

minutes_per_task string
Minutes each time.
task_name string
The task.
times_per_week integer
Times a week.
  • 200 The task object
    data object, required
    data.active boolean, required
    Whether it is offered.
    data.category string, required
    Its category.
    data.id string, required
    The record's id.
    data.minutes_per_task string
    Minutes each time.
    data.position integer
    Its place in the category.
    data.task_name string, required
    The task.
    data.times_per_week integer
    Times a week.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/cfc-tasks/{id}/deactivate

Hide a CFC task

The last active task of a category answers 422 last_active_task. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The task object
    data object, required
    data.active boolean, required
    Whether it is offered.
    data.category string, required
    Its category.
    data.id string, required
    The record's id.
    data.minutes_per_task string
    Minutes each time.
    data.position integer
    Its place in the category.
    data.task_name string, required
    The task.
    data.times_per_week integer
    Times a week.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code last_active_task: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/cfc-tasks/{id}/move

Move a CFC task up or down

One place within its category, as the page's arrows do; answers the category's tasks. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Which way

direction string, required
Which way to move it one place.
  • 200 The tasks object
    data array of object, required
    data[].active boolean, required
    Whether it is offered.
    data[].category string, required
    Its category.
    data[].id string, required
    The record's id.
    data[].minutes_per_task string
    Minutes each time.
    data[].position integer
    Its place in the category.
    data[].task_name string, required
    The task.
    data[].times_per_week integer
    Times a week.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/cfc-tasks/{id}/reactivate

Show a hidden CFC task

As the page's Show does. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The task object
    data object, required
    data.active boolean, required
    Whether it is offered.
    data.category string, required
    Its category.
    data.id string, required
    The record's id.
    data.minutes_per_task string
    Minutes each time.
    data.position integer
    Its place in the category.
    data.task_name string, required
    The task.
    data.times_per_week integer
    Times a week.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/checklist-items/{id}

Rename a checklist item

Its key, and caregivers' records under it, stay. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
id path yes

Request body (required) application/json object

The label

label string, required
The new label.
  • 200 The item object
    data object, required
    data.active boolean, required
    Whether it is shown.
    data.checklist string, required
    Which checklist.
    data.id string, required
    The record's id.
    data.item_key string, required
    The key caregivers' records are kept under; never changes.
    data.item_type string
    How it is kept.
    data.label string, required
    What the item is called.
    data.position integer
    Its place in the checklist.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/checklist-items/{id}/deactivate

Hide a checklist item

Hides it from caregivers' checklists; saved records stay. The last visible item answers 422 last_active. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The item object
    data object, required
    data.active boolean, required
    Whether it is shown.
    data.checklist string, required
    Which checklist.
    data.id string, required
    The record's id.
    data.item_key string, required
    The key caregivers' records are kept under; never changes.
    data.item_type string
    How it is kept.
    data.label string, required
    What the item is called.
    data.position integer
    Its place in the checklist.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code last_active: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/checklist-items/{id}/move

Move a checklist item up or down

One place, as the page's arrows do; answers the checklist in its new order. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Which way

direction string, required
Which way to move it one place.
  • 200 The items object
    data array of object, required
    data[].active boolean, required
    Whether it is shown.
    data[].checklist string, required
    Which checklist.
    data[].id string, required
    The record's id.
    data[].item_key string, required
    The key caregivers' records are kept under; never changes.
    data[].item_type string
    How it is kept.
    data[].label string, required
    What the item is called.
    data[].position integer
    Its place in the checklist.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/checklist-items/{id}/reactivate

Show a hidden checklist item

As the page's Show does. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The item object
    data object, required
    data.active boolean, required
    Whether it is shown.
    data.checklist string, required
    Which checklist.
    data.id string, required
    The record's id.
    data.item_key string, required
    The key caregivers' records are kept under; never changes.
    data.item_type string
    How it is kept.
    data.label string, required
    What the item is called.
    data.position integer
    Its place in the checklist.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/checklists/{checklist}/items

List a checklist's items

Every item of the employee-file or compliance checklist, hidden ones included, in order, as Settings > Checklists shows them. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
checklist path yes employee_file or compliance.
  • 200 The items object
    data array of object, required
    data[].active boolean, required
    Whether it is shown.
    data[].checklist string, required
    Which checklist.
    data[].id string, required
    The record's id.
    data[].item_key string, required
    The key caregivers' records are kept under; never changes.
    data[].item_type string
    How it is kept.
    data[].label string, required
    What the item is called.
    data[].position integer
    Its place in the checklist.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/checklists/{checklist}/items

Add a checklist item

Adds an item at the end, as the page's Add does; its key is made from the label. A compliance item is a date-expiry item unless item_type is checkbox. A label that keys an existing item answers 422 validation_failed. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
checklist path yes employee_file or compliance.

Request body (required) application/json object

The item

item_type string
Compliance only.
label string, required
What the item is called.
  • 201 The item object
    data object, required
    data.active boolean, required
    Whether it is shown.
    data.checklist string, required
    Which checklist.
    data.id string, required
    The record's id.
    data.item_key string, required
    The key caregivers' records are kept under; never changes.
    data.item_type string
    How it is kept.
    data.label string, required
    What the item is called.
    data.position integer
    Its place in the checklist.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/evv-rules

List the EVV exception rules

The rules that raise visit exceptions, as Settings > EVV rules shows them; the defaults are set up on first read. Needs agency_settings.manage (403 forbidden otherwise).

  • 200 The rules object
    data array of object, required
    data[].description string
    What it means.
    data[].enabled boolean, required
    Whether it raises exceptions.
    data[].id string, required
    The record's id.
    data[].rule_type string, required
    What the rule checks.
    data[].severity string
    How serious its exceptions are.
    data[].threshold_unit string
    The threshold's unit.
    data[].threshold_value string
    Its threshold.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/evv-rules/reset

Reset the EVV exception rules to the defaults

Replaces every rule with the default set, as the page's Reset does; answers the rules. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
  • 200 The rules object
    data array of object, required
    data[].description string
    What it means.
    data[].enabled boolean, required
    Whether it raises exceptions.
    data[].id string, required
    The record's id.
    data[].rule_type string, required
    What the rule checks.
    data[].severity string
    How serious its exceptions are.
    data[].threshold_unit string
    The threshold's unit.
    data[].threshold_value string
    Its threshold.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/evv-rules/{id}

Change an EVV exception rule

Its severity, threshold, description or whether it is on; send only what changes. A value the rule refuses answers 422 naming the field. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
id path yes

Request body (required) application/json object

What to change

description string
What it means; null clears it.
enabled boolean
Whether it raises exceptions.
severity string
How serious.
threshold_unit string
The threshold's unit; null clears it.
threshold_value string
The threshold; null clears it.
  • 200 The rule object
    data object, required
    data.description string
    What it means.
    data.enabled boolean, required
    Whether it raises exceptions.
    data.id string, required
    The record's id.
    data.rule_type string, required
    What the rule checks.
    data.severity string
    How serious its exceptions are.
    data.threshold_unit string
    The threshold's unit.
    data.threshold_value string
    Its threshold.
  • 403 Forbidden, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/evv-rules/{id}/toggle

Turn an EVV exception rule on or off

Flips it, as the page's switch does. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The rule object
    data object, required
    data.description string
    What it means.
    data.enabled boolean, required
    Whether it raises exceptions.
    data.id string, required
    The record's id.
    data.rule_type string, required
    What the rule checks.
    data.severity string
    How serious its exceptions are.
    data.threshold_unit string
    The threshold's unit.
    data.threshold_value string
    Its threshold.
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Shift plans

GET /api/v1/clients/{id}/shift-plan

A client's Shift Plan

What the Shift Plan screen shows: the plan's settings (made with the agency's defaults on the first read), each service's week against its calculator, one card per shift with its Work Order, its day columns and its rows of day cells (marks and minutes), the task table, the warnings and the checks before a print. Another agency's client answers 404.

Parameter In Required Description
id path yes
  • 200 The Shift Plan object
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/clients/{id}/shift-plan

Change a Shift Plan's settings

Saves the settings sent, as the screen saves each field: days and shifts_per_day by service, shift_settings by shift and key, the others whole. A malformed value answers 422 naming its field and nothing is saved. The generated Work Orders follow at once, with no Generate: each takes the new lines and Time In and Time Out, and the Work Order of a shift the change removes, or leaves with no visits, is archived and named in archived. A shift the change adds gets its Work Order at Generate. Answers the Shift Plan as the screen shows it next.

Parameter In Required Description
id path yes

Request body application/json object

The settings that change

days object
Optional: pc and/or hm => the service's working days; a service left out keeps its days.
days.hm array of integer
The service's working days.
days.pc array of integer
The service's working days.
gap_minutes integer
Optional: minutes between a shift and the one it starts after.
marks_mode string
Optional: the day cells as marks (x) or minutes.
shift_settings object
Optional: shift id => the keys that change: time (HH:MM, its start), after (the shift it starts after, null for none), by_day (day => HH:MM, a start of its own that day). A key left out is kept.
shifts_per_day object
Optional: pc and/or hm => shifts a day; a service left out keeps its count.
shifts_per_day.hm integer
Shifts a day, 0 to 4.
shifts_per_day.pc integer
Shifts a day, 0 to 4.
split_long_tasks boolean
Optional: whether a long, rare task is split.
  • 200 The Shift Plan, and the shifts whose Work Orders were archived object
    archived array of string, required
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/clients/{id}/shift-plan/care-instructions/{shift_id}

Set a Shift Plan card's Care Instructions

Keeps the text as the shift's Care Instructions, as the card's box does; they are that shift's Work Order notes: Generate writes them, and a change rewrites the notes of a Work Order already generated for the shift (audited as a relayed setting). The Work Order's print shows them under Care Instructions. Blank or null removes them. A shift id no plan has answers 404, a text longer than a Work Order's notes hold 422 too_long. Answers the Shift Plan as the screen shows it next.

Parameter In Required Description
id path yes
shift_id path yes

Request body (required) application/json object

The Care Instructions

text string, required
The shift's Care Instructions, as the card's box takes them; blank or null removes them. At most the characters a Work Order's notes hold, else 422 too_long.
  • 200 The Shift Plan object
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
  • 404 Not Found, as the operation's description says. Error
  • 422 Code too_long: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/clients/{id}/shift-plan/caregivers/{shift_id}

Pick the caregiver for a Shift Plan shift

Saves the caregiver picked for the shift, as the screen's caregiver select does, before Generate or after; null lets go of the pick. The pick takes effect at Generate. Any caregiver of the agency on file may be picked: one no longer active comes back as a warning and Generate skips its shift. A caregiver id the agency has no caregiver of on file, or a shift that is no shift, answers 404 and nothing is saved. Answers the Shift Plan as the screen shows it next.

Parameter In Required Description
id path yes
shift_id path yes The shift.

Request body (required) application/json object

The caregiver

caregiver_id string, required
The caregiver picked for the shift, any of the agency's on file, or null to let go of the pick.
  • 200 The Shift Plan object
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/shift-plan/cells

Set one day cell of a Shift Plan card

Keeps count marks on day in the row of the shift as the office's own change, as the screen's cell select does, before Generate or after: every later change to the settings or the task table lays the week out again under it. On a generated shift the row's line on its Work Order is written too, then every shift is timed again. The count the automatic layout gives that cell lets go of the change. A shift the plan does not have, or a row on no Work Order task of the plan, answers 404. Answers the Shift Plan as the screen shows it next.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The cell

count integer, required
The marks that day; the screen offers 0 to 8. The count the automatic layout gives that cell lets go of the change.
day integer, required
The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
row string, required
The row's name, as the card's rows name it (Bathing, Toileting).
shift_id string, required
The shift: PC1 ... PC4, HM1 ...
  • 200 The Shift Plan object
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/clients/{id}/shift-plan/export

A Shift Plan as an Excel workbook

The screen's Download Excel: the Calculator sheet and one sheet per generated Work Order, named "POC <Last> <First>.xlsx". The checks the screen shows first are GET /clients/{id}/shift-plan's print_problems; they never stop the file. Audited as an export of the client's information before it is sent.

Parameter In Required Description
id path yes
  • 200 The workbook string
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/shift-plan/generate

Generate a Shift Plan's Work Orders

Lays out the client's week and writes one standing Work Order per shift, as the screen's Generate does: a new one for a shift that has none, the plan in force of the one it has (a backup kept), and an archive for a shift the plan no longer has. Each shift's caregiver is its saved pick unless caregivers names it. Nothing is refused for the layout: a shift with no visits or no active caregiver is skipped and named, a day past midnight is written with no Time Out, and each is a warning.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

The caregivers chosen

caregivers object
Optional: shift id => the caregiver for its Work Order, or null for none, each saved as the shift's pick as PUT /clients/{id}/shift-plan/caregivers/{shift_id} saves it. A shift left out takes its saved pick (the plan's caregivers); a shift with no caregiver gets no Work Order and keeps the one it has.
  • 200 What Generate wrote, and the Shift Plan object
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
    generated object, required
    generated.archived array of string
    Shifts whose Work Order was archived.
    generated.replaced array of object
    Shifts whose Work Order was rewritten, with the backup kept.
    generated.replaced[].backup_id string
    The record's id.
    generated.replaced[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    generated.skipped array of object
    Shifts given no Work Order: no_visits, no_caregiver or inactive_caregiver. Never a refusal.
    generated.skipped[].reason string
    generated.skipped[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    generated.warnings array of string
    generated.work_orders array of object
    The shifts written, each with its Work Order.
    generated.work_orders[].caregiver_id string
    The record's id.
    generated.work_orders[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    generated.work_orders[].work_order_id string
    The record's id.
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/shift-plan/tasks

Change a figure of a Shift Plan's task table

Saves one task-table figure on the Shift Plan, never on the Plan of Care, as the screen's task table does, and lays the task out again on the generated Work Orders. times divides the same week into that many visits; min_task or min_week recomputes Times / week. A value that is not above 0 (or not whole, for times) answers 422 invalid_figure, one past a week 422 too_large; a task the plan does not hold 404. Answers the Shift Plan as the screen shows it next.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The figure

field string, required
The figure: times (Times / week), min_task (Min / task) or min_week (Min / week).
service string, required
The task's service.
task string, required
The task, as the task table names it (Bathing).
value number, required
Above 0; a whole number for times. Past a week answers 422 too_large.
  • 200 The Shift Plan object
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes invalid_figure, too_large: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/shift-plan/tasks/add

Add a task to a Shift Plan's task table

Puts a task of the state form in the task table, as the screen's Add task does: on the Shift Plan, never on the Plan of Care. A task the Plan of Care lacks starts at 15 min × 1 = 15 min a week; one taken out earlier comes back with the calculator's figures. It is laid out and reaches the generated Work Orders. A task already in the table changes nothing; a name the form does not list for the service answers 422 unknown_task. Answers the Shift Plan as the screen shows it next.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The task

service string, required
The task's service.
task string, required
A task on the state form for that service, by its name (Dusting, Meal Prep/Menu Planning); the screen's Add task lists the ones the table does not hold.
  • 200 The Shift Plan object
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
  • 422 Code unknown_task: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/clients/{id}/shift-plan/tasks/{service}/{task}

Take a task out of a Shift Plan's task table

Takes the task out of the task table and the layout, as the screen's × does, with the changed cells of its row: on the Shift Plan, never on the Plan of Care, and it returns to the tasks Add task offers. Its line on the generated Work Orders is laid out again without it. A task the table does not hold answers 404. Answers the Shift Plan as the screen shows it next.

Parameter In Required Description
id path yes
service path yes The task's service.
task path yes The task, as the task table names it (Bathing), URL-encoded: Meal Prep/Menu Planning is Meal%20Prep%2FMenu%20Planning.
  • 200 The Shift Plan object
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/shift-plan/undo

Undo the changes to a Shift Plan's cells

Lets go of every cell change, as the screen's Undo my changes does, and returns every row of every generated Work Order that differs from the layout to it; the settings and the task table are kept. Answers the Shift Plan and the shifts written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The Shift Plan object
    data object, required
    data.addable object
    Per service, the state form's tasks the table does not hold: what Add task offers.
    data.addable.hm array of string
    data.addable.pc array of string
    data.cards array of object
    data.cards[].after string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].care_instructions string
    The shift's Care Instructions.
    data.cards[].caregiver_id string
    Its Work Order's caregiver.
    data.cards[].caregiver_week object
    The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
    data.cards[].caregiver_week.by_client array of object
    data.cards[].caregiver_week.by_client[].client string
    data.cards[].caregiver_week.by_client[].minutes integer
    A week.
    data.cards[].caregiver_week.caregiver string
    Last, First.
    data.cards[].caregiver_week.caregiver_id string
    The caregiver.
    data.cards[].caregiver_week.minutes integer
    Her minutes a week.
    data.cards[].caregiver_week.visits array of object
    data.cards[].caregiver_week.visits[].client string
    Last, First.
    data.cards[].caregiver_week.visits[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].caregiver_week.visits[].end integer
    Minutes after midnight.
    data.cards[].caregiver_week.visits[].here boolean
    A shift of this client's plan.
    data.cards[].caregiver_week.visits[].minutes integer
    The visit's minutes.
    data.cards[].caregiver_week.visits[].service string
    data.cards[].caregiver_week.visits[].start integer
    Minutes after midnight.
    data.cards[].days array of object
    Its columns in the agency's week order.
    data.cards[].days[].by_day boolean
    It starts at a time of its own that day (shift_settings by_day).
    data.cards[].days[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].days[].end integer
    Minutes after midnight it ends; past 1440 runs past midnight.
    data.cards[].days[].label string
    data.cards[].days[].minutes integer
    The minutes it holds that day.
    data.cards[].days[].overlap boolean
    It overlaps another shift that day.
    data.cards[].days[].start integer
    Minutes after midnight the shift starts, null when off.
    data.cards[].days[].working boolean
    A day the service works.
    data.cards[].effective_date string
    Its Work Order's Effective Date.
    data.cards[].empty boolean
    No visits fall on this shift.
    data.cards[].label string
    data.cards[].lock_version integer
    Its Work Order's lock_version, null before Generate.
    data.cards[].rows array of object
    data.cards[].rows[].cells array of object
    data.cards[].rows[].cells[].count integer
    The marks that day.
    data.cards[].rows[].cells[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.cards[].rows[].cells[].edited boolean
    Differs from the layout; Undo puts it back.
    data.cards[].rows[].cells[].minutes integer
    The minutes they hold.
    data.cards[].rows[].in_plan boolean
    One of the plan's tasks, so its cells can be changed.
    data.cards[].rows[].min_task string
    Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
    data.cards[].rows[].minutes integer
    One visit's minutes.
    data.cards[].rows[].name string
    What a cell change names as row.
    data.cards[].rows[].slug string
    data.cards[].rows[].times integer
    Times / Week: the row's marks on this shift. Null with no marks.
    data.cards[].rows[].week integer
    Week: the row's day minutes added on this shift. Null with no marks.
    data.cards[].service string
    data.cards[].shift_id string
    The shift: PC1 ... PC4, HM1 ...
    data.cards[].shift_number integer
    k of the service's shifts.
    data.cards[].work_order_id string
    Its generated Work Order, null before Generate.
    data.caregivers object
    Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
    data.client_id string
    The record's id.
    data.edited boolean
    Some cell differs from the layout.
    data.hma object
    The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
    data.hma.plan_id string
    The HMA Plan of Care's id.
    data.hma.weekly_minutes integer
    Its tasks' minutes a week.
    data.id string
    The record's id.
    data.other_work_orders array of object
    The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
    data.other_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    data.other_work_orders[].caregiver.first_name string
    data.other_work_orders[].caregiver.id string
    The record's id.
    data.other_work_orders[].caregiver.last_name string
    data.other_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    data.other_work_orders[].effective_date string, required
    Its Effective Date.
    data.other_work_orders[].id string, required
    The record's id.
    data.other_work_orders[].number integer, required
    The Work Order's WO #.
    data.other_work_orders[].service string, required
    The Work Order's service.
    data.other_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    data.overlaps array of object
    data.overlaps[].a string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].b string
    The shift: PC1 ... PC4, HM1 ...
    data.overlaps[].day integer
    The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
    data.print_problems array of string
    What the screen asks to check before a print or Download Excel.
    data.services object
    data.services.hm object
    The service's week against its calculator.
    data.services.hm.authorized integer
    The calculator's minutes a week.
    data.services.hm.cfc_hours string
    The tasks' CFC hours a week.
    data.services.hm.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.hm.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.hm.off_tasks[].name string
    data.services.hm.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.hm.pill string
    As the screen shows it.
    data.services.hm.placed integer
    The minutes the shifts place in the week.
    data.services.hm.status string
    data.services.hm.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.services.pc object
    The service's week against its calculator.
    data.services.pc.authorized integer
    The calculator's minutes a week.
    data.services.pc.cfc_hours string
    The tasks' CFC hours a week.
    data.services.pc.off_tasks array of object
    When the week is off: each row whose placed minutes differ from its tasks' Min / week.
    data.services.pc.off_tasks[].calculator integer
    The tasks' Min / week.
    data.services.pc.off_tasks[].name string
    data.services.pc.off_tasks[].placed integer
    The minutes the shifts place.
    data.services.pc.pill string
    As the screen shows it.
    data.services.pc.placed integer
    The minutes the shifts place in the week.
    data.services.pc.status string
    data.services.pc.total string
    The calculator's TOTAL hours, null without a Plan of Care.
    data.settings object
    days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
    data.task_table array of object
    data.task_table[].edited boolean
    A figure differs from the Plan of Care's.
    data.task_table[].fractional boolean
    Min / task is not whole.
    data.task_table[].max integer
    The state's weekly maximum, in minutes; null for a task it does not list.
    data.task_table[].min_task string
    Min / task.
    data.task_table[].min_week string
    Min / week.
    data.task_table[].name string
    What a task change names as task.
    data.task_table[].norm string
    The state's norm and weekly maximum, as the screen shows it under the task.
    data.task_table[].over_max boolean
    Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
    data.task_table[].service string
    data.task_table[].split object
    A split task: its visits and the minutes of each.
    data.task_table[].split.minutes integer
    Each.
    data.task_table[].split.visits integer
    Visits.
    data.task_table[].times integer
    Times / week.
    data.task_table[].uneven boolean
    Times / week was rounded.
    data.task_totals object
    data.task_totals.hm object
    The service's task table summed, as its Total row reads.
    data.task_totals.hm.hours string
    Their CFC hours, to 2 places.
    data.task_totals.hm.minutes string
    The sum of the rows' Min / week.
    data.task_totals.pc object
    The service's task table summed, as its Total row reads.
    data.task_totals.pc.hours string
    Their CFC hours, to 2 places.
    data.task_totals.pc.minutes string
    The sum of the rows' Min / week.
    data.warnings array of string
    What the screen warns of; never a refusal.
    undone_shifts array of string, required
  • default An error, in the shared envelope. Error

Signed records

POST /api/v1/signed-records/{record_type}/{id}/addenda

Add an addendum to a signed record

As the record page's Add addendum does: the addendum is created and signed, as a typed signature by the credential's user, in one step, and the record reads amended; the signed record, its signatures and its true copy never change, and the addendum gets a true copy of its own. The same body and reason sent again by the same user within 60 seconds answers the addendum already made. A draft answers 422 not_signed, a voided record 409 voided, a missing body or reason 422 validation_failed, an unknown record_type 404 not_found. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
record_type path yes The record's type: supervisor_visit, plan_of_care, monthly_client_report, complaint, critical_incident, client_consent_form, client_emergency_info, care_log or half_month_summary; half_month_summary takes no addendum.
id path yes

Request body (required) application/json object

The addendum

body string, required
What to add, up to 5000 characters. The signed record itself never changes.
reason string, required
Why it is added, 3 to 1000 characters.
signer_name string
The name the addendum is signed under, a typed signature by the credential's user; the user's own name when left out.
  • 201 The addendum object
    data RecordAddendum, required
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 404 Code not_found: Not Found, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes not_signed, validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/signed-records/{record_type}/{id}/history

Read a signed record's history

The record's events, oldest first, as its page lists them: each signature (live or voided), each signature voided, its true copy stored, each signed addendum in full, the record voided, and the record it replaces or that replaced it.

Parameter In Required Description
record_type path yes The record's type: supervisor_visit, plan_of_care, monthly_client_report, complaint, critical_incident, client_consent_form, client_emergency_info, care_log or half_month_summary; half_month_summary takes no addendum.
id path yes
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of events object
    data array of SignedRecordEvent, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/signed-records/{record_type}/{id}/void

Void a signed record

As the record page's Void does: the record is marked voided with the reason given and kept as signed, with its signatures and true copy; it takes no further signatures or addenda. A voided Plan of Care that was the client's current plan becomes past; Work Orders made from it are not changed. Needs signed_records.void (403 forbidden otherwise). Without a reason it answers 422 reason_required; a draft 422 not_signed, a voided record 409 voided.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
record_type path yes The record's type: supervisor_visit, plan_of_care, monthly_client_report, complaint, critical_incident, client_consent_form, client_emergency_info, care_log or half_month_summary; half_month_summary takes no addendum.
id path yes

Request body (required) application/json object

Why it is voided

reason string, required
Why the record is voided, 3 to 1000 characters. It is kept with the voided record.
  • 200 The record object
    data SignedRecordState, required
  • 403 Forbidden, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes not_signed, reason_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Supervisory visits

GET /api/v1/supervisory-visits

List supervisory visits

Each with its checklist questions and answers. A draft is edited here; a completed or signed visit, or a draft already carrying a signature, is changed only on the visit page. The agency's supervisory visits in visit date order, newest first. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
client_id query no Only this client's visits.
caregiver_id query no Only visits observing this caregiver.
visit_date_from query no Visits on or between these days. on or after this date (YYYY-MM-DD, Colorado).
visit_date_to query no Visits on or between these days. on or before this date (YYYY-MM-DD, Colorado).
  • 200 A page of supervisory visits object
    data array of SupervisoryVisit, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/supervisory-visits

Create a supervisory visit

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json SupervisoryVisitCreate

The supervisory visit's fields

  • 201 The created supervisory visit object
    data SupervisoryVisit, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

GET /api/v1/supervisory-visits/due

List the clients a supervisory visit is due for

The agency's clients by how urgent their next supervisory visit is, most urgent first, with the last visit's date and planned day. With planned_for (US-102.37), only the clients whose planned supervisory month of the quarter is that month, by planned day, as the planned supervisory list shows them; due_status is the same rolling-cadence status either way.

Parameter In Required Description
planned_for query no YYYY-MM: the month whose planned supervisory visits to list (January, April, July and October are month 1 of their quarter).
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of clients object
    data array of SupervisoryVisitDue, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

GET /api/v1/supervisory-visits/{id}

Get a supervisory visit

Each with its checklist questions and answers. A draft is edited here; a completed or signed visit, or a draft already carrying a signature, is changed only on the visit page.

Parameter In Required Description
id path yes
  • 200 The supervisory visit object
    data SupervisoryVisit, required
  • 404 Code not_found: no supervisory visit with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/supervisory-visits/{id}

Update a supervisory visit

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json SupervisoryVisitInput

The fields to change

  • 200 The updated supervisory visit object
    data SupervisoryVisit, required
  • 404 Code not_found: no supervisory visit with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the supervisory visit changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/supervisory-visits/{id}/complete

Complete a supervisory visit

Marks it completed and schedules the next visit when the client has a cadence, as the visit page's Complete does. Needs care_plans.manage (403 forbidden otherwise). Unanswered required questions answer 422 naming them; a later step that failed (the next visit, the completing user's reminder cadence) answers 500 internal_error, nothing saved. A visit another request changed while this one ran answers 409 stale_record; send it again.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The visit object
    data SupervisoryVisit, required
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • 500 Code internal_error: Internal Server Error, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/supervisory-visits/{id}/date

Set a supervisory visit's date

As the visit page's date field does; a blank or null date clears it. Every change is recorded with the old and new value. A visit another request changed while this one ran answers 409 stale_record; send it again.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The date

date string
The visit's date, YYYY-MM-DD, or null to clear it; empty clears it too.
  • 200 The visit object
    data SupervisoryVisit, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/supervisory-visits/{id}/reopen

Reopen a supervisory visit for correction

As the visit page's Reopen does. A visit with a signature recorded since signatures became records (record_state signed or amended) is voided with the reason given and copied into a new draft, which is the answer (its replaces_id names the original); without a reason it answers 422 reason_required, and a voided visit 409 voided. Any other completed or signed visit has its signatures cleared and returns to draft in place. Reopening needs care_plans.manage (403 forbidden otherwise); a draft with nothing to undo answers 422 already_draft. A visit another request changed while this one ran answers 409 stale_record; send it again.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

Why it is reopened

reason string
Why the visit is being corrected, 3 to 1000 characters; required once any line is signed, when the visit is voided and copied into a new draft.
  • 200 The visit, or the new draft object
    data SupervisoryVisit, required
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Codes already_draft, reason_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/supervisory-visits/{id}/signatures

Sign a supervisory visit

Records one signature line, as the visit page does: supervisor (signed as the credential's user, under name or the visit's supervisor), client and pcp (by name, required), caregiver (the visit's caregiver). A line already signed answers 422 already_signed; unanswered required questions answer 422 naming them. A visit another request changed while this one ran answers 409 stale_record; send it again. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The signature

name string
The signer's name; required for client and pcp.
signer string, required
Whose line to sign.
  • 200 The visit object
    data SupervisoryVisit, required
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code already_signed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Support tickets

GET /api/v1/support-tickets

List your support tickets

The support tickets the API key's user raised, newest first, with where each has got to. Tickets other members raised are not listed.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only tickets in this state.
priority query no Only tickets at this priority.
  • 200 A page of support tickets object
    data array of SupportTicket, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/support-tickets

Open a support ticket

Sends a request to the HomeCareBilling support team. Send it ONCE per problem: a second call files a second ticket. A bug report the server cannot complete from the user's recent activity is 422 needs_more_info and files nothing: its details carry the questions (missing, questions) and a follow_up_id; ask the user, then send the request again with the answers and that follow_up_id, which files it once however often it is sent. The description needs at least 20 characters; a field that is missing, too long or not one of its values is 422 naming it. A screenshot is not accepted. Requests share the in-app assistant's ceiling: past it the answer is 429 support_ticket_limit. Support replies by email, quoting the reference.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json SupportTicketInput

The request

  • 201 The ticket object
    data SupportTicket, required
  • 422 Code needs_more_info: Unprocessable Content, as the operation's description says. Error
  • 429 Code support_ticket_limit: Too Many Requests, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/support-tickets/{id}

Get one of your support tickets

One ticket the API key's user raised. A ticket another member raised, or another agency's, is 404.

Parameter In Required Description
id path yes
  • 200 The support ticket object
    data SupportTicket, required
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Task set templates

GET /api/v1/task-set-templates

List task set templates

A reusable set of tasks with default minutes and visits a week, from Settings > Task templates. Creating, changing and deleting one is an admin's (403 forbidden otherwise). The agency's task set templates in the default template first, then name order. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
service_type query no Only templates for this service.
  • 200 A page of task set templates object
    data array of TaskSetTemplate, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • 403 Forbidden, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/task-set-templates

Create a task set template

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json TaskSetTemplateInput

The task set template's fields

  • 201 The created task set template object
    data TaskSetTemplate, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/task-set-templates/{id}

Delete a task set template

Deletes it, as the settings page does; Work Orders made from it keep their tasks. The agency's default template answers 422 cannot_delete_default. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
id path yes
  • 200 The deleted template object
    data TaskSetTemplate, required
  • 403 Forbidden, as the operation's description says. Error
  • 422 Code cannot_delete_default: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/task-set-templates/{id}

Get a task set template

A reusable set of tasks with default minutes and visits a week, from Settings > Task templates. Creating, changing and deleting one is an admin's (403 forbidden otherwise).

Parameter In Required Description
id path yes
  • 200 The task set template object
    data TaskSetTemplate, required
  • 403 Forbidden, as the operation's description says. Error
  • 404 Code not_found: no task set template with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/task-set-templates/{id}

Update a task set template

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record.

Parameter In Required Description
id path yes

Request body (required) application/json TaskSetTemplateInput

The fields to change

  • 200 The updated task set template object
    data TaskSetTemplate, required
  • 404 Code not_found: no task set template with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the task set template changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

Timesheets

POST /api/v1/assignments/{id}/timesheets

Create a month's timesheet from an assignment

Makes the client and caregiver's timesheet for year and month from the assignment, with a blank entry per day, as Timesheets > New does. A month outside the assignment, an inactive assignment or one the Work Order already generated answers 422 or 409. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The month

month integer, required
The month, 1 to 12.
year integer, required
The year.
  • 201 The timesheet object
    data Timesheet, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/timesheet-entries/{id}

Change a time entry

Changes the fields sent, as the entries page does, and recalculates the hours. A timesheet that is not a draft answers 422 not_editable.

Parameter In Required Description
id path yes

Request body (required) application/json object

The fields to change

date string
The date, YYYY-MM-DD.
deviation_explanation string
Why the times deviate from the plan; null or blank clears it.
time_in string
HH:MM:SS; null or blank clears it.
time_out string
HH:MM:SS; null or blank clears it.
travel_time boolean
Whether the entry is travel time.
  • 200 The entry object
    data object, required
    data.date string
    data.day_of_week string
    data.deviation_explanation string
    data.evv_clock_in string
    The EVV clock-in pulled from the matched visit.
    data.evv_clock_out string
    The EVV clock-out pulled from the matched visit.
    data.evv_source string
    data.hours_worked string
    Hours that day.
    data.id string
    The record's id.
    data.time_in string
    HH:MM:SS.
    data.time_out string
    HH:MM:SS.
    data.timesheet_id string
    The record's id.
    data.travel_time boolean
    data.visit_id string
    The EVV visit the times were pulled from.
    warnings array of object, required
    The findings the day's delivery raised on this write (care_logs.over_weekly_limit and the like), and the entry's own (timesheets.time_out_before_time_in: the Time Out is before the Time In, so the day counts as an overnight shift): warnings, never refusals.
    warnings[].code string, required
    warnings[].message string, required
  • 422 Code not_editable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/timesheet-entries/{id}/pull-evv

Pull an entry's EVV clock times from its matched visit

Copies the clock-in and clock-out of the EVV visit matching the entry's client, caregiver and date onto the entry and links the visit, as the entries page's Pull EVV does. The visit is matched by the server, never named by the client. A flagged visit (an EVV exception, or one not verified) answers 422 evv_flagged naming the flag; no matching visit 422 no_evv_match; a timesheet that is not a draft 422 not_editable. An entry of another agency's timesheet answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The entry object
    data object, required
    data.date string
    data.day_of_week string
    data.deviation_explanation string
    data.evv_clock_in string
    The EVV clock-in pulled from the matched visit.
    data.evv_clock_out string
    The EVV clock-out pulled from the matched visit.
    data.evv_source string
    data.hours_worked string
    Hours that day.
    data.id string
    The record's id.
    data.time_in string
    HH:MM:SS.
    data.time_out string
    HH:MM:SS.
    data.timesheet_id string
    The record's id.
    data.travel_time boolean
    data.visit_id string
    The EVV visit the times were pulled from.
    warnings array of object, required
    The findings the day's delivery raised on this write (care_logs.over_weekly_limit and the like), and the entry's own (timesheets.time_out_before_time_in: the Time Out is before the Time In, so the day counts as an overnight shift): warnings, never refusals.
    warnings[].code string, required
    warnings[].message string, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes evv_flagged, no_evv_match, not_editable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/timesheet-tasks/{id}

Change a task

Changes the fields sent, as the entries page marks a task done or not.

Parameter In Required Description
id path yes

Request body (required) application/json object

The fields to change

completed boolean
Whether the task was done.
frequency integer
Times done.
notes string
Notes on the task; null or blank clears them.
time_minutes integer
Minutes spent.
  • 200 The task object
    data object, required
    data.completed boolean
    data.frequency integer
    Times done.
    data.id string
    The record's id.
    data.notes string
    data.task_category string
    data.task_name string
    data.time_minutes integer
    Minutes spent.
    data.timesheet_entry_id string
    The record's id.
    warnings array of object, required
    The findings the day's delivery raised on this write (care_logs.over_weekly_limit and the like), and the entry's own (timesheets.time_out_before_time_in: the Time Out is before the Time In, so the day counts as an overnight shift): warnings, never refusals.
    warnings[].code string, required
    warnings[].message string, required
  • default An error, in the shared envelope. Error

GET /api/v1/timesheets

List timesheets

The hours worked for one client and caregiver in one billing period. The agency's timesheets in billing-period order, newest first, deleted ones left out unless include_deleted=true. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
client_id query no Only records of this client.
caregiver_id query no Only records of this caregiver.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
include_deleted query no true also lists deleted records, with deleted_at set, so a sync learns of deletions.
  • 200 A page of timesheets object
    data array of Timesheet, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/timesheets/{id}

Delete a draft timesheet

Deletes the timesheet, as the timesheet list does. Only a draft deletes: any other status answers 422 not_draft. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The timesheet object
    data Timesheet, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code not_draft: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/timesheets/{id}

Get a timesheet

The hours worked for one client and caregiver in one billing period.

Parameter In Required Description
id path yes
  • 200 The timesheet object
    data Timesheet, required
  • 404 Code not_found: no timesheet with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

POST /api/v1/timesheets/{id}/approve

Approve a submitted timesheet

Approves it, as the returned timesheet bar does. warnings names hours stored on the timesheet that differ from what its entries add up to; the stored hours bill. A timesheet not awaiting approval answers 422 not_submitted. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The timesheet and its warnings object
    data Timesheet, required
    warnings array of object, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code not_submitted: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/timesheets/{id}/billing-data

The claim lines an approved timesheet bills

Builds the claim lines from an approved timesheet, as the billing summary does, each with the fields a claim returns (the patient's date of birth, address and gender, which the 837P carries, are not returned; charge_amount only for a credential holding Billing & claims → View). Nothing is written. A timesheet that cannot bill answers 422 billing_refusal with the billing summary's reason. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
id path yes
  • 200 The claim lines object
    data array of object, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code billing_refusal: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/timesheets/{id}/entries

Add a time entry to a draft timesheet

Adds an entry for a date in the billing period and recalculates the hours. A timesheet that is not a draft answers 422 not_editable. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The entry

date string, required
The date, YYYY-MM-DD.
deviation_explanation string
Why the times deviate from the plan; null or blank clears it.
time_in string
HH:MM:SS; null or blank clears it.
time_out string
HH:MM:SS; null or blank clears it.
travel_time boolean
Whether the entry is travel time.
  • 201 The entry object
    data object, required
    data.date string
    data.day_of_week string
    data.deviation_explanation string
    data.evv_clock_in string
    The EVV clock-in pulled from the matched visit.
    data.evv_clock_out string
    The EVV clock-out pulled from the matched visit.
    data.evv_source string
    data.hours_worked string
    Hours that day.
    data.id string
    The record's id.
    data.time_in string
    HH:MM:SS.
    data.time_out string
    HH:MM:SS.
    data.timesheet_id string
    The record's id.
    data.travel_time boolean
    data.visit_id string
    The EVV visit the times were pulled from.
    warnings array of object, required
    The findings the day's delivery raised on this write (care_logs.over_weekly_limit and the like), and the entry's own (timesheets.time_out_before_time_in: the Time Out is before the Time In, so the day counts as an overnight shift): warnings, never refusals.
    warnings[].code string, required
    warnings[].message string, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code not_editable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/timesheets/{id}/export

Export an approved timesheet for billing

Exports it, as the returned timesheet bar's Export does; exported is final. A timesheet that is not approved answers 422 not_exportable. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The timesheet object
    data Timesheet, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code not_exportable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/timesheets/{id}/reject

Reject a submitted timesheet back to draft

Returns it to draft with the reason, clearing its signatures and voiding the half-month summaries that covered it, as the returned timesheet bar does. No reason answers 422 reason_required, a null or blank one 422 null_not_allowed; a timesheet not awaiting approval 422 not_submitted; a covering summary voided meanwhile 409 voided. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The reason

reason string, required
Why it is rejected.
  • 200 The timesheet object
    data Timesheet, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes not_submitted, null_not_allowed, reason_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/timesheets/{id}/reopen

Move a released timesheet back to draft for correction

Returns an approved timesheet a denied claim sent back for correction to draft, clearing its signatures and voiding the half-month summaries that covered it, as the release panel does. Without a release it answers 422 no_release; a covering summary voided meanwhile 409 voided. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The timesheet object
    data Timesheet, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Code no_release: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/timesheets/{id}/signatures

Sign one of a draft timesheet's four slots

Signing needs signed_records.sign and timesheets.view, not timesheets.manage (403 forbidden naming the permission otherwise). A caregiver slot is recorded as the caregiver's paper signature on file (the office never signs in the caregiver's name), with the credential's user as who recorded it; a client slot needs client_name matching the client's name (422 client_name_required when it is blank, 422 client_name_mismatch when it is not the client's). A signed slot answers 409 already_signed unless resign is true, which needs signed_records.void (403 forbidden otherwise). A re-sign voids the half-month summary holding the half with every signature on it, the other role's included, drafts a fresh one from the hours as they now stand, writes a paper signature on file in the other line again on it, and signs the slot on it; another timesheet of the same service that relied on the voided summary must be signed again. The same re-sign retried changes nothing. The signature is written on the half-month summary of the client, caregiver and the timesheet's service, and nothing is written on the timesheet; a half whose client line was skipped with a reason answers 409 half_complete, resign or not; a role held by the paper card of another Work Order of the client and caregiver answers 409 paper_card_on_file, resign or not. When the half's hours changed after a line was signed on its summary, a paper signature on file is redrawn onto a fresh summary of the hours as they now stand and the slot signs that one; a line someone signed for the earlier hours answers 409 signed_hours_changed, and that line is re-signed first. A half not yet ended answers 422 signature_period_not_reached. A timesheet of another agency, or a deleted one, answers 404 and nothing is written. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The slot

client_name string
The client's name, for a client slot.
resign boolean
Re-sign a signed slot (needs signed_records.void).
signature_type string, required
The slot to sign.
  • 200 The timesheet object
    data Timesheet, required
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 404 Not Found, as the operation's description says. Error
  • 409 Codes already_signed, half_complete, paper_card_on_file, signed_hours_changed: Conflict, as the operation's description says. Error
  • 422 Codes client_name_mismatch, client_name_required, signature_period_not_reached: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/timesheets/{id}/submit

Submit a draft timesheet for approval

Submits it, as the returned timesheet bar does. A half counts as signed when the pair's half-month summary for it is signed by the caregiver and the client (in the app, in the office, or on the Timesheet's own paper card) for the hours the Timesheet bills. Missing signatures answer 422 signatures_required unless acknowledge_missing_signatures is true (the page's Submit anyway); no hours answers 422 no_hours_logged. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

Options

acknowledge_missing_signatures boolean
Submit with signatures missing.
  • 200 The timesheet object
    data Timesheet, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes no_hours_logged, signatures_required: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/timesheets/{id}/tasks

Add a task to an entry of a draft timesheet

Records a task done on one of the timesheet's entries, as the entries page does. task_name is one of HCPF's task names. An entry of another timesheet answers 422 entry_not_in_timesheet. A timesheet of another agency, or a deleted one, answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The task

completed boolean
Whether the task was done.
frequency integer
Times done.
notes string
Notes on the task; null or blank clears them.
task_name string, required
HCPF's task name.
time_minutes integer
Minutes spent.
timesheet_entry_id string, required
The entry the task was done on.
  • 201 The task object
    data object, required
    data.completed boolean
    data.frequency integer
    Times done.
    data.id string
    The record's id.
    data.notes string
    data.task_category string
    data.task_name string
    data.time_minutes integer
    Minutes spent.
    data.timesheet_entry_id string
    The record's id.
    warnings array of object, required
    The findings the day's delivery raised on this write (care_logs.over_weekly_limit and the like), and the entry's own (timesheets.time_out_before_time_in: the Time Out is before the Time In, so the day counts as an overnight shift): warnings, never refusals.
    warnings[].code string, required
    warnings[].message string, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code entry_not_in_timesheet: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Unmatched calls

GET /api/v1/unmatched-calls

List unmatched calls

Telephony clock calls that matched no visit, newest first, each with the calling number masked to its last four digits. Filter by status and by the Colorado day the call came in.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
call_date_from query no Only calls received (Colorado days) on or after this date (YYYY-MM-DD, Colorado).
call_date_to query no Only calls received (Colorado days) on or before this date (YYYY-MM-DD, Colorado).
after query no The id of the last call you read: the page starts after it, so calls you resolved meanwhile never make you skip any (offset would). total counts what remains after it.
  • 200 A page of unmatched calls object
    data array of UnmatchedCall, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

POST /api/v1/unmatched-calls/{id}/dismiss

Dismiss an unmatched call

Dismisses a pending call with a reason, as the screen does; it can be undone within 24 hours. The reason is trimmed, then must be 10 to 500 characters (422 invalid_reason); a call no longer pending is 422 naming status.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The reason

reason string, required
Why it is dismissed: 10 to 500 characters, as on the screen.
  • 200 The dismissed call object
    data UnmatchedCall, required
  • 422 Code invalid_reason: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/unmatched-calls/{id}/match

Match an unmatched call to a visit

Records the call as the visit's clock-in or clock-out, as the unmatched-calls screen does. The visit must be this agency's and the call's caregiver's, in a status that takes that clock: 422 names visit_id or the rule. A call no longer pending is 422 naming status. A call kept without its caller's number (originating_phone_number empty) cannot be recorded as a phone clock: 422 no_caller_number; dismiss it and enter the time on the visit.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The visit

visit_id string, required
The visit the call clocked.
  • 200 The matched call object
    data UnmatchedCall, required
  • 422 Code no_caller_number: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/unmatched-calls/{id}/undo-dismiss

Undo a dismissal

Returns a dismissed call to pending within 24 hours of its dismissal, as the screen does. A call not dismissed is 422 naming status; past the window, 422 undo_window_expired.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The call, pending again object
    data UnmatchedCall, required
  • 422 Code undo_window_expired: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Visit exceptions

GET /api/v1/visit-exceptions

List visit exceptions

An EVV exception: a rule a visit broke, or (sandata_raised) an exception Sandata raised on it as the office recorded it; its resolution; and its Sandata acknowledgement state. A deleted visit's exceptions are kept as they are, as the exception queue keeps them. Exceptions are not deleted; only resetting a demo agency removes its records, all of them. The agency's visit exceptions in severity order, errors first, then newest detected. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
exception_type query no Only exceptions of this type.
severity query no Only exceptions of this severity.
visit_id query no Only exceptions on this visit.
client_id query no Only records of this client.
caregiver_id query no Only records of this caregiver.
detected_from query no Only exceptions detected on or after this date (YYYY-MM-DD, Colorado).
detected_to query no Only exceptions detected on or before this date (YYYY-MM-DD, Colorado).
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
  • 200 A page of visit exceptions object
    data array of VisitException, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

GET /api/v1/visit-exceptions/reason-codes

Resolution and reason codes

The resolution codes a resolve takes, and the Colorado reason code (Addendum Appendix 3) that describes each exception type, as reference data.

  • 200 The codes object
    data VisitExceptionReasonCodes, required
  • default An error, in the shared envelope. Error

POST /api/v1/visit-exceptions/resolve

Resolve visit exceptions in bulk

Acknowledges or dismisses up to 100 exceptions with one reason, each on its own, so one failing never undoes another. Only open exceptions of this agency are resolved; the rest, including one resolved elsewhere meanwhile, are skipped.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json VisitExceptionBulkResolve

The exceptions and the resolution

  • 200 What was resolved object
    data object, required
    data.failed_ids array of string, required
    Not resolved because the write failed; retrying them is safe.
    data.resolved_ids array of string, required
    Resolved now.
    data.skipped_ids array of string, required
    Not open, or not this agency's: nothing was done to them.
  • default An error, in the shared envelope. Error

GET /api/v1/visit-exceptions/{id}

Get a visit exception

An EVV exception: a rule a visit broke, or (sandata_raised) an exception Sandata raised on it as the office recorded it; its resolution; and its Sandata acknowledgement state. A deleted visit's exceptions are kept as they are, as the exception queue keeps them. Exceptions are not deleted; only resetting a demo agency removes its records, all of them.

Parameter In Required Description
id path yes
  • 200 The visit exception object
    data VisitException, required
  • 404 Code not_found: no visit exception with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

POST /api/v1/visit-exceptions/{id}/assignment

Assign a visit exception

Assigns the exception to a user of this agency, or unassigns it with null, as the exception page does (US-94.24). The last assignment wins; it takes no lock_version. A user of another agency answers 422 assignee_not_found; an exception of another agency 404. One changed by another write while this request ran answers 409 stale_record, and nothing is saved.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json VisitExceptionAssignment

Who it is assigned to

  • 200 The exception object
    data VisitException, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code assignee_not_found: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/visit-exceptions/{id}/resolve

Resolve a visit exception

Resolves an open exception. Its acknowledgement is queued to Sandata only when it carries an ACK exception code Sandata raised (15 or 21); Sandata takes none for any other. An exception that is not open is 422 naming status; dismiss without resolution_notes is 422 naming resolution_notes; correct without both adjusted times is 422; correcting one whose visit was deleted is 422 visit_deleted. One changed by another write while this request ran answers 409 stale_record, and nothing is saved.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json VisitExceptionResolve

The resolution

  • 200 The resolved exception object
    data VisitException, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code visit_deleted: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

DELETE /api/v1/visits/{id}/sandata-exceptions

Withdraw the exception code recorded as raised by Sandata

Withdraws a wrong code recorded on the visit as raised by Sandata (US-98.29): the exception stays, with status withdrawn and a moved updated_at, leaves the acknowledgement queue, and the right code can then be recorded. Allowed while its acknowledgement is pending, failed or held; one already sent (submitted or accepted) is 422 already_sent. A visit with no code recorded, deleted or foreign, is 404.

Parameter In Required Description
id path yes
  • 200 The withdrawn exception object
    data VisitException, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Code already_sent: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/visits/{id}/sandata-exceptions

Record the exception Sandata raised on a visit

Records the ACK exception Sandata raised on a visit it took (15 Unmatched Client ID / Phone or 21 No Show Exception, read off Sandata's Aggregator) as a sandata_raised exception, and queues its acknowledgement to Sandata. At most one per visit. A visit Sandata has not taken is 422 not_sent; a second record on the visit is 422 already_recorded; a deleted or foreign visit is 404.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json VisitSandataException

The exception Sandata raised

  • 201 The recorded exception object
    data VisitException, required
  • 404 Not Found, as the operation's description says. Error
  • 422 Codes already_recorded, not_sent: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Visits

GET /api/v1/clients/{id}/evidence

Read a client's month of visit evidence

As the /clients/:id/evidence grid: every calendar day of the month for the client and caregiver, with the day's state (none, corroborated, single_source, conflict or conflict_dismissed), each evidence source's visits and billable times, timesheet_drifts (deprecated, always empty: a Timesheet day references its care log, so the two cannot differ), the keys of the day's open conflicts, and who dismissed each dismissed one, when and why. Another agency's client or caregiver answers 404.

Parameter In Required Description
id path yes The client.
caregiver_id query yes The caregiver.
month query no The month, YYYY-MM; this month (Mountain) when left out.
  • 200 The client's month object
    caregiver_id string, required
    The caregiver.
    client_id string, required
    The client.
    days array of object, required
    Every calendar day of the month, in order.
    days[].care_logs array of object, required
    days[].care_logs[].attestation_method string
    How the client or representative signed it, if they did.
    days[].care_logs[].attestation_skip_reason string
    Why the client could not sign, when the caregiver said.
    days[].care_logs[].care_log_id string, required
    The care log.
    days[].care_logs[].comparisons array of object, required
    days[].care_logs[].comparisons[].conflict_key string
    The conflict's key, on a conflict only; dismiss it as a visit conflict is dismissed.
    days[].care_logs[].comparisons[].fields array of string, required
    On a conflict, the fields that differ: start, end, tasks or attestation.
    days[].care_logs[].comparisons[].kind string, required
    What was compared: the care log's times with the visit evidence, its done tasks with the Work Order's office-typed marks, or the client's signature with the visit's client verification.
    days[].care_logs[].comparisons[].only_care_log array of string, required
    Task codes done on the care log and not marked on the Work Order.
    days[].care_logs[].comparisons[].only_work_order array of string, required
    Task codes marked on the Work Order and not done on the care log.
    days[].care_logs[].comparisons[].state string, required
    The comparison's state.
    days[].care_logs[].comparisons[].visit_id string
    The visit it was compared with, when one was.
    days[].care_logs[].end string
    Its end (the linked visit's, else entered).
    days[].care_logs[].service_type string, required
    Its service.
    days[].care_logs[].shift_number integer, required
    Its shift of the day.
    days[].care_logs[].source string, required
    How the care log was captured.
    days[].care_logs[].start string
    Its start (the linked visit's, else entered).
    days[].claim_changes array of object, required
    days[].claim_changes[].batch_id string, required
    The claim's batch.
    days[].claim_changes[].care_log_ids array of string, required
    The care logs of the day that changed.
    days[].claim_changes[].claim_id string, required
    The claim sent before the day's care log changed.
    days[].claim_changes[].fingerprint string, required
    The warning's fingerprint; dismiss it through POST /api/v1/revenue-warnings/dismissals with the claim_id as subject_id.
    days[].claim_changes[].kind string, required
    changed_after_claim.
    days[].claim_changes[].state string, required
    Whether the warning is open or dismissed.
    days[].date string, required
    The day (Mountain).
    days[].dismissals array of object, required
    days[].dismissals[].conflict_key string, required
    The conflict dismissed.
    days[].dismissals[].dismissed_at string, required
    When it was dismissed.
    days[].dismissals[].dismissed_by string, required
    Who dismissed it.
    days[].dismissals[].dismissed_by_user_id string
    The member who dismissed it; null for an API key.
    days[].dismissals[].reason string, required
    Why it was dismissed.
    days[].open_conflict_keys array of string, required
    The keys of the day's visit, care-log and timesheet-drift conflicts nobody has dismissed.
    days[].sources array of object, required
    days[].sources[].source string, required
    The evidence source; paper_scan, on a day with no visit, is the times of its paper-scan care log.
    days[].sources[].visits array of object, required
    days[].sources[].visits[].care_log_id string
    On a paper_scan row, the paper-scan care log whose times it shows.
    days[].sources[].visits[].conflict_key string
    The entry's conflict key, on a conflict only.
    days[].sources[].visits[].end string
    Its billable end; null while it is open.
    days[].sources[].visits[].procedure_code string
    Its procedure code.
    days[].sources[].visits[].start string
    Its billable start (adjusted, else actual).
    days[].sources[].visits[].state string, required
    The state of the reconciliation entry the visit is in.
    days[].sources[].visits[].visit_id string, required
    The visit; null on a paper_scan row, which has none.
    days[].state string, required
    The day's state, the worst of its entries; none with no evidence.
    days[].timesheet_drifts array of object, required
    Deprecated, always empty: a Timesheet day now references the day's care log itself, so the two cannot differ. Kept for one release; read nothing from it.
    days[].timesheet_drifts[].care_log_id string, required
    The care log of the day.
    days[].timesheet_drifts[].conflict_key string, required
    The drift's key, built from the differing values; dismiss it through POST /api/v1/evidence-dismissals (or the month through POST /api/v1/clients/{id}/evidence/dismissals).
    days[].timesheet_drifts[].dismissed boolean, required
    Whether it has been dismissed.
    days[].timesheet_drifts[].fields array of string, required
    The fields that differ: time_in, time_out or tasks.
    days[].timesheet_drifts[].only_other array of string, required
    Task names done on the other record and not on the timesheet.
    days[].timesheet_drifts[].only_timesheet array of string, required
    Task names done on the timesheet and not on the other record.
    days[].timesheet_drifts[].other object, required
    days[].timesheet_drifts[].other.tasks array of string, required
    The names of the tasks marked done that day.
    days[].timesheet_drifts[].other.time_in string, required
    Time In, Mountain, HH:MM; null when it has none.
    days[].timesheet_drifts[].other.time_out string, required
    Time Out, Mountain, HH:MM; null when it has none.
    days[].timesheet_drifts[].source string, required
    What the returned timesheet's day was compared with: the care log, or the Work Order entry and marks assembled from it.
    days[].timesheet_drifts[].state string, required
    Whether the warning is open or dismissed.
    days[].timesheet_drifts[].timesheet object, required
    days[].timesheet_drifts[].timesheet.tasks array of string, required
    The names of the tasks marked done that day.
    days[].timesheet_drifts[].timesheet.time_in string, required
    Time In, Mountain, HH:MM; null when it has none.
    days[].timesheet_drifts[].timesheet.time_out string, required
    Time Out, Mountain, HH:MM; null when it has none.
    days[].timesheet_drifts[].timesheet_id string, required
    The month's returned timesheet.
    days[].visit_evidence string, required
    The day's visit evidence: visits when it has one, else paper_scan when a paper-scan care log holds its times, else none.
    month string, required
    YYYY-MM.
    open_conflicts integer, required
    How many conflicts in the month are open.
  • 404 Not Found, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/clients/{id}/evidence/dismissals

Dismiss every open evidence conflict of a client's month

As the grid's Dismiss all: every conflict still open in the month for the client and caregiver is dismissed with one reason, under one batch, with one audit row; dismissed answers how many. A month with none open answers 200 with dismissed 0, so a repeat dismisses nothing. A reason outside 3 to 500 characters is 422, and so is a field the body does not take (unknown_field): to dismiss one conflict, POST /api/v1/evidence-dismissals. Another agency's client or caregiver answers 404 and nothing is written. No visit changes.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes The client.

Request body (required) application/json object

The month and the reason

caregiver_id string, required
The caregiver.
month string
The month, YYYY-MM; this month (Mountain) when left out.
reason string, required
Why the month's conflicts can be dismissed, as the grid asks.
  • 200 None was open, so none was dismissed object
    caregiver_id string, required
    The caregiver.
    client_id string, required
    The client.
    dismissed integer, required
    How many conflicts this request dismissed; 0 when none was open.
    month string, required
    YYYY-MM.
  • 201 How many were dismissed object
    caregiver_id string, required
    The caregiver.
    client_id string, required
    The client.
    dismissed integer, required
    How many conflicts this request dismissed; 0 when none was open.
    month string, required
    YYYY-MM.
  • 404 Not Found, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/evidence-dismissals

Dismiss a visit evidence conflict

As the visit page's Dismiss warning form: records why two sources' times for a client, caregiver and day may differ, and changes neither visit. Dismissing a conflict already dismissed answers 200 with already_dismissed true and that dismissal. A conflict_key that is no longer a conflict of that day (a visit changed since it was read) answers 409 conflict_changed. A reason outside 3 to 500 characters is 422. Another agency's client or caregiver answers 404 and nothing is written.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json object

The conflict to dismiss

caregiver_id string, required
The visit's caregiver.
client_id string, required
The visit's client.
conflict_key string, required
The conflict's key, as the conflict was read.
reason string, required
Why the difference can be dismissed, as the visit page asks.
service_date string, required
The visit's service date (the Mountain day).
  • 200 Already dismissed object
    data EvidenceDismissal, required
  • 201 The dismissal object
    data EvidenceDismissal, required
  • 404 Not Found, as the operation's description says. Error
  • 409 Code conflict_changed: Conflict, as the operation's description says. Error
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/reports/electronic-evidence

Read the electronic evidence (adoption) report of a month

US-101.12: the share of worked client-days with electronic visit evidence (the caregiver app, the phone line, Sandata or another EVV vendor), for the 12 months ending with month, and for month itself per caregiver and per client, lowest share first and paged (limit and offset apply to both tables). A worked client-day is a client, caregiver and date with a worked visit or timesheet hours. Figures are computed nightly, for live agencies only (the nightly run skips demo agencies, whose months all answer computed false): a month with no snapshot answers computed false, never 0%. Work Order days are not counted. month defaults to the latest computed month.

Parameter In Required Description
month query no The month, YYYY-MM.
limit query no Rows per page (default 25, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 The electronic evidence report object
    caregivers object, required
    caregivers.data array of object, required
    caregivers.data[].client_days integer, required
    The caregiver's worked client-days in the month.
    caregivers.data[].electronic_days integer, required
    Of those, the days with electronic evidence.
    caregivers.data[].id string
    The caregiver; null once the caregiver is removed.
    caregivers.data[].name string
    The caregiver's "Last, First".
    caregivers.data[].share number
    electronic_days / client_days, 0 to 1; null with no worked day.
    caregivers.total integer, required
    How many rows the month has.
    clients object, required
    clients.data array of object, required
    clients.data[].client_days integer, required
    The client's worked client-days in the month.
    clients.data[].electronic_days integer, required
    Of those, the days with electronic evidence.
    clients.data[].id string
    The client; null once the client is removed.
    clients.data[].name string
    The client's "Last, First".
    clients.data[].share number
    electronic_days / client_days, 0 to 1; null with no worked day.
    clients.total integer, required
    How many rows the month has.
    computed boolean, required
    Whether the month has a snapshot.
    limit integer, required
    The page size of both tables.
    month string, required
    YYYY-MM.
    offset integer, required
    The rows skipped in both tables.
    trend array of object, required
    The 12 months ending with month, newest first.
    trend[].client_days integer
    Worked client-days; null when not computed.
    trend[].computed boolean, required
    False when the month has no snapshot yet: not 0%.
    trend[].electronic_days integer
    Of those, the days with electronic evidence; null when not computed.
    trend[].month string, required
    YYYY-MM.
    trend[].share number
    electronic_days / client_days, 0 to 1; null with no worked day.
  • default An error, in the shared envelope. Error

POST /api/v1/visit-imports

Import Sandata's record of visits

Imports each row of a Sandata Detail Visit Status export as a read-only visit beside the agency's own (source import, import_system sandata), as Import Sandata visits does. A re-import of the same file adds nothing, and a row whose visit Sandata changed updates its imported visit; HCB's own visits are never changed. A row naming no client or caregiver of this agency, or several, or no call times, is not written and is listed by row number and reason; the rest of the file still imports. With dry_run true the answer is 200 with what the import would do, writing nothing; a file that cannot be read is 422 with the refusal's code (missing_columns, csv_parse_error, empty_file, too_many_rows, file_too_large). Without it the answer is 202 with the run, queued; GET /api/v1/visit-imports/{id} until it has ended, when such a file ends it failed.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) multipart/form-data object

A multipart form with Sandata's Detail Visit Status export (Reports, Detail Visit Status, exported as CSV) in the field `file`, at most 10 MB and 5000 rows, and optionally dry_run.

dry_run boolean
true: answer what the import would do (counts and unresolved rows) and write nothing. Left out or false: import.
file string, required
  • 200 dry_run true: what the import would do object
    data VisitImportPreview, required
  • 202 The run, queued; GET /api/v1/visit-imports/{id} until it has ended object
    data VisitImport, required
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/visit-imports/{id}

Read a Sandata visit import

A run POST /api/v1/visit-imports started: pending or processing until its worker ends it, then completed, partial (some rows unresolved) or failed, with its counts and unresolved rows.

Parameter In Required Description
id path yes
  • 200 The run object
    data VisitImport, required
  • default An error, in the shared envelope. Error

GET /api/v1/visits

List visits

An EVV visit: one caregiver's service to one client on one day, with its clocked, scheduled and adjusted times, its EVV attributes and its Sandata state. The agency's visits in service-date order, newest first, then scheduled start; deleted ones left out unless include_deleted=true. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
visit_type query no Only visits of this type.
sandata_submission_status query no Only visits in this Sandata queue state; not_queued is a visit not in the queue (never queued, or pulled before it was sent).
client_id query no Only records of this client.
caregiver_id query no Only records of this caregiver.
service_date_from query no Only visits whose service date is on or after this date (YYYY-MM-DD).
service_date_to query no Only visits whose service date is on or before this date (YYYY-MM-DD).
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
include_deleted query no true also lists deleted records, with deleted_at set, so a sync learns of deletions.
  • 200 A page of visits object
    data array of Visit, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/visits

Create a visit

Schedules a visit, as the web's visit form does, with source api. The client, caregiver and assignment must be this agency's (422 naming the field). A visit overlapping the caregiver's others is created, and warnings says so.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json VisitCreate

The visit's fields

  • 201 The created visit and its warnings VisitWriteResult
  • 422 Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/visits/bulk-cancel

Cancel visits in bulk

Cancels up to 100 of the agency's visits, each on its own, so one failing never undoes another, as the visit list's bulk action does (US-94.24). An id that is not this agency's visit is failed as not_found; a visit imported from another EVV system (US-101.9) is read-only here and is failed as imported_visit. Visits carry a lock_version, but a bulk action takes none: each visit is moved as it is when the action reaches it. A cancel dismisses the visit's open exceptions; one it cannot dismiss is failed as exception_not_dismissed. cancellation_reason and cancellation_note, if sent, are kept on every visit cancelled (a note needs a reason: 422 validation_failed).

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json VisitBulkTransition

The visits

  • 200 What was cancelled object
    data object, required
    data.failed array of object, required
    Not moved: not_found (not this agency's visit), invalid_transition (its status cannot move there), exception_not_dismissed (a cancel whose open exception could not be dismissed), imported_visit (a visit imported from another EVV system, US-101.9, which is read-only here) or error (the write failed; retrying is safe).
    data.failed[].id string, required
    The record's id.
    data.failed[].reason string, required
    Why.
    data.succeeded_ids array of string, required
    Moved now.
  • 422 Code validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/visits/bulk-verify

Verify visits in bulk

Verifies up to 100 of the agency's visits, each on its own, so one failing never undoes another, as the visit list's bulk action does (US-94.24). An id that is not this agency's visit is failed as not_found; a visit imported from another EVV system (US-101.9) is read-only here and is failed as imported_visit. Visits carry a lock_version, but a bulk action takes none: each visit is moved as it is when the action reaches it. Only a completed visit can be verified; one in another status is failed as invalid_transition.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json VisitBulkTransition

The visits

  • 200 What was verified object
    data object, required
    data.failed array of object, required
    Not moved: not_found (not this agency's visit), invalid_transition (its status cannot move there), exception_not_dismissed (a cancel whose open exception could not be dismissed), imported_visit (a visit imported from another EVV system, US-101.9, which is read-only here) or error (the write failed; retrying is safe).
    data.failed[].id string, required
    The record's id.
    data.failed[].reason string, required
    Why.
    data.succeeded_ids array of string, required
    Moved now.
  • default An error, in the shared envelope. Error

DELETE /api/v1/visits/{id}

Delete a visit

Soft-deletes the visit, as the web does (US-98.20): its open exceptions are dismissed and their Sandata acknowledgements queued (one that cannot be dismissed answers 422 exception_not_updated and nothing changes), and a visit Sandata holds is queued to go to Sandata as cancelled. lock_version is the one the visit was read with: a visit changed since answers 409 stale_record. A deleted visit answers 404. meta.exceptions_dismissed counts the open exceptions the delete dismissed. meta.links names what rested on the visit, which the delete leaves in place (warn, never block, US-98.32): timesheet_entries whose EVV times were pulled from it (the first 50 by date, with timesheet_entries_total) and unfrozen_months, the Work Order months its signature alone froze, read under the delete's lock. warnings says the same in words (US-116.18): visits.delete_keeps_entry_times and visits.delete_reopens_month.

Parameter In Required Description
id path yes
lock_version query yes The lock_version the record was read with: missing answers 400, changed since 409 stale_record.
  • 200 The deleted visit object
    data Visit, required
    meta object, required
    meta.exceptions_dismissed integer, required
    meta.links VisitDeleteLinks, required
    warnings array of object, required
    What the delete left resting on the visit, in words (US-116.18), beside meta.links; usually empty. Never a refusal: the visit is deleted. Each id is one of visits.delete_keeps_entry_times (one item for the timesheet entries whose EVV times came from it) and visits.delete_reopens_month (one per Work Order month its signature alone froze, open to edits again).
    warnings[].fix object
    Where it is fixed, when a page fixes it.
    warnings[].fix.label string, required
    What the link says.
    warnings[].fix.path string, required
    The app route that fixes it.
    warnings[].id string, required
    The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
    warnings[].message string, required
    For a person to read.
  • 404 Not Found, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code exception_not_updated: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/visits/{id}

Get a visit

An EVV visit: one caregiver's service to one client on one day, with its clocked, scheduled and adjusted times, its EVV attributes and its Sandata state. One visit also carries its clock calls, its changes with reason codes and who signed (never the signature image), the newest 200 of each. updated_since follows the visit's own fields; evidence added without changing them is read here.

Parameter In Required Description
id path yes
  • 200 The visit object
    data VisitDetail, required
  • 404 Code not_found: no visit with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/visits/{id}

Update a visit

Sets only the fields sent: the scheduled and adjusted times and the EVV attributes; the status moves only through /transitions. lock_version is required, and a visit changed since answers 409 stale_record. A change to adjusted_start_time or adjusted_end_time is recorded with reason_code and reason_memo, as Colorado requires; with no reason_code it is saved as OTHER and warnings says so; moving the visit (its date, times, type or group) onto another of the caregiver's visits is saved with an overlapping_visit warning. Editing what Sandata receives on a visit Sandata holds queues it to be sent again.

Parameter In Required Description
id path yes

Request body (required) application/json VisitUpdate

The fields to change

  • 200 The updated visit and its warnings VisitWriteResult
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/visits/{id}/reassign

Hand a visit to another caregiver

Gives the visit to caregiver_id, as the web's Reassign does (US-98.33), whether or not it was clocked into. The clock calls on it by anyone else stay on the visit as history (superseded_at set) and no longer count: the actual times, the status of a visit not yet verified (none counting: scheduled) and the billable hours come from the calls left, so the new caregiver clocks in on their own. A visit Sandata holds is queued to be sent again. caregiver_id must be this agency's (422 caregiver_not_found); lock_version is required (409 stale_record). warnings names the calls superseded, a caregiver who is not active, and an overlap with the new caregiver's other visits.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json VisitReassign

The caregiver

  • 200 The visit and its warnings VisitWriteResult
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code caregiver_not_found: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/visits/{id}/transitions

Move a visit's status

Moves the visit to status, as the web's status buttons do: verifying queues it for Sandata, cancelling one Sandata holds queues the cancellation, and a cancelled visit can be reopened. Cancelling dismisses the visit's open exceptions (no Sandata acknowledgement is queued for them) and reopening opens again the ones the cancel dismissed; one that cannot be updated answers 422 exception_not_updated and nothing changes. lock_version is required (409 stale_record). A move the visit cannot take answers 422 invalid_transition naming the statuses it can move to; a missing status is 400. A cancel may carry cancellation_reason (the web's pick list) and cancellation_note, kept on the visit and shown in its history; a note without a reason is 422 validation_failed.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json VisitTransition

The status

  • 200 The visit object
    data Visit, required
  • 400 Bad Request, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Codes exception_not_updated, invalid_transition, validation_failed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Work orders

POST /api/v1/assignments/{id}/work-orders/generate

Generate a month's Work Order from a Plan of Care

Lays out the month's Work Order for this assignment's client and caregiver from the client's Plan of Care and the assignment's schedule, as the Plan of Care page's Generate does. A Work Order already in that slot answers 409 work_order_exists unless overwrite is true, which replaces its days. An assignment with no schedule for the shift answers 422 no_schedule. Warnings never stop the generation.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The month and options

lrp boolean
Optional: generate the Homemaker Work Order from the client's LRP (legally responsible person) Homemaker plan instead of the regular one, as that plan's page does. Default false.
month integer, required
The month, 1 to 12.
overwrite boolean
Optional: replace the days of a Work Order already in the slot. Default false.
schedule_pattern array of integer
Optional: the weekdays the Work Order runs on, as the Work Order takes them.
service_type_override string
Optional: generate this service instead of the assignment's own; legacy is one Work Order carrying both.
shift_number integer
Optional: the shift, 1 to 4; default 1.
year integer, required
The year.
  • 201 The Work Order and its warnings object
    data WorkOrder, required
    warnings array of string, required
    What the generation found; never a refusal.
  • 409 Code work_order_exists: Conflict, as the operation's description says. Error
  • 422 Code no_schedule: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/plans-of-care/{id}/resolve-over-authorization

Trim a month's Work Orders back to a Plan of Care's authorization

For each task the client's Work Orders schedule over the plan in that month, takes visits off the largest contributor first until the total equals the authorization, as the plan page's Resolve does. target, optional, names the Work Order to trim per task (its key or plan task id); a target that cannot absorb the whole overage answers 422 residual_over_authorization and trims nothing. Answers each change; an empty list when nothing was over.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The month and an optional target

month integer, required
The month, 1 to 12.
target object
Optional: task key or plan task id => the Work Order id to trim it from.
year integer, required
The year.
  • 200 The trims made object
    data array of object, required
    data[].caregiver_id string
    The record's id.
    data[].from integer
    Visits a week before the trim.
    data[].task string
    The task's key on the plan.
    data[].task_definition_id string
    The record's id.
    data[].task_label string
    The task as the plan names it.
    data[].to integer
    Visits a week after it; 0 means the task was taken off.
    data[].work_order_id string
    The record's id.
  • 422 Code residual_over_authorization: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/plans-of-care/{id}/work-orders/distribute

Split a Plan of Care across caregivers for a month

Makes one Work Order per caregiver from the plan, each carrying the visits a week given for it, as /care-plans/:id/generate-work-orders does. frequencies maps each caregiver id to plan task ids (from GET /plans-of-care/{id}) and visits a week; a caregiver whose counts are all 0 gets none. A split over the authorization is saved, with a warning. A plan task id the plan no longer carries answers 409 plan_changed and writes nothing.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The month and the split

month integer, required
The month, 1 to 12.
selections array of object, required
One per service and shift being generated.
selections[].frequencies object, required
caregiver id => plan task id => visits a week. A caregiver whose counts are all 0 gets no Work Order.
selections[].service_type string, required
The service.
selections[].shift_number integer
Optional: the shift, 1 to 4; default 1.
year integer, required
The year.
  • 201 The Work Orders made and the warnings object
    data array of WorkOrder, required
    services array of object, required
    Per service the plan authorizes, as the Generate Work Orders page's totals show it: authorized_minutes and task_minutes a week, and rounding, quarter_hour when the tasks come to less than the authorization by under 15 minutes (the calculator rounds them up to the next quarter hour), under when by 15 minutes or more, else null.
    services[].authorized_minutes integer, required
    services[].rounding string, required
    services[].service string, required
    services[].task_minutes integer, required
    shift_plan_work_orders array of object, required
    The Work Orders the client's Shift Plan made that are in force in the month, each with its shift_id, so a month made here as well as there shows; empty when the client has no Shift Plan. Never a refusal.
    shift_plan_work_orders[].caregiver object, required
    The Work Order's caregiver; null when it has none.
    shift_plan_work_orders[].caregiver.first_name string
    shift_plan_work_orders[].caregiver.id string
    The record's id.
    shift_plan_work_orders[].caregiver.last_name string
    shift_plan_work_orders[].closing_date string, required
    Its Closing Date; null while it stays open.
    shift_plan_work_orders[].effective_date string, required
    Its Effective Date.
    shift_plan_work_orders[].id string, required
    The record's id.
    shift_plan_work_orders[].number integer, required
    The Work Order's WO #.
    shift_plan_work_orders[].service string, required
    The Work Order's service.
    shift_plan_work_orders[].shift_id string
    The Shift Plan's shift that made it; only on a Work Order the plan made.
    warnings array of object, required
    What the distribution found, each with a code: over_authorized (tasks this split puts over the plan), already_over_authorized (tasks over before it), plan_outside_month (the plan's dates do not reach the month, naming a plan that does), existing_work_orders (caregivers skipped because they already have the month's Work Order, named), not_on_work_orders (plan tasks no Work Order could carry). The Work Orders are made regardless.
    warnings[].code string, required
  • 409 Code plan_changed: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/provider-type-templates/{id}/certification

Change a provider type's certification

Saves the English certification its cards print and its translation into the agency's card language, as Settings > Provider Type Templates does. certification_version is the one GET /api/v1/provider-type-modifiers returned: one saved since answers 409 stale_record. The first save on a system default makes the agency's own copy, which answers with its own id. Needs agency_settings.manage (403 forbidden otherwise).

Parameter In Required Description
id path yes

Request body (required) application/json object

The wording and the version read

certification_text string
English; empty for the standard wording.
certification_version string, required
As GET /api/v1/provider-type-modifiers (find_provider_type_modifiers) returned it.
translation string
Optional: into the agency's card language.
  • 200 The certification object
    data object, required
    data.certification_text string
    data.certification_translations object
    data.certification_version string
    data.code string
    data.id string
    The record's id.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/work-orders

List work orders

What was ordered for one client, caregiver and month. The agency's work orders in month order, newest month first, archived ones left out. With updated_since the order is change order, for a sync that pages with after_id.

Parameter In Required Description
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
status query no Only records with this status.
client_id query no Only records of this client.
caregiver_id query no Only records of this caregiver.
updated_since query no Only records changed at or after this instant (ISO 8601, with an offset), compared to the second. The list is then in change order: updated_at, then id.
after_id query no With updated_since, a cursor: send the last record's updated_at as updated_since and its id as after_id to get the next page. Use this, not offset, to sync: an offset skips a record when an earlier one changes between two requests. The sync is at least once: timestamps are whole seconds and set before commit, so a record changed in the cursor's second, or committed late, can fall behind the cursor. Start each sync pass a minute before the newest updated_at you saw, and treat every record returned as current: apply it over what you hold. A record can change twice within one second, and not every change moves lock_version, so the same updated_at and lock_version do not mean the same content.
wo_type query no Only Work Orders of this type.
expires_within_days query no Only Work Orders whose end date (expires_on) falls within this many days of today, and not closed before today.
  • 200 A page of work orders object
    data array of WorkOrder, required
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    total integer, required
    Every matching row.
  • 400 Code bad_request: a malformed limit, offset, search, updated_since, after_id or filter, named in the message. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders

Create a work order

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.

Request body (required) application/json WorkOrderCreate

The work order's fields

  • 201 The created work order object
    data WorkOrder, required
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

GET /api/v1/work-orders/{id}

Get a work order

What was ordered for one client, caregiver and month.

Parameter In Required Description
id path yes
  • 200 The work order object
    data WorkOrder, required
  • 404 Code not_found: no work order with that id in this agency, including another agency's. Error
  • default An error, in the shared envelope. Error

PATCH /api/v1/work-orders/{id}

Update a work order

Sets only the fields sent. lock_version is required: send the value you read, and a record changed since answers 409 stale_record. A completed or archived work order is not edited through the API: any PATCH to one answers 422 not_editable.

Parameter In Required Description
id path yes

Request body (required) application/json WorkOrderUpdate

The fields to change

  • 200 The updated work order object
    data WorkOrder, required
  • 404 Code not_found: no work order with that id in this agency, including another agency's. Error
  • 409 Code stale_record: the work order changed since the lock_version sent was read, or while this request ran. Nothing was saved; read it again and retry. Error
  • 422 Code validation_failed: a field was refused; details names each field and why. Nothing was saved. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/archive

Archive a Work Order

Archives it, in any status, as the page does. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Its lock_version

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 200 The Work Order object
    data WorkOrder, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/change-caregiver

Give a Work Order to another caregiver

As the page's Change caregiver does: from the Effective Date or earlier, a copy for caregiver_id with the same schedule, tasks and Care Instructions takes its place and this Work Order is archived (a month a timesheet or signature froze keeps its row); from a later date, this Work Order closes the day before and the copy starts on from. It needs work_orders.manage (403 forbidden). The same caregiver answers 422 same_caregiver, an archived Work Order 422 work_order_archived, a caregiver not of this agency 422 validation_failed. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record. Answers the new Work Order's first month and the warnings the change found. Saved at once: send an Idempotency-Key so a retry makes no second copy.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The caregiver, the start date and lock_version

caregiver_id string, required
The caregiver who takes over.
from string, required
The first day the new caregiver works it, YYYY-MM-DD. On or before the Effective Date the whole Work Order moves and this one is archived; later, this one closes the day before.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 201 The new Work Order object
    data WorkOrder, required
    warnings array of object
    What the change found (an overlap, a month kept); never holds it.
    warnings[].kind string, required
    What was found.
    warnings[].message string, required
    The page's words for it.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Codes same_caregiver, validation_failed, work_order_archived: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/close-document

Generate a Work Order's close document

Snapshots a completed Work Order's hours, billing and close details. An in-progress one answers 422 not_completed; one that has a close document 422 close_document_exists.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 201 The close document object
    data CloseDocument, required
  • 422 Codes close_document_exists, not_completed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/work-orders/{id}/days/{date}

Mark a date of a Work Order's month worked or not

shaded false marks the date not worked, clearing its visits and marks; true marks it worked again from the plan, as the timesheet page does. A date with recorded work answers 422 recorded_work naming it unless confirm is true; a frozen month 422 frozen; a date changed since seen 409 stale_record.

Parameter In Required Description
id path yes
date path yes

Request body (required) application/json object

The change

confirm boolean
Optional: mark a date with recorded work not worked.
seen string
The date's value from seen_by_date on GET /api/v1/work-orders/{id} (the get_work_order tool answers it too), to refuse a date changed since that read.
shaded boolean, required
true worked, false not worked.
  • 200 The Work Order object
    data WorkOrder, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code recorded_work: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/dismiss-guidance

Dismiss a Work Order's Getting Started guidance

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 200 The Work Order object
    data WorkOrder, required
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/dismiss-warnings

Dismiss a Work Order's generation warnings

Clears the warnings generating it found, as the page does once they are read. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Its lock_version

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 200 The Work Order object
    data WorkOrder, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/duplicate

Duplicate a Work Order

Two forms. Without mode: copies it into the month after it, or into month and year when both are sent, with its tasks and weekly pattern; a live Work Order already holding that month's slot answers 409 slot_taken naming its WO #. With mode (US-102.35): makes a new standing Work Order from this one, with the next WO #, as the page's Duplicate does: keep_both, close_previous (this Work Order is closed at closing_date in the same write; it needs the lock_version the Work Order was read with, and one changed since answers 409 stale_record) or temporary, for client_id and caregiver_id when sent. Every form needs work_orders.manage (403 forbidden). A choice the page refuses (a missing date, a Closing Date before this Work Order's Effective Date) answers 422 duplicate_refused in its words, a close of an archived Work Order 422 work_order_archived, a client or caregiver not of this agency 422 validation_failed. A field another mode takes is 400. Answers the copy's first month and the warnings the copy and the close found. Saved at once: send an Idempotency-Key so a retry makes no second copy. Mixing the two forms' fields is 400.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body application/json object

The target month, or the mode and its dates

caregiver_id string
With mode: the copy's caregiver, this agency's; this Work Order's when not sent.
client_id string
With mode: the copy's client, this agency's; this Work Order's when not sent.
closing_date string
close_previous: this Work Order's Closing Date; the day before effective_date when not sent, as the page's dialog fills it in. Refused before this Work Order's own Effective Date.
effective_date string
keep_both and close_previous, which need it: the copy's Effective Date.
lock_version integer
With mode: the lock_version this Work Order was read with. close_previous needs it, since it closes this Work Order: one changed since answers 409 stale_record, as a second close from the page is refused. Checked when sent with the other modes.
mode string
Makes a new standing Work Order as the page's Duplicate does: keep_both keeps this one as it is; close_previous closes it at closing_date; temporary makes a copy that runs temporary_from to temporary_to. Not with month or year.
month integer
Target month; send with year.
temporary_from string
temporary, which needs it: the copy's first day.
temporary_to string
temporary, which needs it: the copy's last day.
year integer
Target year; send with month.
  • 201 The new Work Order object
    data WorkOrder, required
    warnings array of object
    With mode: what the copy and the close found (an overlap with another of the caregiver's Work Orders, a month kept), which never holds the copy.
    warnings[].kind string, required
    What was found.
    warnings[].message string, required
    The page's words for it.
  • 400 Bad Request, as the operation's description says. Error
  • 403 Forbidden, as the operation's description says. Error
  • 409 Codes slot_taken, stale_record: Conflict, as the operation's description says. Error
  • 422 Codes duplicate_refused, validation_failed, work_order_archived: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/fill-from-care-logs Deprecated

Deprecated: list a Work Order's delivered days (formerly Fill from care logs)

Deprecated (US-118.17): writes nothing. A Work Order's delivered days now come straight from its care logs, so there is nothing to fill or keep in step. Answers the dates of the month the assembled month has a delivery on, in unchanged, with filled, updated, differences and flagged empty, and leaves lock_version as sent, so a retry at the same version answers the same. A Work Order that is not in progress still answers 422 not_editable. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record. Deprecated on 2026-11-16; from 00:00 UTC on 2027-05-16 it answers 410 Gone. See /developers/changelog.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Its lock_version

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 200 The delivered days object
    data object, required
    data.differences array of object, required
    Always empty: the fill writes nothing (US-118.17).
    data.differences[].date string
    data.differences[].reason string
    data.filled array of string, required
    Always empty: the fill writes nothing (US-118.17).
    data.flagged array of object, required
    Always empty: the fill writes nothing (US-118.17).
    data.flagged[].date string
    data.flagged[].reason string
    data.unchanged array of string, required
    Every date of the month with a delivery (a live care log the Work Order holds), each once, in order.
    data.updated array of string, required
    Always empty: the fill writes nothing (US-118.17).
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 410 Gone, as the operation's description says. Error
  • 422 Code not_editable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/fill-from-evv Deprecated

Deprecated: list a Work Order's delivered days (formerly Fill from EVV)

Deprecated (US-118.17): writes nothing. A Work Order's delivered days now come straight from its care logs, so there is nothing to fill or keep in step. Answers the dates of the month the assembled month has a delivery on, in unchanged, with filled, updated, differences and flagged empty, and leaves lock_version as sent, so a retry at the same version answers the same. A Work Order that is not in progress still answers 422 not_editable. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record. Deprecated on 2026-11-16; from 00:00 UTC on 2027-05-16 it answers 410 Gone. See /developers/changelog.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Its lock_version

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 200 The delivered days object
    data object, required
    data.differences array of object, required
    Always empty: the fill writes nothing (US-118.17).
    data.differences[].date string
    data.differences[].entry_id string
    The record's id.
    data.differences[].entry_time_in string
    HH:MM:SS, Mountain.
    data.differences[].entry_time_out string
    HH:MM:SS, Mountain.
    data.differences[].visit_clock_in string
    The visit's clock-in (UTC).
    data.differences[].visit_clock_out string
    The visit's clock-out (UTC).
    data.differences[].visit_id string
    The record's id.
    data.filled array of string, required
    Always empty: the fill writes nothing (US-118.17).
    data.flagged array of object, required
    Always empty: the fill writes nothing (US-118.17).
    data.flagged[].date string
    data.flagged[].reason string
    data.unchanged array of string, required
    Every date of the month with a delivery (a live care log the Work Order holds), each once, in order.
    data.updated array of string, required
    Always empty: the fill writes nothing (US-118.17).
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 410 Gone, as the operation's description says. Error
  • 422 Code not_editable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/paper-signatures

Flip a Work Order's paper-signatures mark

Marks the paper Time & Services card collected, or unmarks it when it was, as the page's toggle does. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Its lock_version

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 200 The Work Order object
    data WorkOrder, required
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

GET /api/v1/work-orders/{id}/plan

A Work Order's weekly plan

The plan in force today of the Work Order this month row belongs to, as the Work Order page shows its grid: each weekday's visits and each task line with its minutes and per-weekday counts. lock_version is what a change sends back.

Parameter In Required Description
id path yes
  • 200 The plan object
    data object, required
    data.lines array of object, required
    data.lines[].minutes integer
    Minutes each time (the line's Min/Task).
    data.lines[].notes string
    The line's notes.
    data.lines[].task_definition_id string, required
    The record's id.
    data.lines[].weekday_counts array of integer
    Times on each weekday, Monday first.
    data.lock_version integer, required
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.slot_days object, required
    Weekday, 1 (Monday) to 7, to its visits in order.
    data.work_order_id string, required
    The record's id.
  • default An error, in the shared envelope. Error

PATCH /api/v1/work-orders/{id}/plan

Change a Work Order's weekly plan

Writes the weekdays and lines sent into the plan in force today, as the Work Order page saves its grid, then lays the change onto every open month. A weekday sent replaces that day's visits ([] clears it); a line sent replaces that task's line; drop_lines removes lines. lock_version is the plan's as read: a plan changed since answers 409 stale_record, unless it already holds what is sent, which answers 200 with nothing written. A task definition that is not the agency's answers 422 unknown_task_definition. frozen_months names months that keep their schedule (a returned timesheet, a sent claim).

Parameter In Required Description
id path yes

Request body (required) application/json object

The days and lines to write

drop_lines array of string
Task definition ids whose lines to remove.
lines array of object
Task lines: task_definition_id, minutes, weekday_counts (seven, Monday first), notes.
lines[].minutes integer
Minutes each time (the line's Min/Task).
lines[].notes string
The line's notes.
lines[].task_definition_id string, required
The record's id.
lines[].weekday_counts array of integer
Times on each weekday, Monday first.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
slot_days object
Weekday 1 (Monday) to 7 => its visits, each time_in and time_out (HH:MM:SS); [] clears the day.
  • 200 The plan as saved object
    data object, required
    data.lines array of object, required
    data.lines[].minutes integer
    Minutes each time (the line's Min/Task).
    data.lines[].notes string
    The line's notes.
    data.lines[].task_definition_id string, required
    The record's id.
    data.lines[].weekday_counts array of integer
    Times on each weekday, Monday first.
    data.lock_version integer, required
    Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
    data.slot_days object, required
    Weekday, 1 (Monday) to 7, to its visits in order.
    data.work_order_id string, required
    The record's id.
    frozen_months array of object
    warnings array of object
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code unknown_task_definition: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/reopen

Reopen a completed Work Order

Moves a completed Work Order back to in progress, clearing its close details, as the page does. An in-progress one answers 422 not_completed; a replacement holding its slot 409 slot_taken. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Its lock_version

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 200 The Work Order object
    data WorkOrder, required
  • 409 Codes slot_taken, stale_record: Conflict, as the operation's description says. Error
  • 422 Code not_completed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/signatures

Sign a Work Order

Records one signature (client, provider, supervisor_designee or supervisor) on a completed Work Order, dated date or today, as the page's signature pad does. An in-progress one answers 422 not_completed. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record. An agency API key answers 403 signature_requires_person: a key is not a person and signs nothing; a member signs in the web app or through an AI app they connected.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The signature

date string
The signature date, YYYY-MM-DD: today when left out or null.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
signature string, required
The signature as the pad saves it: a base64 PNG of at most 50 KB, with or without a data:image/png;base64, prefix.
signature_type string, required
Whose signature.
  • 200 The Work Order object
    data WorkOrder, required
  • 403 Code signature_requires_person: Forbidden, as the operation's description says. Error
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • 422 Code not_completed: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

PUT /api/v1/work-orders/{id}/tasks/{task_definition_id}/days/{date}

Mark a task done, not done or untouched on a date

Records what the caregiver says about a task on one date, as the caregiver app does, on that day's care log (the Work Order's client, caregiver, service and shift; drafted when the day has none): true done, false not done, null clears the mark. The answer is the care log's mark. Needs timesheets.manage (403 forbidden otherwise). A day on a submitted, approved or exported Returned Timesheet answers 409 frozen; a signed care log 409 record_locked; a completed or archived Work Order 422 not_editable; a date outside its month 422 date_out_of_range.

Parameter In Required Description
id path yes
task_definition_id path yes
date path yes

Request body (required) application/json object

The mark

completed boolean, required
true done, false not done, null untouched.
  • 200 The task's mark object
    data object, required
    data.completed boolean
    data.count integer
    Times that day.
    data.date string
    data.id string
    The record's id.
    data.notes string
    data.task_definition_id string
    The record's id.
    data.warnings array of object
    Dismissible warnings the day's care log raised on this write (a weekly or daily limit, a day a submitted Returned Timesheet missed), each with code and message. Absent for a combined Work Order.
    data.warnings[].code string
    data.warnings[].message string
    data.warnings[].task_definition_id string
    data.work_order_id string
    The record's id.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Code record_locked: Conflict, as the operation's description says. Error
  • 422 Codes date_out_of_range, not_editable: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/timesheet

Generate a Work Order's caregiver report

Writes the timesheet of a completed Work Order from its days and tasks, as the Work Order page's Generate timesheet does. One that is not completed answers 422 work_order_not_ready, one with no hours 422 hours_not_verified, and one that has a report 409 timesheet_exists.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 201 The caregiver report object
    data Timesheet, required
  • 409 Code timesheet_exists: Conflict, as the operation's description says. Error
  • 422 Codes hours_not_verified, work_order_not_ready: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/timesheet/overwrite

Write a Work Order's caregiver report again

Writes the timesheet of a completed Work Order again from its days and tasks as they are now, as the Work Order page's Overwrite does: the report on file, and the month's assignment reports billing the same hours, are deleted and a new one is written (with none on file, one is generated). A report with a claim on a live batch answers 409 has_claims, naming how many claims by status and the reports carrying them, and nothing changes; one with entries typed from the card 409 entries_typed. A Work Order that is not completed answers 422 work_order_not_ready.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes
  • 201 The new caregiver report object
    data Timesheet, required
  • 409 Codes entries_typed, has_claims: Conflict, as the operation's description says. Error
  • 422 Code work_order_not_ready: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/transition

Change a Work Order's status

Moves it to status, as the page's status control does. Completing one writes the caregiver report, or finds the one on file, and timesheet says which; a Work Order with no verified hours still completes. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The new status

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
status string, required
The new status.
  • 200 The Work Order and the caregiver report outcome object
    data WorkOrder, required
    timesheet object, required
    timesheet.outcome string
    timesheet.reason string
    Why none was written.
    timesheet.timesheet_id string
    The caregiver report.
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/unarchive

Unarchive a Work Order

Puts an archived Work Order back. A replacement already holding its slot answers 409 slot_taken naming its WO #. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Its lock_version

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 200 The Work Order object
    data WorkOrder, required
  • 409 Codes slot_taken, stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/unplanned-tasks

Record a task done that the plan did not hold

Adds a task done on a date that the Work Order's plan did not put there, as the caregiver app does, on that day's care log with the notes as its reason. Needs timesheets.manage (403 forbidden otherwise); a day on a submitted, approved or exported Returned Timesheet answers 409 frozen. A task_definition_id the agency cannot use (not a UUID, unknown, or another agency's; the system definitions it can see are accepted) answers 422 unknown_task_definition; a date outside the Work Order's month 422 date_out_of_range; a completed or archived Work Order 422 not_editable.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

The task

date string, required
The date, YYYY-MM-DD.
notes string
Optional notes.
task_definition_id string, required
The task's definition id.
  • 201 The task's mark object
    data object, required
    data.completed boolean
    data.count integer
    Times that day.
    data.date string
    data.id string
    The record's id.
    data.notes string
    data.task_definition_id string
    The record's id.
    data.warnings array of object
    Dismissible warnings the day's care log raised on this write (a weekly or daily limit, a day a submitted Returned Timesheet missed), each with code and message. Absent for a combined Work Order.
    data.warnings[].code string
    data.warnings[].message string
    data.warnings[].task_definition_id string
    data.work_order_id string
    The record's id.
  • 403 Forbidden, as the operation's description says. Error
  • 409 Conflict, as the operation's description says. Error
  • 422 Codes date_out_of_range, not_editable, unknown_task_definition: Unprocessable Content, as the operation's description says. Error
  • default An error, in the shared envelope. Error

POST /api/v1/work-orders/{id}/verify-for-billing

Verify a Work Order's hours for billing

Sets its verified hours, first and second half: the hours of the month's caregiver report when one is on file (the returned card billing reads), else the hours its days in the month carry. Completes it when it is in progress, writing the caregiver report or finding the one on file, as the timesheet page's Verify hours does. timesheet says what happened to the report and completion whether this call completed it. A Work Order with no hours still verifies; timesheet then answers none with the reason. lock_version is the one the Work Order was read with: a Work Order changed since answers 409 stale_record.

Parameter In Required Description
Idempotency-Key header yes 1-255 printable ASCII characters, unique per intended write and scoped to the API key sending it. A retry with the same key and the same request (method, path, query string and body) replays the first answer; the same key with any other request is 422. While the first request is still running, a retry is 409: wait and retry. An answer that says nothing persisted leaves the key free, so a retry with it runs again: a 503 with Retry-After, a 500 for a failure on our side that changed nothing (a file store refusal, an audit record that could not be written), and a 410 file_missing. Keys bind for 24 hours.
id path yes

Request body (required) application/json object

Its lock_version

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
  • 200 The Work Order, the caregiver report outcome and the completion object
    completion string, required
    completed_now when this call completed the Work Order; already_complete when it was.
    data WorkOrder, required
    timesheet object, required
    timesheet.outcome string
    timesheet.reason string
    Why none was written.
    timesheet.timesheet_id string
    The caregiver report.
  • 409 Code stale_record: Conflict, as the operation's description says. Error
  • default An error, in the shared envelope. Error

Workforce

GET /api/v1/reports/workforce

Read the DCW Workforce Report of a period

US-74.8: for HCPF's Base Wage Attestation and Workforce Reporting, each Direct Care Worker's hours, lowest wage in force, four-week average hours, members served and counties per primary service, from the period's worked EVV visits and approved or exported timesheets (a day with a worked visit is counted from the visit only), ordered by the caregiver's name and paged. A row with missing data is kept: missing names the blank cells. from and to are required, at most a year apart.

Parameter In Required Description
from query yes The period's first day, YYYY-MM-DD.
to query yes The period's last day, YYYY-MM-DD.
limit query no Rows per page (default 100, at most 200; a larger value is served as 200).
offset query no Rows to skip.
  • 200 A page of the DCW Workforce Report object
    data array of WorkforceReportRow, required
    from string, required
    The period's first day.
    limit integer, required
    Rows asked for (default 100); a larger request is served 200.
    offset integer, required
    Rows skipped.
    to string, required
    The period's last day.
    total integer, required
    Every matching row.
  • default An error, in the shared envelope. Error

Versioning

The version is in the path. Breaking changes ship only under a new major path (/api/v2); /api/v1 keeps working as it is documented here. Every response carries hcb-api-version.

Additive changes can ship in version 1 at any time: new fields, new endpoints, new optional parameters and new webhook event types. Ignore fields and event types you do not recognize rather than failing on them.

An operation that is going away is announced at least six months before its sunset, in the changelog and on the response itself: a deprecated operation answers with a Deprecation header (the date it was deprecated), a Sunset header (the date it stops answering) and a Link header to the changelog with rel="deprecation". It is also marked deprecated in openapi.json and on this page. From 00:00 UTC on the Sunset date, the operation answers 410 Gone for a while, then 404 once it is removed from the API; treat either as the operation being gone.

Webhooks

A member who holds Agency settings → Manage registers an https endpoint in Settings, Webhooks, and chooses its events: batch.accepted, batch.rejected, remittance.posted, claim.denied, visit.verified, claim.denial_withdrawn and caregiver.credential_expiring. Each is a JSON POST of id (the event id), type, created_at and data, which holds ids and statuses only: read the details with an agency API key.

claim.denial_withdrawn is sent when someone at the agency undoes the attribution that denied a claim, and only to an endpoint whose claim.denied for that claim was delivered. Its data is the denial's claim_id, batch_id, response_id and payment_status_code, plus withdrawn_event_id, the id of the claim.denied it withdraws. A withdrawal and a later denial of another claim are separate events with no promised order: match them by claim and event id.

caregiver.credential_expiring is sent once when a caregiver's dated credential enters its month window (8 to 30 days left) and once when it enters its week window (7 days or fewer), found by a weekly run, whether or not the caregiver can receive texts. Its data is caregiver_id, credential (criminal_background_expiry, dora_expiry, caps_expiry, driver_license_expiry or main_training_expiry), expires_on and lead (month or week). A renewed credential, with a new expiry date, is announced afresh.

Verify every delivery. The HCB-Signature header is t=<unix seconds>,v1=<hex>, where v1 is HMAC-SHA256, keyed with the endpoint's signing secret exactly as it was shown (its text, not base64-decoded), of t, a period, and the raw request body. Compute it over the exact bytes received, compare in constant time, and refuse a t more than 5 minutes from your clock.

Answer with any 2xx within 10 seconds. Anything else is retried with backoff for 24 hours. A delivery can arrive more than once (a lost acknowledgement is retried), so treat HCB-Event-Id as the key and ignore one you have already handled.

Schemas

AccountSidSet

masked string, required
Its last four characters, as ****1234; empty when none.
set boolean, required
Whether an Account SID is saved.

AdpSettings

adp_batch_description string, required
The batch description; null clears it.
adp_co_code string, required
The ADP company code; null clears it.
adp_earning_code_map object, required
Attendant hours to an ADP Hours column, as the tab's JSON; an empty object leaves the column out.
biweekly_anchor_date string, required
The first day of any one biweekly pay period, such as 2026-10-02: biweekly periods run every 14 days from it, across month ends. Read only while pay_period_frequency is biweekly; null starts each month's periods on the 1st. Exports already made keep their dates.
cash_advance_in_adp_run boolean, required
Whether the ADP Run file deducts each caregiver's cash advance as a negative Misc Amount.
daily_overtime_enabled boolean, required
Whether daily overtime is reported.
default_attendant_pay_rate string, required
The attendant hourly rate, such as 18.50: above zero, two decimals; null clears it.
holiday_pay_rate string, required
The holiday hourly rate: above zero, two decimals; null clears it.
mileage_pay_rate string, required
The rate per mile, such as 0.67: above zero, two decimals; null clears it.
pay_period_frequency string, required
The pay period.

AdpSettingsUpdate

adp_batch_description string
The batch description; null clears it.
adp_co_code string
The ADP company code; null clears it.
adp_earning_code_map object
Attendant hours to an ADP Hours column, as the tab's JSON; an empty object leaves the column out.
biweekly_anchor_date string
The first day of any one biweekly pay period, such as 2026-10-02: biweekly periods run every 14 days from it, across month ends. Read only while pay_period_frequency is biweekly; null starts each month's periods on the 1st. Exports already made keep their dates.
cash_advance_in_adp_run boolean
Whether the ADP Run file deducts each caregiver's cash advance as a negative Misc Amount.
daily_overtime_enabled boolean
Whether daily overtime is reported.
default_attendant_pay_rate string
The attendant hourly rate, such as 18.50: above zero, two decimals; null clears it.
holiday_pay_rate string
The holiday hourly rate: above zero, two decimals; null clears it.
mileage_pay_rate string
The rate per mile, such as 0.67: above zero, two decimals; null clears it.
pay_period_frequency string
The pay period.

AgencyApiKey

created_at string
When it was created (UTC).
created_by_id string
The admin who created it.
id string, required
The record's id.
last_used_at string
Its last request (UTC).
name string, required
The key's name.
revoked_at string
When it was revoked (UTC).
role string, required
What the key may do.

AgencyApiKeyCreate

name string, required
A name for the integration.
role string, required
What the key may do.

AgencyApiKeyCreated

data object, required
data.created_at string
When it was created (UTC).
data.created_by_id string
The admin who created it.
data.id string, required
The record's id.
data.last_used_at string
Its last request (UTC).
data.name string, required
The key's name.
data.revoked_at string
When it was revoked (UTC).
data.role string, required
What the key may do.
secret string, required
The secret, shown this once.

AgencyApiKeyPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].created_at string
When it was created (UTC).
data[].created_by_id string
The admin who created it.
data[].id string, required
The record's id.
data[].last_used_at string
Its last request (UTC).
data[].name string, required
The key's name.
data[].revoked_at string
When it was revoked (UTC).
data[].role string, required
What the key may do.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

AgencyInvitation

email string, required
Who was invited.
expires_at string
When the link stops working (UTC).
id string, required
The record's id.
invited_at string
When it was sent (UTC).
invited_by_id string
The member who invited.
role string, required
The role they join with.
status string, required
Where it stands.

AgencyInvitationCreate

email string, required
Their email address.
role string, required
The role they join with.

AgencyInvitationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].email string, required
Who was invited.
data[].expires_at string
When the link stops working (UTC).
data[].id string, required
The record's id.
data[].invited_at string
When it was sent (UTC).
data[].invited_by_id string
The member who invited.
data[].role string, required
The role they join with.
data[].status string, required
Where it stands.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

AgencyMember

email string, required
Their sign-in email.
id string, required
The member's user id.
joined_at string
When they joined (UTC).
last_seen_at string
When they last signed in here (UTC).
name string
Their display name; null shows the email.
role string, required
Their role in this agency.
status string, required
Whether they may sign in here.

AgencyMemberPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].email string, required
Their sign-in email.
data[].id string, required
The member's user id.
data[].joined_at string
When they joined (UTC).
data[].last_seen_at string
When they last signed in here (UTC).
data[].name string
Their display name; null shows the email.
data[].role string, required
Their role in this agency.
data[].status string, required
Whether they may sign in here.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

AgencyMemberUpdate

name string
Their display name; null or blank clears it, showing the email.
role string
Their role.

AgencyProfile

The agency's identity, address and claim defaults. Changing them needs agency_settings.manage.

address_line1 string
Street address.
address_line2 string
Suite or unit.
city string
City.
default_diagnosis_code string
The default primary diagnosis code (ICD-10) for new claims.
default_place_of_service string
The default place of service code for new claims.
default_procedure_codes object
The procedure code (billing code, then its modifiers) each service's generated Work Orders bill under when the client has no billing assignment and the Plan of Care names no code (US-107.4). Keys personal_care and homemaker only. Sending it replaces the whole object: a service left out or blank has no default, and {} clears both.
default_procedure_codes.homemaker string
The Homemaker code, such as "S5130 U2".
default_procedure_codes.personal_care string
The Personal Care code, such as "T1019 U2".
default_rendering_npi string
The default Medicaid provider (location) id claims carry as rendering provider.
emergency_phone string
The number a caregiver calls in an emergency, printed on the emergency form and wallet card; the main phone prints while it is empty.
fax string
Fax number.
name string, required
The agency's name, as claims and printed forms carry it.
npi string
The agency's 10-digit NPI.
open_shifts OpenShiftSettings
phone string
Phone number.
state string
Two-letter state code.
tax_id string
The agency's Tax ID, NN-NNNNNNN.
week_start_day string
The day the agency's printed weeks start on.
work_order_print_certification boolean
Whether a printed Work Order carries the notice, certification and signature lines (US-102.30); on unless the agency turns it off.
zip string
ZIP code, 5 or 9 digits.

AgencyProfileUpdate

The profile fields to change; a field left out keeps its value. The agency has no lock_version: the update sets only what it sends.

address_line1 string
Street address.
address_line2 string
Suite or unit.
city string
City.
default_diagnosis_code string
The default primary diagnosis code (ICD-10) for new claims; cannot be cleared.
default_place_of_service string
The default place of service code for new claims; cannot be cleared.
default_procedure_codes object
The procedure code (billing code, then its modifiers) each service's generated Work Orders bill under when the client has no billing assignment and the Plan of Care names no code (US-107.4). Keys personal_care and homemaker only. Sending it replaces the whole object: a service left out or blank has no default, and {} clears both.
default_procedure_codes.homemaker string
The Homemaker code, such as "S5130 U2".
default_procedure_codes.personal_care string
The Personal Care code, such as "T1019 U2".
default_rendering_npi string
The default Medicaid provider (location) id claims carry as rendering provider.
emergency_phone string
The number a caregiver calls in an emergency, printed on the emergency form and wallet card; the main phone prints while it is empty.
fax string
Fax number.
name string
The agency's name, as claims and printed forms carry it.
npi string
The agency's 10-digit NPI.
open_shifts OpenShiftSettings
phone string
Phone number.
state string
Two-letter state code.
tax_id string
The agency's Tax ID, NN-NNNNNNN.
week_start_day string
The day the agency's printed weeks start on.
work_order_print_certification boolean
Whether a printed Work Order carries the notice, certification and signature lines (US-102.30); on unless the agency turns it off.
zip string
ZIP code, 5 or 9 digits.

Agenda

What the agency needs to deal with on one day: reminders due that day, reminders already overdue, client and caregiver birthdays, and the billing work waiting.

billing object, required
The billing work waiting, for the day's month. Work orders and batches are null for a caller whose roles do not grant billing.view.
billing.batches_ready_to_submit integer, required
billing.timesheets_awaiting_approval integer, required
billing.work_orders_ready_to_bill integer, required
birthdays array of AgendaBirthday, required
caregiver_birthdays array of AgendaCaregiverBirthday, required
date string, required
The agenda's day (Mountain time).
due_today object, required
Open reminders due on the day, morning to evening, untimed ones last; due_today_offset reads past the first page.
due_today.events array of Reminder, required
due_today.limit integer, required
The most events one answer holds (100).
due_today.offset integer, required
How many were skipped.
due_today.total integer, required
How many there are in all.
due_today.truncated boolean, required
True when there are more than events holds; read on with the offset.
overdue object, required
Open reminders due before the day, most recently missed first; overdue_offset reads past the first page.
overdue.events array of Reminder, required
overdue.limit integer, required
The most events one answer holds (100).
overdue.offset integer, required
How many were skipped.
overdue.total integer, required
How many there are in all.
overdue.truncated boolean, required
True when there are more than events holds; read on with the offset.

AgendaBirthday

A client whose birthday falls on the agenda's day, as the Today page and the daily digest show it. Sample clients are left out.

client_first_name string
The client's first name.
client_id string, required
The client.
client_last_name string
The client's last name.
date string, required
The agenda's day.
title string
The agenda line, e.g. "Jane Doe's Birthday (age 82)".

AgendaCaregiverBirthday

An active caregiver whose birthday falls on the agenda's day, as the Today page and the daily digest show it. Sample caregivers are left out.

caregiver_first_name string
The caregiver's first name.
caregiver_id string, required
The caregiver.
caregiver_last_name string
The caregiver's last name.
date string, required
The agenda's day.
title string
The agenda line, e.g. "Jane Doe's Birthday (caregiver, age 41)".

Assignment

A caregiver serving a client, under one billing code.

billing_code string
The HCPCS code billed for the service.
caregiver_id string, required
The caregiver serving.
client_id string, required
The client served.
effective_date string
end_date string
evv_exemption_date string
evv_exemption_on_file boolean
id string, required
The record's id.
inserted_at string
When the record was created.
live_in boolean
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
modifiers array of string
Billing code modifiers.
provider_type string
relative_provider boolean
The caregiver is a relative of the client.
status string, required
updated_at string
When the record last changed.
work_order_number string
The work order number the office typed on the assignment.

AssignmentCreate

A new assignment. The client and caregiver must be active members of the agency, and the pair must not already have an open assignment for the provider type.

billing_code string, required
The HCPCS code billed for the service.
caregiver_id string, required
The caregiver serving.
client_id string, required
The client served.
effective_date string, required
end_date string
evv_exemption_date string
evv_exemption_on_file boolean
live_in boolean
modifiers array of string
Billing code modifiers.
notes string
Free text; written, never returned.
provider_type string, required
relative_provider boolean
The caregiver is a relative of the client.
work_order_number string
The work order number the office typed on the assignment.

AssignmentPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Assignment, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

AssignmentSchedule

assignment_id string, required
The assignment.
lock_version integer, required
The assignment's lock_version, which the next schedule save sends.
shifts array of object, required
Each shift that has days, in shift order.
shifts[].days array of object, required
shifts[].days[].day_of_week string, required
shifts[].days[].end_time string, required
shifts[].days[].ends_next_day boolean, required
The shift ends after midnight, on the next day.
shifts[].days[].hours string
The day's hours, a decimal.
shifts[].days[].start_time string, required
shifts[].days[].work_order_number string
The WO # of the Work Order that places this day ("12"); null on a day the office entered. A save that sends a placed day back unchanged writes nothing for it.
shifts[].shift_number integer, required

AssignmentScheduleSave

days array of object, required
The shift's days; an empty list clears the shift.
days[].day_of_week string, required
The day.
days[].end_time string, required
HH:MM or HH:MM:SS, 24-hour; after start_time, or at or before it when ends_next_day is true.
days[].ends_next_day boolean
True for a shift that ends after midnight, on the next day (22:30 to 00:30); default false.
days[].start_time string, required
HH:MM or HH:MM:SS, 24-hour.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
shift_number integer
The shift to save, 1 to 4, as GET names it; default 1. The shift query parameter does the same.

AssignmentTransition

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
reason string
Why, kept in the status history.
status string, required
The new status.

AssignmentUpdate

Fields to change, plus the lock_version you read (required).

billing_code string
The HCPCS code billed for the service.
effective_date string
end_date string
evv_exemption_date string
evv_exemption_on_file boolean
live_in boolean
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
modifiers array of string
Billing code modifiers.
notes string
Free text; written, never returned.
provider_type string
relative_provider boolean
The caregiver is a relative of the client.
work_order_number string
The work order number the office typed on the assignment.

AttentionRow

Something about a client or caregiver that needs doing. An agency reminder names no subject and points at /today.

action_label string, required
What to do, e.g. "Renew by Nov 3".
due_on string
When it is due, or since when it has waited; null when no date applies.
kind string, required
Where the row comes from.
path string, required
The app page that does it, with its tab.
subject_id string
The client's or caregiver's id; null for the agency.
subject_name string
Last name, first name; null for the agency.
subject_type string, required
Whom the row is about.

AttentionRowPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of AttentionRow, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

AuditReadiness

The agency's audit readiness: the summary's counts, and a page of the clients and caregivers with a gap (an item missing or expiring soon), most missing first.

caregivers_needing_attention array of FileGaps, required
caregivers_needing_attention_total integer
How many caregivers have a gap.
clients_needing_attention array of FileGaps, required
clients_needing_attention_total integer
How many clients have a gap.
limit integer
The page size of the two lists.
offset integer
The offset of the two lists.
overall_readiness_percentage number
Overall readiness, 0 to 100.

Batch

One uploaded claims file and the claims made from it. A batch can be deleted only before it is submitted, and it is then removed with its claims: no list or sync reports the removal, and GET of its id answers 404. So a client holding a batch with no submitted_at should re-read it by id to learn whether it still exists; a batch with submitted_at is never deleted.

auto_submit_requested boolean
Submit as soon as it validates.
claim_count integer
Claims in the batch.
claim_type string
completed_at string
When processing finished.
error_message string
Why the batch failed, when it did.
failed_count integer
Claims refused.
id string, required
The record's id.
inserted_at string
When the record was created.
original_filename string
The uploaded file's name.
source string
Where the batch came from, e.g. upload.
status string, required
The batch's processing status, which the status filter matches. A delivered batch stays submitted: whether its claims were paid is on the claims (their status and paid fields), which change with their updated_at. completed and partially_completed occur only on sample (demo) batches.
submitted_at string
When the batch was sent to HCPF.
successful_count integer
Claims accepted.
updated_at string
When the record last changed.

BatchPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Batch, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

BillingCode

A billing code a work order may carry, with the modifiers the Colorado fee schedules use. A work order also takes other modifiers in valid 837P format (two letters or digits), at most 4 and at most one program modifier; otherwise it answers 422 on modifiers.

code string, required
The HCPCS code.
modifiers array of string, required
The modifiers the fee schedules use; the same list for every code.

BillingCodePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of BillingCode, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Broadcast

delivery_method string, required
How it went out.
id string, required
The record's id.
recipient_count integer, required
Caregivers sent to.
recipient_scope string
Who it went to.
reply_count integer
Caregivers who texted back to it (#2567).
sent_at string
When it was sent (UTC).
skipped_count integer
Caregivers skipped: no contact for the method, or opted out of SMS.
yes_count integer
Of those, how many replies read as a yes.

BroadcastCreate

caregiver_ids array of string
pick: the caregivers to send to, whatever their status (former ones included). At most 1000.
delivery_method string
How to send it: email, sms or both. Leave it out for email.
include_former boolean
With tag: also caregivers no longer active. Leave it out for active only.
message string, required
The message.
recipient_scope string
Who to send it to. Leave it out for all, or for pick when caregiver_ids or tag is given.
tag string
pick: every caregiver carrying this tag (any case).

BroadcastPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].delivery_method string, required
How it went out.
data[].id string, required
The record's id.
data[].message string
What it said.
data[].recipient_count integer, required
Caregivers sent to.
data[].reply_count integer
Caregivers who texted back to it.
data[].sent_at string
When it was sent (UTC).
data[].skipped_count integer
Caregivers skipped: no contact for the method, or opted out of SMS.
data[].yes_count integer
Of those, how many replies read as a yes.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

BroadcastReply

caregiver_id string, required
The caregiver who replied.
caregiver_name string
The caregiver, last name first.
replied_at string
When it arrived (UTC).
reply string, required
Their latest text back.
yes boolean, required
Whether the reply reads as a yes.

BroadcastReplyPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].caregiver_id string, required
The caregiver who replied.
data[].caregiver_name string
The caregiver, last name first.
data[].replied_at string
When it arrived (UTC).
data[].reply string, required
Their latest text back.
data[].yes boolean, required
Whether the reply reads as a yes.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

BroadcastSummary

delivery_method string, required
How it went out.
id string, required
The record's id.
message string
What it said.
recipient_count integer, required
Caregivers sent to.
reply_count integer
Caregivers who texted back to it.
sent_at string
When it was sent (UTC).
skipped_count integer
Caregivers skipped: no contact for the method, or opted out of SMS.
yes_count integer
Of those, how many replies read as a yes.

CareLog

One caregiver's day for one client, for one service and shift, as the /care-logs list shows it, with its task counts.

attestation_skip_note string
The caregiver's note on that reason (required for other); null when none.
attestation_skip_reason string
Why the client did not sign, as the caregiver gave it with Client can't sign (US-101.20); the day stays a draft for the office to collect a signature. null when none was given.
attestation_skipped_at string
When the reason was given; null when none was.
attestation_skipped_by_caregiver_id string
The caregiver who gave the reason; null when none was.
caregiver_id string, required
The caregiver.
client_id string, required
The client.
finished_at string
When it was marked finished; null while open.
id string, required
The record's id.
inserted_at string
When it was started.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
notes string
The day's notes.
record_state string, required
draft until the client's signature (or a paper signature on file) locks it; then signed, amended (an addendum was signed) or voided (corrected by a new draft).
replaces_id string
The voided care log this draft corrects; null when none.
service_date string, required
The day.
service_type string
The service, as the Work Order's.
shift_number integer
The shift, 1 to 4.
signed_at string
When it was first signed; null for a draft.
source string
Where it was captured: hcb_app, hcb_phone, office, paper_scan or import.
task_counts object, required
task_counts.done integer, required
Tasks done.
task_counts.not_needed integer, required
Tasks not needed.
task_counts.refused integer, required
Tasks refused.
task_counts.unmarked integer, required
Tasks not marked yet.
time_in string
The entered start time, used only when no Visit is linked.
time_out string
The entered end time, used only when no Visit is linked.
updated_at string
When it last changed.
visit_id string
The Visit linked to the day, whose times are the care log's; null when none.
voided_at string
When it was voided; null unless voided.

CareLogDetail

One care log as its /care-logs/:id screen shows it: the day, its tasks, its times, the differences from the plan to explain (warnings never refuse a save, a finish or a signature) and its live signatures.

attestation_skip_note string
The caregiver's note on that reason (required for other); null when none.
attestation_skip_reason string
Why the client did not sign, as the caregiver gave it with Client can't sign (US-101.20); the day stays a draft for the office to collect a signature. null when none was given.
attestation_skipped_at string
When the reason was given; null when none was.
attestation_skipped_by_caregiver_id string
The caregiver who gave the reason; null when none was.
caregiver_id string, required
The caregiver.
client_id string, required
The client.
finished_at string
When it was marked finished; null while open.
id string, required
The record's id.
inserted_at string
When it was started.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
notes string
The day's notes.
record_state string, required
draft until the client's signature (or a paper signature on file) locks it; then signed, amended (an addendum was signed) or voided (corrected by a new draft).
replaced_by_id string
The draft that corrects this voided care log; null when none.
replaces_id string
The voided care log this draft corrects; null when none.
service_date string, required
The day.
service_type string
The service, as the Work Order's.
shift_number integer
The shift, 1 to 4.
signatures array of object, required
The live signatures, oldest first, without their images.
signatures[].channel string
Where it was captured.
signatures[].evidence_document_id string
The client's document holding the paper scan; null when none.
signatures[].id string, required
The signature.
signatures[].method string, required
How it was signed; paper_on_file for a paper signature the office marked as on file.
signatures[].role string, required
The line signed (client, caregiver, ...).
signatures[].signed_at string, required
When it was signed.
signatures[].signer_name string
The name the line is signed under.
signed_at string
When it was first signed; null for a draft.
source string
Where it was captured: hcb_app, hcb_phone, office, paper_scan or import.
tasks array of object, required
Planned tasks first, then those added off the plan.
tasks[].code string
The task's code.
tasks[].count integer, required
How many times.
tasks[].id string, required
The care log's task.
tasks[].name string
The task's name.
tasks[].planned boolean, required
Whether a Work Order in force planned it for the day; false for one added off the plan.
tasks[].reason_code string
Why it was refused, not needed or added.
tasks[].reason_note string
The reason in words.
tasks[].status string
done, refused or not_needed; null when unmarked.
tasks[].task_definition_id string, required
The agency's task; the {task_id} a mark is sent to (POST /care-logs/{id}/tasks/{task_id}/mark).
time_in string
The entered start time, used only when no Visit is linked.
time_out string
The entered end time, used only when no Visit is linked.
times object, required
times.end string
When it ended.
times.source string, required
visit: the linked Visit's billable times (adjusted, else actual, else scheduled); entered: time_in and time_out, when no Visit is linked.
times.start string
When the day's care started.
updated_at string
When it last changed.
visit_id string
The Visit linked to the day, whose times are the care log's; null when none.
voided_at string
When it was voided; null unless voided.
warnings array of object, required
The differences from the plan the care log should explain.
warnings[].code string, required
What differs from the plan. times_missing: no Visit is linked and the time in or time out is empty, so the day counts 0 hours. A care_logs.* code is a finding the save just answered raised: past the weekly or daily caregiver limit, past the Work Order's planned hours, entered times off the clocked Visit by more than 30 minutes, a day the Work Order withdrew, or time out equal to time in (0 hours). None refuses the save.
warnings[].message string, required
The warning in words.
warnings[].task_definition_id string
The task it is about; null for a warning about the day (times_missing).

CareLogPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of CareLog, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

CareLogPaperOnFile

document_id string
A document already on the client's file holding the paper scan; left out, the mark carries no scan.

CareLogSignature

channel string
Where it was captured.
evidence_document_id string
The client's document holding the paper scan; null when none.
id string, required
The signature.
method string, required
How it was signed; paper_on_file for a paper signature the office marked as on file.
role string, required
The line signed (client, caregiver, ...).
signed_at string, required
When it was signed.
signer_name string
The name the line is signed under.

CareLogStart

caregiver_id string, required
The caregiver.
client_id string, required
The client.
notes string
The day's notes.
service_date string, required
The day.
service_type string, required
The service, as the Work Order's.
shift_number integer
The shift, 1 to 4 (default 1).
time_in string
The start time, ISO 8601. Sent with time_out or notes, the start records the day: a care log already on the key with the same content is answered as it is, one with different content 409 stale.
time_out string
The end time, ISO 8601, at or after time_in.
visit_id string
The Visit to link: the agency's, of the same client, caregiver and day. Left out, the day's one such Visit is linked when exactly one exists.

CareLogTask

code string
The task's code.
count integer, required
How many times.
id string, required
The care log's task.
name string
The task's name.
planned boolean, required
Whether a Work Order in force planned it for the day; false for one added off the plan.
reason_code string
Why it was refused, not needed or added.
reason_note string
The reason in words.
status string
done, refused or not_needed; null when unmarked.
task_definition_id string, required
The agency's task; the {task_id} a mark is sent to (POST /care-logs/{id}/tasks/{task_id}/mark).

CareLogTaskAdd

count integer
How many times; 1 when left out.
reason_code string
Why it was done off the plan.
reason_note string
The reason in words.
status string
Its status; done when left out.
task_definition_id string, required
The task to add: one of the agency's tasks or a system one.

CareLogTaskCounts

done integer, required
Tasks done.
not_needed integer, required
Tasks not needed.
refused integer, required
Tasks refused.
unmarked integer, required
Tasks not marked yet.

CareLogTaskMark

count integer
How many times; unchanged when left out.
reason_code string
Why a task was refused or not needed; left out or null clears it, as a mark on the screen does.
reason_note string
The reason in words; left out or null clears it.
status string, required
The status to SET: done, refused or not_needed; null clears it. Sending the status the task already has changes nothing.

CareLogTimes

end string
When it ended.
source string, required
visit: the linked Visit's billable times (adjusted, else actual, else scheduled); entered: time_in and time_out, when no Visit is linked.
start string
When the day's care started.

CareLogUpdate

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
notes string
The day's notes; null clears them.
time_in string
The start time, ISO 8601; used only when no Visit is linked. null clears it.
time_out string
The end time, ISO 8601, after time_in; used only when no Visit is linked. null clears it.

CareLogWarning

code string, required
What differs from the plan. times_missing: no Visit is linked and the time in or time out is empty, so the day counts 0 hours. A care_logs.* code is a finding the save just answered raised: past the weekly or daily caregiver limit, past the Work Order's planned hours, entered times off the clocked Visit by more than 30 minutes, a day the Work Order withdrew, or time out equal to time in (0 hours). None refuses the save.
message string, required
The warning in words.
task_definition_id string
The task it is about; null for a warning about the day (times_missing).

Caregiver

A person who delivers care for the agency.

address string
cell_phone string
city string
date_of_birth string
Usually YYYY-MM-DD. Stored as entered: a record imported from older software can hold other text.
deleted_at string
Set when the agency deleted the record. Only a list with include_deleted=true returns deleted records.
email string
emergency_contact_name string
The person to call in an emergency, as the caregiver page shows it.
emergency_contact_phone string
The emergency contact's phone, 10 digits.
emergency_contact_relationship string
How the emergency contact is related to the caregiver.
employee_id string
The agency's own employee number.
end_of_employment_date string
evv_enrolled_on string
The day this caregiver joins the agency's EVV pilot (US-121.8); null when not enrolled.
first_name string, required
gender string
hire_date string
home_phone string
id string, required
The record's id.
inserted_at string
When the record was created.
last_name string, required
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
middle_name string
position string
The job title the agency gives the caregiver, as the agency writes it (Caregiver, PCW, Homemaker). Up to 200 characters.
ssn_masked string
The SSN as the page shows it, ***-**- and its last four digits; null when none is on file. The full SSN is never returned; send ssn on a create or update to set it.
state string
status string, required
text_status string
Whether the agency can text this caregiver, and if not why, as the Caregivers list's Texting column shows it (US-122.26): the first that holds of no_cell_phone, opted_out (they replied STOP), no_consent, not_verified and phone_changed (open-shift texts only, and only while the agency has open shifts on), last_text_failed (the newest open-shift text failed), else can_text. Read-only: it follows the caregiver's phone, consent and opt-out.
text_status_detail string
opted_out: the day they replied STOP (YYYY-MM-DD), null when none was recorded. last_text_failed: the provider's reason. Null for every other value.
updated_at string
When the record last changed.
worker_classification string
w2, a W-2 employee (the default), or 1099, an independent contractor: payroll pays a contractor no overtime and leaves them out of the ADP file. Payroll data: null for a credential without Payroll → View.
zip string
5 digits or ZIP+4, like "80202" or "80202-1234". A number sent here is read as its digits.

CaregiverAppPin

new_pin string, required
The PIN.

CaregiverBulkResult

caregivers integer, required
Active caregivers it covered.
records integer, required
Records written.
replaced integer
Existing dates it updated.
skipped integer
Records left as they were.

CaregiverCompliance

One caregiver's compliance: training by course, vaccinations by year, the annual evaluation and the credential dates. Never the compliance record's notes or custom items.

caregiver_name string
The caregiver's name.
credentials object
Credential dates by credential (criminal_background, dora, caps, driver_license, main_training).
evaluation object
evaluation.days_since_last integer
Days since the last evaluation.
evaluation.last_evaluation_date string
The last evaluation.
evaluation.status string
The annual evaluation's standing.
id string, required
The record's id.
needs_attention array of object
What needs attention, as the caregiver page's header counts it: each dated credential expired or expiring within 30 days, each training course expiring, expired or missing, this year's flu record when neither vaccinated nor medically declined, and the annual evaluation when expiring, overdue or never done. Empty when every paper is current.
needs_attention[].item string
The credential (criminal_background, dora, caps, driver_license, main_training, or credentials when there is no compliance record), the training course, flu or evaluation.
needs_attention[].state string
expired, expiring, missing, no_record, overdue, never_evaluated, or the flu record's status.
oig object
The latest OIG exclusion check, as oig_screening_status reads it.
oig.checked_on string
When it was checked; null when never.
oig.result string
clear, review or excluded; null when never checked.
oig.status string
current: clear within the monthly window; overdue: the last clear check is older; missing: never checked; review: a possible match not yet compared; excluded: on the list.
training object
Training standing by course.
vaccinations array of object
vaccinations[].status string
Vaccinated, declined, and so on.
vaccinations[].type string
The vaccine.
vaccinations[].vaccination_date string
When.
vaccinations[].year integer
The year.

CaregiverComplianceInput

caps_date string
As the Compliance tab names it.
caps_expiry string
As the Compliance tab names it.
criminal_background_date string
As the Compliance tab names it.
criminal_background_expiry string
As the Compliance tab names it.
custom object
The agency's custom checklist items by key, each {date, expiry, completed}; the keys sent are set and the others kept.
dora_date string
As the Compliance tab names it.
dora_expiry string
As the Compliance tab names it.
driver_license_expiry string
As the Compliance tab names it.
lock_version integer
On a change: the lock_version it was read with.
main_training_date string
As the Compliance tab names it.
main_training_expiry string
As the Compliance tab names it.
notes string
Notes, up to 2000 characters.

CaregiverComplianceRecord

caps_date string
As the Compliance tab names it.
caps_expiry string
As the Compliance tab names it.
caregiver_id string, required
The caregiver.
criminal_background_date string
As the Compliance tab names it.
criminal_background_expiry string
As the Compliance tab names it.
custom_items object
The agency's custom checklist items by key, each {date, expiry, completed}; the keys sent are set and the others kept.
dora_date string
As the Compliance tab names it.
dora_expiry string
As the Compliance tab names it.
driver_license_expiry string
As the Compliance tab names it.
id string, required
The record's id.
lock_version integer, required
Its version; send it back to change it.
main_training_date string
As the Compliance tab names it.
main_training_expiry string
As the Compliance tab names it.
notes string
Notes, up to 2000 characters.
updated_at string
When it last changed.

CaregiverEvaluation

One evaluation of a caregiver; at most one of a type a day.

caregiver_id string, required
The caregiver evaluated.
evaluation_date string, required
The day of the evaluation.
evaluation_type string, required
The kind of evaluation.
evaluator_name string
Who evaluated.
id string, required
The record's id.
inserted_at string
When the record was made.
rating string
The rating.
updated_at string
When the record last changed.

CaregiverEvaluationInput

An evaluation's fields. Evaluations carry no lock_version: an update locks and re-reads the row and must change something. One on the date and type of another evaluation is 422 already_recorded, with that one's id in details.evaluation_id.

evaluation_date string
The day of the evaluation.
evaluation_type string
The kind of evaluation.
evaluator_name string
Who evaluated.
notes string
Notes. Written, never returned.
rating string
The rating.

CaregiverEvaluationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of CaregiverEvaluation, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

CaregiverFileChecklist

caregiver_id string, required
The caregiver.
completed integer
How many items are done.
id string, required
The record's id.
items array of object, required
The agency's active items, in its order.
items[].completed boolean, required
Whether it is done.
items[].date string
Its date, as entered.
items[].key string, required
The item's key.
items[].notes string
Its notes.
items[].text string, required
What it asks for.
last_reviewed_at string
When it was last reviewed.
lock_version integer, required
Its version.
percentage number
completed of total, in percent.
reviewed_by_id string
Who reviewed it.
total integer
How many items there are.

CaregiverFileChecklistItem

completed boolean, required
Whether it is done.
date string
Its date, as entered.
key string, required
The item's key.
notes string
Its notes.
text string, required
What it asks for.

CaregiverFileChecklistItemUpdate

completed boolean
Whether it is done.
date string
Its date; blank clears it.
notes string
Its notes; blank clears them.

CaregiverFileChecklistReview

lock_version integer
The lock_version it was read with.

CaregiverFileChecklistUpdate

items object, required
Item key => {completed, date, notes}; a blank date or note clears it. Keys are get_caregiver_file_checklist's.

CaregiverInput

Fields to set. A create needs first_name and last_name. An update sends only what changes, plus the lock_version it read (required).

address string
cell_phone string
city string
date_of_birth string
Usually YYYY-MM-DD. Stored as entered: a record imported from older software can hold other text.
email string
emergency_contact_name string
The person to call in an emergency, as the caregiver page shows it.
emergency_contact_phone string
The emergency contact's phone, 10 digits.
emergency_contact_relationship string
How the emergency contact is related to the caregiver.
employee_id string
The agency's own employee number.
end_of_employment_date string
evv_enrolled_on string
The day this caregiver joins the agency's EVV pilot (US-121.8); null when not enrolled.
first_name string
gender string
hire_date string
home_phone string
last_name string
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
middle_name string
position string
The job title the agency gives the caregiver, as the agency writes it (Caregiver, PCW, Homemaker). Up to 200 characters.
ssn string
The full SSN, 9 digits, dashes allowed; null clears it. Answers show only ssn_masked.
state string
status string
worker_classification string
w2 or 1099. Payroll data: written only for a credential holding Payroll → Manage, and left out of the write otherwise, the rest of the body saving; a body carrying nothing else is refused 403 naming payroll.manage.
zip string
5 digits or ZIP+4, like "80202" or "80202-1234". A number sent here is read as its digits.

CaregiverNote

A note in a caregiver's communication log. compliance_relevant marks one that belongs in the caregiver's compliance file. written_via names the channel that last changed its text: mcp or api, or none for the HomeCareBilling app.

attachment_count integer
How many files are attached; the files are not returned.
caregiver_id string, required
The caregiver the note is about.
compliance_relevant boolean
Whether it belongs in the compliance file.
contact_type string, required
How the contact happened.
id string, required
The record's id.
inserted_at string
When the note was created.
manager_initials string
The initials of who took the note (taken by).
note_date string, required
The day of the contact.
note_text string, required
What was said or done.
time_of_contact string
The time of the contact, HH:MM or HH:MM:SS, as typed (no time zone).
updated_at string
When the note last changed.
written_via string
The channel that last changed the note's text (mcp, api); none for the HomeCareBilling app.

CaregiverNoteInput

Fields to set. A create needs note_date, contact_type and note_text; manager_initials defaults to the API key's user's initials. An update sends only what changes, and must change something. Notes carry no lock_version.

compliance_relevant boolean
Whether it belongs in the compliance file.
contact_type string
How the contact happened.
manager_initials string
The initials of who took the note (taken by).
note_date string
The day of the contact.
note_text string
What was said or done.
time_of_contact string
The time of the contact, HH:MM or HH:MM:SS, as typed (no time zone).

CaregiverNotePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of CaregiverNote, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

CaregiverPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Caregiver, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

CaregiverPayRate

caregiver_id string, required
The caregiver.
client_id string
The client a work rate is for; null is the general rate.
effective_date string, required
When it starts.
end_date string
When a newer rate of its type ended it.
id string, required
The record's id.
rate string, required
Dollars an hour.
rate_type string, required

CaregiverPayRateCreate

client_id string
A work rate for this one client: that client's hours are paid at it instead of the general work rate. Absent or null is the general rate.
effective_date string, required
When it starts, YYYY-MM-DD.
rate string, required
Dollars an hour, e.g. 18.50.
rate_type string, required
The kind of rate.

CaregiverPayRatePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].caregiver_id string, required
The caregiver.
data[].client_id string
The client a work rate is for; null is the general rate.
data[].effective_date string, required
When it starts.
data[].end_date string
When a newer rate of its type ended it.
data[].id string, required
The record's id.
data[].rate string, required
Dollars an hour.
data[].rate_type string, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

CaregiverPinStatus

app_pin_set boolean
Whether the caregiver has an app PIN.
caregiver_id string, required
The caregiver.
telephony_pin_set boolean
Whether the caregiver has a telephony PIN (the PIN is never returned).

CaregiverRestored

data Caregiver, required
meta object, required
meta.new_pin string
The reissued PIN, when pin_resolution is regenerated.
meta.pin_resolution string, required
What happened to the PIN.

CaregiverSession

A device token for the caregiver app. Send it as Authorization: Bearer on every /api/v1/me request. It is shown once and expires at expires_at; sign in again after that.

caregiver Me, required
expires_at string, required
When the token stops working.
token string, required
The device token. Store it in the device's secure storage.

CaregiverSessionInput

agency_code string, required
The agency's code, as on the caregiver's login card.
device_id string, required
A stable id the app generates once per install; the agency sees it in the caregiver's device list.
employee_id string, required
The caregiver's employee id at the agency.
pin string, required
The caregiver's PIN.

CaregiverStatusesUpdate

caregiver_ids array of string, required
The caregivers to set, at most 200, from find_caregiver or the caregivers list.
status string, required
The status to set on every caregiver named.

CaregiverStatusesUpdateResult

failed array of object, required
Not set, each with the reason in words: an id that is not this agency's caregiver (name null), an archived caregiver, or what the caregiver's card refused.
failed[].id string, required
The id as sent.
failed[].name string, required
Last, First; null when no caregiver was found.
failed[].reason string, required
Why it was not set, in words.
updated integer, required
Caregivers that now hold the status, those that already did included (no audit row for them).

CaregiverTraining

One training course for one year. A caregiver has at most one record per course a year (an "other" course has one slot a year).

caregiver_id string, required
The caregiver trained.
completed boolean
Whether the course is completed.
completed_date string
When it was completed; cleared when marked not completed.
expiry_date string
When the training expires.
id string, required
The record's id.
inserted_at string
When the record was made.
training_type string, required
The course.
training_type_other string
The course's name, for an "other" course.
updated_at string
When the record last changed.
year integer, required
The training year.

CaregiverTrainingCreate

Records one course for one year. A course already on file for that year is 422 already_recorded, with its id in details.training_id.

completed boolean
Whether the course is completed.
completed_date string
When it was completed; cleared when marked not completed.
expiry_date string
When the training expires. On a completed course, null or an empty string sets it to a year after completed_date; a course not completed has none.
notes string
Notes. Written, never returned.
training_type string, required
The course.
training_type_other string
The course's name, for an "other" course.
year integer, required
The training year.

CaregiverTrainingInput

Fields to change. Training records carry no lock_version: the row is locked and re-read for the change, which must change something. Marking a course not completed clears its completion date.

completed boolean
Whether the course is completed.
completed_date string
When it was completed; cleared when marked not completed.
expiry_date string
When the training expires. On a completed course, null or an empty string sets it to a year after completed_date; a course not completed has none.
notes string
Notes. Written, never returned.
training_type_other string
The course's name, for an "other" course.

CaregiverTrainingPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of CaregiverTraining, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

CaregiverVaccination

One vaccination for one year and type; a caregiver has at most one per type a year, and it is addressed by year and type, never by id.

caregiver_id string, required
The caregiver.
id string, required
The record's id.
inserted_at string
When the record was made.
status string
Vaccinated, declined, and so on.
updated_at string
When the record last changed.
vaccination_date string
When; only a vaccinated record has one.
vaccination_type string, required
The vaccine.
year integer, required
The vaccination year.

CaregiverVaccinationInput

Records the vaccination for year and vaccination_type: 201 when none was recorded (status is then required), 200 when it updates the one recorded, which must change something. A status other than vaccinated clears the date unless one is sent.

notes string
Notes. Written, never returned.
status string
Vaccinated, declined, and so on.
vaccination_date string
When; only a vaccinated record has one.
vaccination_type string, required
The vaccine.
year integer, required
The vaccination year.

CaregiverVaccinationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of CaregiverVaccination, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

CaregiverW4Sent

id string, required
The record's id.
w4_changed_at string, required
null: the payroll processor has been sent the change.

CaregiverW4SentInput

w4_changed_at string
The time of the change as it was read; refused with 409 stale_record when the W-4 changed again since. Not sent: the change waiting now is marked sent.

CaregiverWriteResult

data Caregiver, required
warnings array of object, required
What the act was done with that the agency may want to fix; usually empty. Never a refusal: the act was done.
warnings[].fix object
Where it is fixed, when a page fixes it.
warnings[].fix.label string, required
What the link says.
warnings[].fix.path string, required
The app route that fixes it.
warnings[].id string, required
The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
warnings[].message string, required
For a person to read.

CashAdvance

advance_date string
amount string
The amount advanced.
caregiver_id string
The record's id.
caregiver_name string
"Last, First". In GET /cash-advances; a write's answer leaves it out.
check_number string
The check the advance was paid by.
deduct_in_month string
The 1st of the payroll month the advance is deducted in.
id string
The record's id.
reason string
Why it was advanced, as typed.
remaining_balance string
What is still owed.
status string
outstanding, partially_repaid, fully_repaid or written_off.

CashAdvancePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].advance_date string
data[].amount string
The amount advanced.
data[].caregiver_id string
The record's id.
data[].caregiver_name string
"Last, First". In GET /cash-advances; a write's answer leaves it out.
data[].check_number string
The check the advance was paid by.
data[].deduct_in_month string
The 1st of the payroll month the advance is deducted in.
data[].id string
The record's id.
data[].reason string
Why it was advanced, as typed.
data[].remaining_balance string
What is still owed.
data[].status string
outstanding, partially_repaid, fully_repaid or written_off.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.
totals object, required
Over every advance the filters match, not this page.
totals.amount string
The amounts advanced.
totals.remaining_balance string
What is still owed.

CertificationCase

applied boolean
Round 2: whether the case's change was made. Null in round 1.
blocked string
Why a send is refused now; null when it is not.
id string, required
The case's id, as POST /settings/sandata/certification/cases/{id} takes it.
records integer, required
How many records it sends.
round integer, required
1: the sample records as created. 2: changes to records Sandata accepted.
scenario string, required
The Sandata scenario it covers.
state object
Of those records, how many Sandata holds as they are now (accepted), are waiting for Sandata's answer (waiting), were refused as they are now and go again on a send (refused), were refused too often to go again until they change (parked), cannot be sent as they are (held_back), and are left to send (to_send); each record is in exactly one. Null while Sandata is paused or not set up.
title string, required
What the page calls it.

CertificationCaseRefusal

POST /settings/sandata/certification/send only: present when this case was refused while the other went; it changed nothing.

code string, required
The refusal's code, as an error carries it.
message string, required
Why the case was not sent.

CertificationCaseResult

case string, required
The case's id.
dry_run boolean, required
True: written to the server log, nothing sent to Sandata and nothing changed.
records integer, required
How many records the case holds.
refused object
POST /settings/sandata/certification/send only: present when this case was refused while the other went; it changed nothing.
refused.code string, required
The refusal's code, as an error carries it.
refused.message string, required
Why the case was not sent.
sending integer, required
Live: how many of them were queued, those Sandata does not hold as they are now, a record it refused included until it is parked. Dry run: how many were written to the server log.

CertificationDomainReport

errors array of object, required
One per failed record.
errors[].error string, required
What the mapper refused.
errors[].id string, required
The record's id.
errors[].name string, required
The sample record's name.
failed integer, required
Those that did not.
passed integer, required
Those that mapped cleanly.
total integer, required
Sample records checked.

CertificationDryRunUpdate

dry_run boolean, required
True writes what would be sent to the server log and sends nothing; false sends to Sandata.

CertificationParty

batch string
Its latest batch's status; null when never sent.
id string, required
The record's id.
kind string, required
Client or employee.
name string, required
Its name.
state string, required
Where it stands with Sandata.

CertificationRecordError

error string, required
What the mapper refused.
id string, required
The record's id.
name string, required
The sample record's name.

CertificationReport

clients object, required
clients.errors array of object, required
One per failed record.
clients.errors[].error string, required
What the mapper refused.
clients.errors[].id string, required
The record's id.
clients.errors[].name string, required
The sample record's name.
clients.failed integer, required
Those that did not.
clients.passed integer, required
Those that mapped cleanly.
clients.total integer, required
Sample records checked.
credential_error string
Set when the Sandata settings are incomplete; null otherwise.
employees object, required
employees.errors array of object, required
One per failed record.
employees.errors[].error string, required
What the mapper refused.
employees.errors[].id string, required
The record's id.
employees.errors[].name string, required
The sample record's name.
employees.failed integer, required
Those that did not.
employees.passed integer, required
Those that mapped cleanly.
employees.total integer, required
Sample records checked.
overall_pass boolean, required
Every sample record mapped cleanly.
visits object, required
visits.errors array of object, required
One per failed record.
visits.errors[].error string, required
What the mapper refused.
visits.errors[].id string, required
The record's id.
visits.errors[].name string, required
The sample record's name.
visits.failed integer, required
Those that did not.
visits.passed integer, required
Those that mapped cleanly.
visits.total integer, required
Sample records checked.

CertificationStep

category string, required
Its section on the page.
completed boolean, required
Whether it is done.
date string
The day it was marked done; null when not done.
key string, required
The step's key.
notes string
Its notes; null when none.
text string, required
What the page calls it.

CertificationStepUpdate

completed boolean
Done or not done.
notes string
The notes; null or blank empties them.

CfcImportJob

client_id string, required
The client whose calculator it reads.
completed_at string
error object
A failed job's reason: unreadable_calculator, paper_capture_consent_required (a scan, and the agency has not accepted Paper forms; not retried), import_refused, not_found, audit_log_failed, extraction_unavailable (the extraction service did not answer through every retry), internal_error, abandoned (stuck past its bound).
error.code string
error.message string
filename string
The file's name as sent.
id string, required
The record's id.
inserted_at string
When it was started.
mode string, required
plans array of PlanOfCare
A succeeded import's new Plans of Care, with their tasks.
rows array of CfcPreviewRow
A succeeded preview's tasks and their per-day minutes.
status string, required
warnings array of string
Unmatched tasks, a Medicaid ID other than the client's; they never block.

CfcNewClient

client_id string, required
created: the new client; existing: the client already on file the calculator is imported for; conflict: the client on file holding the card's Medicaid ID.
import CfcImportJob, required
The import job for the client; null for a conflict, which writes nothing.
message string, required
What happened, in the words the import page uses; null for a new client.
outcome string, required
warnings array of object
What a created client was saved despite, as POST /api/v1/clients answers it: medicaid_id_pending on field medicaid_id (the card had no Medicaid ID, so the client cannot be billed until one is added); client_care.active_without_start_date on field service_start_date (the client is active with no service start date). Empty for an existing client or a conflict.
warnings[].code string, required
warnings[].field string
warnings[].message string, required

CfcPreviewRow

category string, required
matched boolean
Whether the task matched one the agency knows; an unmatched one needs mapping.
minutes_per_task string
Minutes each time.
over_cap boolean, required
True when the task cannot be placed within the client's days.
per_day object
Minutes on each day, sun to sat; null when over_cap.
per_day.fri integer
per_day.mon integer
per_day.sat integer
per_day.sun integer
per_day.thu integer
per_day.tue integer
per_day.wed integer
task_name string, required
The task, as the calculator names it.
times_per_week integer
Times a week.

CfcProgram

active boolean, required
Whether the agency offers it.
category string, required
The category.
position integer
Its place.
tasks array of object, required
Its tasks, in order.
tasks[].active boolean, required
Whether it is offered.
tasks[].category string, required
Its category.
tasks[].id string, required
The record's id.
tasks[].minutes_per_task string
Minutes each time.
tasks[].position integer
Its place in the category.
tasks[].task_name string, required
The task.
tasks[].times_per_week integer
Times a week.

CfcProgramActive

active boolean, required
Whether it is offered.
category string, required
The category.

CfcProgramUpdate

active boolean, required
Whether the agency offers it.

CfcPrograms

CfcTask

active boolean, required
Whether it is offered.
category string, required
Its category.
id string, required
The record's id.
minutes_per_task string
Minutes each time.
position integer
Its place in the category.
task_name string, required
The task.
times_per_week integer
Times a week.

CfcTaskCreate

minutes_per_task string, required
Minutes each time.
task_name string, required
The task.
times_per_week integer, required
Times a week.

CfcTaskUpdate

minutes_per_task string
Minutes each time.
task_name string
The task.
times_per_week integer
Times a week.

CfcTasksMoved

ChecklistItem

active boolean, required
Whether it is shown.
checklist string, required
Which checklist.
id string, required
The record's id.
item_key string, required
The key caregivers' records are kept under; never changes.
item_type string
How it is kept.
label string, required
What the item is called.
position integer
Its place in the checklist.

ChecklistItemCreate

item_type string
Compliance only.
label string, required
What the item is called.

ChecklistItemRename

label string, required
The new label.

ChecklistItems

ChecklistItemsMoved

Claim

One billed service line, from a batch.

adjustment_reason_codes array of string
Claim adjustment reason codes.
batch_id string, required
The batch the claim belongs to.
charge_amount string
Amount billed.
claim_frequency string
CLM05-3: 1 bills a new claim, 7 replaces a paid claim, 8 voids one.
diagnosis_code_1 string
diagnosis_code_2 string
diagnosis_code_3 string
diagnosis_code_4 string
duplicate_of_claim_id string
evv_validation_status string
icn string
HCPF's internal control number.
id string, required
The record's id.
investigation_status string
Where the agency's investigation of a denial stands.
member_id string
The Medicaid member id.
modifier_1 string
modifier_2 string
modifier_3 string
modifier_4 string
original_icn string
The ICN of the paid claim an uploaded replace (7) or void (8) row named.
paid_amount string
Amount paid.
paid_date string
par_number string
The prior authorization request number.
patient_account_number string
patient_first_name string
patient_last_name string
payment_status_code string
place_of_service string
procedure_code string
The HCPCS code billed.
reconciled_at string
When it was marked reconciled with its payment, if it was.
remark_codes array of object
Remittance remark codes.
replaced_account_number string
The account number the uploaded file gave this claim, when another row or a claim in progress or paid already used it and it was not kept; patient_account_number is the claim's own.
resolution_notes string
The agency's notes on resolving a denial.
row_number integer
Its row in the uploaded file.
service_date_from string
service_date_to string
status string, required
unit_type string
units string
Units billed.
updated_at string
When the record last changed.
validation_errors array of object
Why the claim is invalid, if it is.
validation_errors[].code string
Stable, e.g. required or invalid_format.
validation_errors[].field string
The claim field.
validation_errors[].message string
For a person to read.

ClaimEvvCorrection

A claim's units set to its verified EVV visits' units, and the figures before.

applied_at string
applied_by_id string
The record's id.
batch_id string
The record's id.
claim_id string
The record's id.
evv_units integer
Units the verified EVV visits add up to.
from_charge string
Charge before.
from_units string
Units the claim billed before.
id string
The record's id.
to_charge string
Charge after, at the claim's own price per unit.
to_units string
Units it bills after: the EVV units.
undone_at string
undone_by_id string
The record's id.
visit_ids array of string
The visits counted.

ClaimEvvCorrectionProposal

billed_units string, required
Units the claim bills now.
claim_id string, required
The record's id.
correction object, required
A claim's units set to its verified EVV visits' units, and the figures before.
correction.applied_at string
correction.applied_by_id string
The record's id.
correction.batch_id string
The record's id.
correction.claim_id string
The record's id.
correction.evv_units integer
Units the verified EVV visits add up to.
correction.from_charge string
Charge before.
correction.from_units string
Units the claim billed before.
correction.id string
The record's id.
correction.to_charge string
Charge after, at the claim's own price per unit.
correction.to_units string
Units it bills after: the EVV units.
correction.undone_at string
correction.undone_by_id string
The record's id.
correction.visit_ids array of string
The visits counted.
current_charge string
The claim's charge now.
evv_units integer
Units its verified EVV visits add up to; null when it is not compared.
proposed_charge string
The charge at evv_units, at the claim's own price per unit, rounded to cents; null when it has no charge or bills 0 units, and then applying leaves the charge as it is.
refusal object, required
Null when applying now would succeed; otherwise what it would answer: code and message.
refusal.code string
refusal.message string
visit_ids array of string, required
The visits counted.

ClaimPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Claim, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Client

A person the agency serves.

acp_address_line1 string
The ACP substitute street address; with no substitute, Sandata gets no address.
acp_city string
The ACP substitute address's city.
acp_phone string
The ACP substitute phone.
acp_protected boolean
In Colorado's Address Confidentiality Program: the real address, phones and every call location are withheld from Sandata, and the acp_ substitute below goes instead. Set with POST /api/v1/clients/{id}/acp-protection.
acp_state string
The ACP substitute address's state.
acp_zip string
The ACP substitute address's zip.
address string
address_line_2 string
Apartment, suite or unit; sent to Sandata as ClientAddressLine2.
agency_services_only boolean
The client has no outside providers (Access's MHS ONLY). Set with POST /api/v1/clients/{id}/agency-services-only.
city string
client_type string, required
county string
A Colorado county name; sent to Sandata as ClientCounty.
date_of_birth string
Usually YYYY-MM-DD. Stored as entered: a record imported from older software can hold other text.
deleted_at string
Set when the agency deleted the record. Only a list with include_deleted=true returns deleted records.
eligibility_end_date string
eligibility_start_date string
eligibility_verified_at string
When the agency last marked the client's Medicaid eligibility verified.
email string
emergency_contact_name string
Deprecated: use /api/v1/clients/{id}/relations. Served until 2027-05-31. The client's emergency contact 1, as the client page's People section shows it.
emergency_contact_phone string
Deprecated: use /api/v1/clients/{id}/relations. Served until 2027-05-31. Emergency contact 1's phone, 10 digits.
first_name string, required
gender string
home_phone string
id string, required
The record's id.
ihss_client boolean
An IHSS client (Access's IHSSClient box), whatever client_type says; the PAR panel then shows the IHSS column. A client typed ihss is always one.
ihss_code string
The IHSS billing code and modifiers off the client's IHSS PAR, as the agency writes them (US-102.17).
ihss_par_weeks string
The weeks the client's IHSS PAR runs.
ihss_units_on_par integer
The units the client's IHSS PAR authorizes; the PAR panel shows them as hours a week, units / 4 / weeks.
inserted_at string
When the record was created.
intake_missing array of string
The intake forms the client page warns are not signed yet (US-101.42): the agency disclosure notice, the client rights acknowledgement and the emergency information, each counted once a record of it is signed or amended. Empty when the page shows no warning: services started one business day ago or less, before the warning's start date, or not at all; nothing missing; or the warning dismissed with nothing missing since. Dismiss it with POST /api/v1/clients/{id}/intake-warning-dismissals. It never blocks anything.
language_preference string
last_name string, required
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
medicaid_id string
The Colorado Medicaid id.
middle_name string
mobile_phone string
payer_program string
The program that pays for the client's care.
planned_supervisory_day integer
The day all four quarters' slots share; null when the quarters differ or no day is chosen. Each quarter's own day is planned_supervisory_qN_day. Set with POST /api/v1/clients/{id}/supervisory-plan.
planned_supervisory_offset integer
The month of the quarter (1, 2 or 3) all four quarters' slots share; null when the quarters differ or none is planned. Each quarter's own slot is planned_supervisory_qN_offset (#2606). Set with POST /api/v1/clients/{id}/supervisory-plan.
planned_supervisory_q1_day integer
Quarter 1's planned supervisory day of that month; null when no day is chosen.
planned_supervisory_q1_offset integer
Quarter 1's planned supervisory month, the month of that quarter (1, 2 or 3); null when quarter 1 is unplanned.
planned_supervisory_q2_day integer
Quarter 2's planned supervisory day of that month; null when no day is chosen.
planned_supervisory_q2_offset integer
Quarter 2's planned supervisory month, the month of that quarter (1, 2 or 3); null when quarter 2 is unplanned.
planned_supervisory_q3_day integer
Quarter 3's planned supervisory day of that month; null when no day is chosen.
planned_supervisory_q3_offset integer
Quarter 3's planned supervisory month, the month of that quarter (1, 2 or 3); null when quarter 3 is unplanned.
planned_supervisory_q4_day integer
Quarter 4's planned supervisory day of that month; null when no day is chosen.
planned_supervisory_q4_offset integer
Quarter 4's planned supervisory month, the month of that quarter (1, 2 or 3); null when quarter 4 is unplanned.
private_insurance_client boolean
The client has private insurance (Access's Private box), whatever client_type says. A client typed private_insurance always has.
service_end_date string
service_start_date string
ssn_masked string
The SSN as the page shows it, ***-**- and its last four digits; null when none is on file. The full SSN is never returned; send ssn on a create or update to set it.
state string
status string, required
temporary boolean
A short-term client, whatever pays for them; the app's active client list hides them by default.
updated_at string
When the record last changed.
zip string
5 digits or ZIP+4, like "80202" or "80202-1234". A number sent here is read as its digits.

ClientAcpProtection

acp_address_line1 string
The ACP substitute street address, sent in place of the real one.
acp_city string
The ACP substitute address's city.
acp_phone string
The ACP substitute phone, sent in place of the client's phones.
acp_state string
The ACP substitute address's state, two letters.
acp_zip string
The ACP substitute address's zip, 5 or 9 digits.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
protected boolean, required
true: the client is in Colorado's Address Confidentiality Program (PM 20-007): its real address, phones and every call location are withheld from Sandata, and the ACP substitute address and phone given here go in their place. false removes the mark and clears the substitute.
reason string
Required with protected false: why the mark is removed, at least 10 characters.

ClientAgencyServicesOnly

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
value boolean, required
true: the client has no outside providers (Access's MHS ONLY). false clears it.

ClientCalendarEvent

client_id string, required
The client it is about.
completed_at string
When it was done.
description string
More about it.
due_date string, required
The day it is due.
due_time string
A time of day, HH:MM:SS (Mountain time).
event_type string, required
id string, required
The record's id.
lock_version integer, required
Its version.
status string, required
title string, required
What is due.

ClientCalendarEventCreate

description string
More about it, up to 5000 characters.
due_date string, required
The day it is due, YYYY-MM-DD.
due_time string
The time it is due, HH:MM:SS, Mountain time.
title string, required
What is due, up to 200 characters.

ClientCalendarEventPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].client_id string, required
The client it is about.
data[].completed_at string
When it was done.
data[].description string
More about it.
data[].due_date string, required
The day it is due.
data[].due_time string
A time of day, HH:MM:SS (Mountain time).
data[].event_type string, required
data[].id string, required
The record's id.
data[].lock_version integer, required
Its version.
data[].status string, required
data[].title string, required
What is due.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ClientCalendarEventRestore

due_date string
The day it was due, YYYY-MM-DD.
due_time string
The time it was due, HH:MM:SS, Mountain time.
status string, required
The status it had.

ClientCertification

One certification period; periods for a client may not overlap.

client_id string, required
The client.
county string
The county.
effective_date string, required
When the period starts.
expiry_date string, required
When it ends.
id string, required
The record's id.
inserted_at string
When it was recorded.
updated_at string
When it last changed.

ClientCertificationInput

A period overlapping another of the client's answers 422 naming effective_date.

county string
The county.
effective_date string
When the period starts, YYYY-MM-DD.
expiry_date string
When it ends, YYYY-MM-DD.

ClientCertificationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ClientCertification, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ClientChartAddendum

body string, required
What it adds.
id string, required
The addendum.
reason string
Why it was added.
signatures array of object, required
Its live signatures, oldest first.
signatures[].channel string
Where it was signed.
signatures[].method string, required
How it was signed.
signatures[].role string, required
The line signed.
signatures[].role_label string, required
The line as the record names it, e.g. "complainant".
signatures[].signed_at string, required
When.
signatures[].signer_name string, required
Who signed, as given.
signed_at string, required
When it was signed.
state string
The addendum's own state.
true_copy object, required
true_copy.document_id string
The true copy, at /documents/{id}/download, once stored.
true_copy.status string, required
none for a draft, an incomplete signing or a record signed before the electronic record; pending while the copy is made; stored once filed; failed when it could not be made.

ClientChartCareLog

attested boolean, required
Whether the client's attestation is on it: a client or representative signature, or recorded words.
source string, required
Where the log was kept.

ClientChartDocument

file_name string, required
Its file name.
id string, required
The document.
scan_status string, required
Its virus scan; only a clean document can be downloaded.

ClientChartEntry

addenda array of object, required
The record's signed addenda, in signing order.
addenda[].body string, required
What it adds.
addenda[].id string, required
The addendum.
addenda[].reason string
Why it was added.
addenda[].signatures array of object, required
Its live signatures, oldest first.
addenda[].signatures[].channel string
Where it was signed.
addenda[].signatures[].method string, required
How it was signed.
addenda[].signatures[].role string, required
The line signed.
addenda[].signatures[].role_label string, required
The line as the record names it, e.g. "complainant".
addenda[].signatures[].signed_at string, required
When.
addenda[].signatures[].signer_name string, required
Who signed, as given.
addenda[].signed_at string, required
When it was signed.
addenda[].state string
The addendum's own state.
addenda[].true_copy object, required
addenda[].true_copy.document_id string
The true copy, at /documents/{id}/download, once stored.
addenda[].true_copy.status string, required
none for a draft, an incomplete signing or a record signed before the electronic record; pending while the copy is made; stored once filed; failed when it could not be made.
care_log object
care_log.attested boolean, required
Whether the client's attestation is on it: a client or representative signature, or recorded words.
care_log.source string, required
Where the log was kept.
caregiver_id string
The caregiver.
caregiver_name string
The caregiver's name.
document object
document.file_name string, required
Its file name.
document.id string, required
The document.
document.scan_status string, required
Its virus scan; only a clean document can be downloaded.
kind string, required
The kind of record.
legacy_signed boolean, required
True for a record signed before the electronic record: its signatures are on paper, and it has no true copy.
missing_signers array of string, required
Each required line no live signature fills, e.g. "caregiver or PCP"; empty unless the record is signed or amended.
occurred_on string, required
The date the entry is filed under: the visit, effective, service or complaint date, the first of a report's month, the first signature (Mountain) of a notice or emergency information, a scan's paper date, else the upload date (Mountain).
path string
The app page the title opens, or a document's download; null for a document whose virus scan is not clean.
record_id string, required
The record, or for a document or scan the document.
service_type string
The service.
signatures array of object, required
The live signatures, oldest first.
signatures[].channel string
Where it was signed.
signatures[].method string, required
How it was signed.
signatures[].role string, required
The line signed.
signatures[].role_label string, required
The line as the record names it, e.g. "complainant".
signatures[].signed_at string, required
When.
signatures[].signer_name string, required
Who signed, as given.
state string
The record's state; null for a document.
title string, required
The entry's title, as the chart shows it.
true_copy object, required
true_copy.document_id string
The true copy, at /documents/{id}/download, once stored.
true_copy.status string, required
none for a draft, an incomplete signing or a record signed before the electronic record; pending while the copy is made; stored once filed; failed when it could not be made.
void object
void.actor_name string
Who voided it; null for an API key.
void.reason string, required
Why it was voided.
void.replaced_by_id string
The draft made to replace it, when one was made.
void.voided_at string, required
When it was voided.
work_order_id string
A Monthly Client Report's Work Order.

ClientChartPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].addenda array of object, required
The record's signed addenda, in signing order.
data[].addenda[].body string, required
What it adds.
data[].addenda[].id string, required
The addendum.
data[].addenda[].reason string
Why it was added.
data[].addenda[].signatures array of object, required
Its live signatures, oldest first.
data[].addenda[].signatures[].channel string
Where it was signed.
data[].addenda[].signatures[].method string, required
How it was signed.
data[].addenda[].signatures[].role string, required
The line signed.
data[].addenda[].signatures[].role_label string, required
The line as the record names it, e.g. "complainant".
data[].addenda[].signatures[].signed_at string, required
When.
data[].addenda[].signatures[].signer_name string, required
Who signed, as given.
data[].addenda[].signed_at string, required
When it was signed.
data[].addenda[].state string
The addendum's own state.
data[].addenda[].true_copy object, required
data[].addenda[].true_copy.document_id string
The true copy, at /documents/{id}/download, once stored.
data[].addenda[].true_copy.status string, required
none for a draft, an incomplete signing or a record signed before the electronic record; pending while the copy is made; stored once filed; failed when it could not be made.
data[].care_log object
data[].care_log.attested boolean, required
Whether the client's attestation is on it: a client or representative signature, or recorded words.
data[].care_log.source string, required
Where the log was kept.
data[].caregiver_id string
The caregiver.
data[].caregiver_name string
The caregiver's name.
data[].document object
data[].document.file_name string, required
Its file name.
data[].document.id string, required
The document.
data[].document.scan_status string, required
Its virus scan; only a clean document can be downloaded.
data[].kind string, required
The kind of record.
data[].legacy_signed boolean, required
True for a record signed before the electronic record: its signatures are on paper, and it has no true copy.
data[].missing_signers array of string, required
Each required line no live signature fills, e.g. "caregiver or PCP"; empty unless the record is signed or amended.
data[].occurred_on string, required
The date the entry is filed under: the visit, effective, service or complaint date, the first of a report's month, the first signature (Mountain) of a notice or emergency information, a scan's paper date, else the upload date (Mountain).
data[].path string
The app page the title opens, or a document's download; null for a document whose virus scan is not clean.
data[].record_id string, required
The record, or for a document or scan the document.
data[].service_type string
The service.
data[].signatures array of object, required
The live signatures, oldest first.
data[].signatures[].channel string
Where it was signed.
data[].signatures[].method string, required
How it was signed.
data[].signatures[].role string, required
The line signed.
data[].signatures[].role_label string, required
The line as the record names it, e.g. "complainant".
data[].signatures[].signed_at string, required
When.
data[].signatures[].signer_name string, required
Who signed, as given.
data[].state string
The record's state; null for a document.
data[].title string, required
The entry's title, as the chart shows it.
data[].true_copy object, required
data[].true_copy.document_id string
The true copy, at /documents/{id}/download, once stored.
data[].true_copy.status string, required
none for a draft, an incomplete signing or a record signed before the electronic record; pending while the copy is made; stored once filed; failed when it could not be made.
data[].void object
data[].void.actor_name string
Who voided it; null for an API key.
data[].void.reason string, required
Why it was voided.
data[].void.replaced_by_id string
The draft made to replace it, when one was made.
data[].void.voided_at string, required
When it was voided.
data[].work_order_id string
A Monthly Client Report's Work Order.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ClientChartSignature

channel string
Where it was signed.
method string, required
How it was signed.
role string, required
The line signed.
role_label string, required
The line as the record names it, e.g. "complainant".
signed_at string, required
When.
signer_name string, required
Who signed, as given.

ClientChartTrueCopy

document_id string
The true copy, at /documents/{id}/download, once stored.
status string, required
none for a draft, an incomplete signing or a record signed before the electronic record; pending while the copy is made; stored once filed; failed when it could not be made.

ClientChartVoid

actor_name string
Who voided it; null for an API key.
reason string, required
Why it was voided.
replaced_by_id string
The draft made to replace it, when one was made.
voided_at string, required
When it was voided.

ClientConsentForm

answers object, required
The answers, by question key: a disclosure item's responsible party (agency or consumer), the complaint contact.
client_id string, required
The client.
declined_reason string
Why the client declined to sign a disclosure notice; the office then signs that it was conveyed verbally.
defaulted_keys array of string
The choices still holding the answer the notice was prefilled with (its first option): defaults nobody has chosen.
form_type string, required
agency_disclosure_notice (Chapter 26 6.7) or client_rights_acknowledgement (6.4).
id string, required
The record's id.
inserted_at string
When the notice was started.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
missing_signers array of object
Each required line no live signature fills yet, in order; empty when complete or voided.
missing_signers[].label string, required
The line as the page names it, e.g. "client or authorized representative".
missing_signers[].roles array of string, required
The roles that would fill the line: any one of them.
record_state string, required
draft until the first signature; signed notices are corrected by addendum or void.
signatures array of object
The live signatures, oldest first.
signatures[].method string, required
How it was signed.
signatures[].role string, required
The line signed.
signatures[].signed_at string, required
When.
signatures[].signer_name string, required
Who signed.
signed_at string
When the first signature locked it; null on a draft.
signing_complete boolean
True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.

ClientConsentFormAnswers

answers object, required
Answers by question key; a key sent counts as chosen, and a blank clears its answer. Keys not sent keep their answer.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.

ClientConsentFormPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].answers object, required
The answers, by question key: a disclosure item's responsible party (agency or consumer), the complaint contact.
data[].client_id string, required
The client.
data[].declined_reason string
Why the client declined to sign a disclosure notice; the office then signs that it was conveyed verbally.
data[].defaulted_keys array of string
The choices still holding the answer the notice was prefilled with (its first option): defaults nobody has chosen.
data[].form_type string, required
agency_disclosure_notice (Chapter 26 6.7) or client_rights_acknowledgement (6.4).
data[].id string, required
The record's id.
data[].inserted_at string
When the notice was started.
data[].lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
data[].missing_signers array of object
Each required line no live signature fills yet, in order; empty when complete or voided.
data[].missing_signers[].label string, required
The line as the page names it, e.g. "client or authorized representative".
data[].missing_signers[].roles array of string, required
The roles that would fill the line: any one of them.
data[].record_state string, required
draft until the first signature; signed notices are corrected by addendum or void.
data[].signatures array of object
The live signatures, oldest first.
data[].signatures[].method string, required
How it was signed.
data[].signatures[].role string, required
The line signed.
data[].signatures[].signed_at string, required
When.
data[].signatures[].signer_name string, required
Who signed.
data[].signed_at string
When the first signature locked it; null on a draft.
data[].signing_complete boolean
True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ClientConsentFormSignature

declined_reason string
On a draft disclosure notice: why the client declined to sign. Saved with the office signature in one step, that the notice was conveyed verbally.
role string, required
office: agency staff, signed as you. A rights acknowledgement is complete with it; a disclosure notice takes it only with declined_reason. client and representative are drawn on the device in the app and answer 422 drawn_required here.

ClientConsentFormStart

form_type string, required
The notice to start.

ClientEmergencyInfo

answers object, required
The answers, by question key.
client_id string, required
The client.
id string, required
The record's id.
inserted_at string
When this revision was saved.
missing_signers array of object
Each required line no live signature fills yet, in order; empty when complete or voided.
missing_signers[].label string, required
The line as the page names it, e.g. "client or authorized representative".
missing_signers[].roles array of string, required
The roles that would fill the line: any one of them.
record_state string, required
draft until the first signature (US-101.32). A signed revision is never deleted or changed: it is corrected with an addendum, voided, or followed by a new revision.
signatures array of object
The live signatures, oldest first.
signatures[].method string, required
How it was signed.
signatures[].role string, required
The line signed.
signatures[].signed_at string, required
When.
signatures[].signer_name string, required
Who signed.
signed_at string
When the first signature locked it; null on a draft.
signing_complete boolean
True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
superseded boolean
True for a draft never signed whose client has a later signed revision: it is no longer the sheet in force, and may still be deleted.
version integer, required
Its revision number.

ClientEmergencyInfoInput

answers object, required
Answers by question key.

ClientEmergencyInfoPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].answers object, required
The answers, by question key.
data[].client_id string, required
The client.
data[].id string, required
The record's id.
data[].inserted_at string
When this revision was saved.
data[].missing_signers array of object
Each required line no live signature fills yet, in order; empty when complete or voided.
data[].missing_signers[].label string, required
The line as the page names it, e.g. "client or authorized representative".
data[].missing_signers[].roles array of string, required
The roles that would fill the line: any one of them.
data[].record_state string, required
draft until the first signature (US-101.32). A signed revision is never deleted or changed: it is corrected with an addendum, voided, or followed by a new revision.
data[].signatures array of object
The live signatures, oldest first.
data[].signatures[].method string, required
How it was signed.
data[].signatures[].role string, required
The line signed.
data[].signatures[].signed_at string, required
When.
data[].signatures[].signer_name string, required
Who signed.
data[].signed_at string
When the first signature locked it; null on a draft.
data[].signing_complete boolean
True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
data[].superseded boolean
True for a draft never signed whose client has a later signed revision: it is no longer the sheet in force, and may still be deleted.
data[].version integer, required
Its revision number.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ClientEmergencyInfoSignature

role string, required
Whose line to sign: office, agency staff, signed as you. The client's or authorized representative's line is drawn on the device in the app and answers 422 drawn_required here.

ClientHealthSummary

client_id string, required
The client.
edited_at string
When it was last edited.
generated_at string
When it was written.
id string, required
The record's id.
lock_version integer, required
Its version; send it back to edit.
model_used string
The AI model that wrote it.
text string, required
The summary, in Markdown.

ClientHealthSummaryUpdate

lock_version integer, required
The lock_version it was read with.
text string, required
The summary, in Markdown.

ClientInformationSheetSaved

client_id string, required
The client.
fields array of string, required
The fields written.

ClientInformationSheetUpdate

address string
As the Information Sheet names it; null or blank clears it.
allergies string
As the Information Sheet names it; null or blank clears it.
city string
As the Information Sheet names it; null or blank clears it.
clinic_name string
As the Information Sheet names it; null or blank clears it.
date_of_birth string
As the Information Sheet names it; null or blank clears it.
doctor_address string
As the Information Sheet names it; null or blank clears it.
doctor_name string
As the Information Sheet names it; null or blank clears it.
doctor_phone string
As the Information Sheet names it; null or blank clears it.
emergency_contact_name string
As the Information Sheet names it; null or blank clears it.
emergency_contact_phone string
As the Information Sheet names it; null or blank clears it.
field_staff_instructions string
As the Information Sheet names it; null or blank clears it.
first_name string
As the Information Sheet names it; never blank.
gender string
As the Information Sheet names it; null or blank clears it.
home_phone string
As the Information Sheet names it; null or blank clears it.
last_name string
As the Information Sheet names it; never blank.
manager_email string
As the Information Sheet names it; null or blank clears it.
manager_fax string
As the Information Sheet names it; null or blank clears it.
manager_name string
As the Information Sheet names it; null or blank clears it.
manager_phone string
As the Information Sheet names it; null or blank clears it.
medicaid_id string
As the Information Sheet names it; null or blank clears it.
medications string
As the Information Sheet names it; null or blank clears it.
mobile_phone string
As the Information Sheet names it; null or blank clears it.
other_conditions string
As the Information Sheet names it; null or blank clears it.
physical_conditions string
As the Information Sheet names it; null or blank clears it.
ssn string
The client's SSN, never returned; leave it out to keep the stored one.
state string
As the Information Sheet names it; null or blank clears it.
supervisor_name string
As the Information Sheet names it; null or blank clears it.
supervisor_phone string
As the Information Sheet names it; null or blank clears it.
zip string
As the Information Sheet names it; null or blank clears it.

ClientInput

Fields to set. A create needs first_name and last_name. A Medicaid client (client_type medicaid, the default) saved without medicaid_id is saved with a medicaid_id_pending warning and cannot be billed until the ID is added; never send a placeholder ID. An update sends only what changes, plus the lock_version it read (required).

address string
address_line_2 string
Apartment, suite or unit; sent to Sandata as ClientAddressLine2.
city string
client_type string
county string
A Colorado county name; sent to Sandata as ClientCounty.
date_of_birth string
Usually YYYY-MM-DD. Stored as entered: a record imported from older software can hold other text.
eligibility_end_date string
eligibility_start_date string
email string
emergency_contact_name string
Deprecated: use /api/v1/clients/{id}/relations. Served until 2027-05-31. The client's emergency contact 1, as the client page's People section shows it.
emergency_contact_phone string
Deprecated: use /api/v1/clients/{id}/relations. Served until 2027-05-31. Emergency contact 1's phone, 10 digits.
first_name string
gender string
home_phone string
ihss_client boolean
An IHSS client (Access's IHSSClient box), whatever client_type says; the PAR panel then shows the IHSS column. A client typed ihss is always one.
ihss_code string
The IHSS billing code and modifiers off the client's IHSS PAR, as the agency writes them (US-102.17).
ihss_par_weeks string
The weeks the client's IHSS PAR runs.
ihss_units_on_par integer
The units the client's IHSS PAR authorizes; the PAR panel shows them as hours a week, units / 4 / weeks.
language_preference string
last_name string
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
medicaid_id string
The Colorado Medicaid id.
middle_name string
mobile_phone string
payer_program string
The program that pays for the client's care.
private_insurance_client boolean
The client has private insurance (Access's Private box), whatever client_type says. A client typed private_insurance always has.
service_end_date string
service_start_date string
ssn string
The full SSN, 9 digits, dashes allowed; null clears it. Answers show only ssn_masked.
state string
status string
temporary boolean
A short-term client, whatever pays for them; the app's active client list hides them by default.
zip string
5 digits or ZIP+4, like "80202" or "80202-1234". A number sent here is read as its digits.

ClientMedical

allergies string
As the Medical tab shows it; a blank or null clears it on a write.
client_id string, required
The client.
clinic_name string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_address string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_name string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_phone string
As the Medical tab shows it; a blank or null clears it on a write.
field_staff_instructions string
As the Medical tab shows it; a blank or null clears it on a write.
functional_limitations object
The Functional Limitations checkboxes and their Other text; null when none were ever saved. A write changes only the keys sent.
functional_limitations.breathing boolean
Whether the client has this limitation.
functional_limitations.hearing boolean
Whether the client has this limitation.
functional_limitations.mobility boolean
Whether the client has this limitation.
functional_limitations.other string
Any other limitation.
functional_limitations.special_diet boolean
Whether the client has this limitation.
functional_limitations.speech boolean
Whether the client has this limitation.
functional_limitations.swallowing boolean
Whether the client has this limitation.
functional_limitations.vision boolean
Whether the client has this limitation.
medications string
As the Medical tab shows it; a blank or null clears it on a write.
other_conditions string
As the Medical tab shows it; a blank or null clears it on a write.
physical_conditions string
As the Medical tab shows it; a blank or null clears it on a write.
special_needs string
As the Medical tab shows it; a blank or null clears it on a write.
surgeries string
As the Medical tab shows it; a blank or null clears it on a write.

ClientMedicalSaved

allergies string
As the Medical tab shows it; a blank or null clears it on a write.
client_id string, required
The client.
clinic_name string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_address string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_name string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_phone string
As the Medical tab shows it; a blank or null clears it on a write.
field_staff_instructions string
As the Medical tab shows it; a blank or null clears it on a write.
functional_limitations object
The Functional Limitations checkboxes and their Other text; null when none were ever saved. A write changes only the keys sent.
functional_limitations.breathing boolean
Whether the client has this limitation.
functional_limitations.hearing boolean
Whether the client has this limitation.
functional_limitations.mobility boolean
Whether the client has this limitation.
functional_limitations.other string
Any other limitation.
functional_limitations.special_diet boolean
Whether the client has this limitation.
functional_limitations.speech boolean
Whether the client has this limitation.
functional_limitations.swallowing boolean
Whether the client has this limitation.
functional_limitations.vision boolean
Whether the client has this limitation.
medications string
As the Medical tab shows it; a blank or null clears it on a write.
other_conditions string
As the Medical tab shows it; a blank or null clears it on a write.
physical_conditions string
As the Medical tab shows it; a blank or null clears it on a write.
special_needs string
As the Medical tab shows it; a blank or null clears it on a write.
surgeries string
As the Medical tab shows it; a blank or null clears it on a write.

ClientMedicalUpdate

allergies string
As the Medical tab shows it; a blank or null clears it on a write.
clinic_name string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_address string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_name string
As the Medical tab shows it; a blank or null clears it on a write.
doctor_phone string
As the Medical tab shows it; a blank or null clears it on a write.
field_staff_instructions string
As the Medical tab shows it; a blank or null clears it on a write.
functional_limitations object
The Functional Limitations checkboxes and their Other text; null when none were ever saved. A write changes only the keys sent.
functional_limitations.breathing boolean
Whether the client has this limitation.
functional_limitations.hearing boolean
Whether the client has this limitation.
functional_limitations.mobility boolean
Whether the client has this limitation.
functional_limitations.other string
Any other limitation.
functional_limitations.special_diet boolean
Whether the client has this limitation.
functional_limitations.speech boolean
Whether the client has this limitation.
functional_limitations.swallowing boolean
Whether the client has this limitation.
functional_limitations.vision boolean
Whether the client has this limitation.
medications string
As the Medical tab shows it; a blank or null clears it on a write.
other_conditions string
As the Medical tab shows it; a blank or null clears it on a write.
physical_conditions string
As the Medical tab shows it; a blank or null clears it on a write.
special_needs string
As the Medical tab shows it; a blank or null clears it on a write.
surgeries string
As the Medical tab shows it; a blank or null clears it on a write.

ClientMonthEvidence

caregiver_id string, required
The caregiver.
client_id string, required
The client.
days array of object, required
Every calendar day of the month, in order.
days[].care_logs array of object, required
days[].care_logs[].attestation_method string
How the client or representative signed it, if they did.
days[].care_logs[].attestation_skip_reason string
Why the client could not sign, when the caregiver said.
days[].care_logs[].care_log_id string, required
The care log.
days[].care_logs[].comparisons array of object, required
days[].care_logs[].comparisons[].conflict_key string
The conflict's key, on a conflict only; dismiss it as a visit conflict is dismissed.
days[].care_logs[].comparisons[].fields array of string, required
On a conflict, the fields that differ: start, end, tasks or attestation.
days[].care_logs[].comparisons[].kind string, required
What was compared: the care log's times with the visit evidence, its done tasks with the Work Order's office-typed marks, or the client's signature with the visit's client verification.
days[].care_logs[].comparisons[].only_care_log array of string, required
Task codes done on the care log and not marked on the Work Order.
days[].care_logs[].comparisons[].only_work_order array of string, required
Task codes marked on the Work Order and not done on the care log.
days[].care_logs[].comparisons[].state string, required
The comparison's state.
days[].care_logs[].comparisons[].visit_id string
The visit it was compared with, when one was.
days[].care_logs[].end string
Its end (the linked visit's, else entered).
days[].care_logs[].service_type string, required
Its service.
days[].care_logs[].shift_number integer, required
Its shift of the day.
days[].care_logs[].source string, required
How the care log was captured.
days[].care_logs[].start string
Its start (the linked visit's, else entered).
days[].claim_changes array of object, required
days[].claim_changes[].batch_id string, required
The claim's batch.
days[].claim_changes[].care_log_ids array of string, required
The care logs of the day that changed.
days[].claim_changes[].claim_id string, required
The claim sent before the day's care log changed.
days[].claim_changes[].fingerprint string, required
The warning's fingerprint; dismiss it through POST /api/v1/revenue-warnings/dismissals with the claim_id as subject_id.
days[].claim_changes[].kind string, required
changed_after_claim.
days[].claim_changes[].state string, required
Whether the warning is open or dismissed.
days[].date string, required
The day (Mountain).
days[].dismissals array of object, required
days[].dismissals[].conflict_key string, required
The conflict dismissed.
days[].dismissals[].dismissed_at string, required
When it was dismissed.
days[].dismissals[].dismissed_by string, required
Who dismissed it.
days[].dismissals[].dismissed_by_user_id string
The member who dismissed it; null for an API key.
days[].dismissals[].reason string, required
Why it was dismissed.
days[].open_conflict_keys array of string, required
The keys of the day's visit, care-log and timesheet-drift conflicts nobody has dismissed.
days[].sources array of object, required
days[].sources[].source string, required
The evidence source; paper_scan, on a day with no visit, is the times of its paper-scan care log.
days[].sources[].visits array of object, required
days[].sources[].visits[].care_log_id string
On a paper_scan row, the paper-scan care log whose times it shows.
days[].sources[].visits[].conflict_key string
The entry's conflict key, on a conflict only.
days[].sources[].visits[].end string
Its billable end; null while it is open.
days[].sources[].visits[].procedure_code string
Its procedure code.
days[].sources[].visits[].start string
Its billable start (adjusted, else actual).
days[].sources[].visits[].state string, required
The state of the reconciliation entry the visit is in.
days[].sources[].visits[].visit_id string, required
The visit; null on a paper_scan row, which has none.
days[].state string, required
The day's state, the worst of its entries; none with no evidence.
days[].timesheet_drifts array of object, required
Deprecated, always empty: a Timesheet day now references the day's care log itself, so the two cannot differ. Kept for one release; read nothing from it.
days[].timesheet_drifts[].care_log_id string, required
The care log of the day.
days[].timesheet_drifts[].conflict_key string, required
The drift's key, built from the differing values; dismiss it through POST /api/v1/evidence-dismissals (or the month through POST /api/v1/clients/{id}/evidence/dismissals).
days[].timesheet_drifts[].dismissed boolean, required
Whether it has been dismissed.
days[].timesheet_drifts[].fields array of string, required
The fields that differ: time_in, time_out or tasks.
days[].timesheet_drifts[].only_other array of string, required
Task names done on the other record and not on the timesheet.
days[].timesheet_drifts[].only_timesheet array of string, required
Task names done on the timesheet and not on the other record.
days[].timesheet_drifts[].other object, required
days[].timesheet_drifts[].other.tasks array of string, required
The names of the tasks marked done that day.
days[].timesheet_drifts[].other.time_in string, required
Time In, Mountain, HH:MM; null when it has none.
days[].timesheet_drifts[].other.time_out string, required
Time Out, Mountain, HH:MM; null when it has none.
days[].timesheet_drifts[].source string, required
What the returned timesheet's day was compared with: the care log, or the Work Order entry and marks assembled from it.
days[].timesheet_drifts[].state string, required
Whether the warning is open or dismissed.
days[].timesheet_drifts[].timesheet object, required
days[].timesheet_drifts[].timesheet.tasks array of string, required
The names of the tasks marked done that day.
days[].timesheet_drifts[].timesheet.time_in string, required
Time In, Mountain, HH:MM; null when it has none.
days[].timesheet_drifts[].timesheet.time_out string, required
Time Out, Mountain, HH:MM; null when it has none.
days[].timesheet_drifts[].timesheet_id string, required
The month's returned timesheet.
days[].visit_evidence string, required
The day's visit evidence: visits when it has one, else paper_scan when a paper-scan care log holds its times, else none.
month string, required
YYYY-MM.
open_conflicts integer, required
How many conflicts in the month are open.

ClientMonthEvidenceCareLog

attestation_method string
How the client or representative signed it, if they did.
attestation_skip_reason string
Why the client could not sign, when the caregiver said.
care_log_id string, required
The care log.
comparisons array of object, required
comparisons[].conflict_key string
The conflict's key, on a conflict only; dismiss it as a visit conflict is dismissed.
comparisons[].fields array of string, required
On a conflict, the fields that differ: start, end, tasks or attestation.
comparisons[].kind string, required
What was compared: the care log's times with the visit evidence, its done tasks with the Work Order's office-typed marks, or the client's signature with the visit's client verification.
comparisons[].only_care_log array of string, required
Task codes done on the care log and not marked on the Work Order.
comparisons[].only_work_order array of string, required
Task codes marked on the Work Order and not done on the care log.
comparisons[].state string, required
The comparison's state.
comparisons[].visit_id string
The visit it was compared with, when one was.
end string
Its end (the linked visit's, else entered).
service_type string, required
Its service.
shift_number integer, required
Its shift of the day.
source string, required
How the care log was captured.
start string
Its start (the linked visit's, else entered).

ClientMonthEvidenceCareLogComparison

conflict_key string
The conflict's key, on a conflict only; dismiss it as a visit conflict is dismissed.
fields array of string, required
On a conflict, the fields that differ: start, end, tasks or attestation.
kind string, required
What was compared: the care log's times with the visit evidence, its done tasks with the Work Order's office-typed marks, or the client's signature with the visit's client verification.
only_care_log array of string, required
Task codes done on the care log and not marked on the Work Order.
only_work_order array of string, required
Task codes marked on the Work Order and not done on the care log.
state string, required
The comparison's state.
visit_id string
The visit it was compared with, when one was.

ClientMonthEvidenceClaimChange

batch_id string, required
The claim's batch.
care_log_ids array of string, required
The care logs of the day that changed.
claim_id string, required
The claim sent before the day's care log changed.
fingerprint string, required
The warning's fingerprint; dismiss it through POST /api/v1/revenue-warnings/dismissals with the claim_id as subject_id.
kind string, required
changed_after_claim.
state string, required
Whether the warning is open or dismissed.

ClientMonthEvidenceDay

care_logs array of object, required
care_logs[].attestation_method string
How the client or representative signed it, if they did.
care_logs[].attestation_skip_reason string
Why the client could not sign, when the caregiver said.
care_logs[].care_log_id string, required
The care log.
care_logs[].comparisons array of object, required
care_logs[].comparisons[].conflict_key string
The conflict's key, on a conflict only; dismiss it as a visit conflict is dismissed.
care_logs[].comparisons[].fields array of string, required
On a conflict, the fields that differ: start, end, tasks or attestation.
care_logs[].comparisons[].kind string, required
What was compared: the care log's times with the visit evidence, its done tasks with the Work Order's office-typed marks, or the client's signature with the visit's client verification.
care_logs[].comparisons[].only_care_log array of string, required
Task codes done on the care log and not marked on the Work Order.
care_logs[].comparisons[].only_work_order array of string, required
Task codes marked on the Work Order and not done on the care log.
care_logs[].comparisons[].state string, required
The comparison's state.
care_logs[].comparisons[].visit_id string
The visit it was compared with, when one was.
care_logs[].end string
Its end (the linked visit's, else entered).
care_logs[].service_type string, required
Its service.
care_logs[].shift_number integer, required
Its shift of the day.
care_logs[].source string, required
How the care log was captured.
care_logs[].start string
Its start (the linked visit's, else entered).
claim_changes array of object, required
claim_changes[].batch_id string, required
The claim's batch.
claim_changes[].care_log_ids array of string, required
The care logs of the day that changed.
claim_changes[].claim_id string, required
The claim sent before the day's care log changed.
claim_changes[].fingerprint string, required
The warning's fingerprint; dismiss it through POST /api/v1/revenue-warnings/dismissals with the claim_id as subject_id.
claim_changes[].kind string, required
changed_after_claim.
claim_changes[].state string, required
Whether the warning is open or dismissed.
date string, required
The day (Mountain).
dismissals array of object, required
dismissals[].conflict_key string, required
The conflict dismissed.
dismissals[].dismissed_at string, required
When it was dismissed.
dismissals[].dismissed_by string, required
Who dismissed it.
dismissals[].dismissed_by_user_id string
The member who dismissed it; null for an API key.
dismissals[].reason string, required
Why it was dismissed.
open_conflict_keys array of string, required
The keys of the day's visit, care-log and timesheet-drift conflicts nobody has dismissed.
sources array of object, required
sources[].source string, required
The evidence source; paper_scan, on a day with no visit, is the times of its paper-scan care log.
sources[].visits array of object, required
sources[].visits[].care_log_id string
On a paper_scan row, the paper-scan care log whose times it shows.
sources[].visits[].conflict_key string
The entry's conflict key, on a conflict only.
sources[].visits[].end string
Its billable end; null while it is open.
sources[].visits[].procedure_code string
Its procedure code.
sources[].visits[].start string
Its billable start (adjusted, else actual).
sources[].visits[].state string, required
The state of the reconciliation entry the visit is in.
sources[].visits[].visit_id string, required
The visit; null on a paper_scan row, which has none.
state string, required
The day's state, the worst of its entries; none with no evidence.
timesheet_drifts array of object, required
Deprecated, always empty: a Timesheet day now references the day's care log itself, so the two cannot differ. Kept for one release; read nothing from it.
timesheet_drifts[].care_log_id string, required
The care log of the day.
timesheet_drifts[].conflict_key string, required
The drift's key, built from the differing values; dismiss it through POST /api/v1/evidence-dismissals (or the month through POST /api/v1/clients/{id}/evidence/dismissals).
timesheet_drifts[].dismissed boolean, required
Whether it has been dismissed.
timesheet_drifts[].fields array of string, required
The fields that differ: time_in, time_out or tasks.
timesheet_drifts[].only_other array of string, required
Task names done on the other record and not on the timesheet.
timesheet_drifts[].only_timesheet array of string, required
Task names done on the timesheet and not on the other record.
timesheet_drifts[].other object, required
timesheet_drifts[].other.tasks array of string, required
The names of the tasks marked done that day.
timesheet_drifts[].other.time_in string, required
Time In, Mountain, HH:MM; null when it has none.
timesheet_drifts[].other.time_out string, required
Time Out, Mountain, HH:MM; null when it has none.
timesheet_drifts[].source string, required
What the returned timesheet's day was compared with: the care log, or the Work Order entry and marks assembled from it.
timesheet_drifts[].state string, required
Whether the warning is open or dismissed.
timesheet_drifts[].timesheet object, required
timesheet_drifts[].timesheet.tasks array of string, required
The names of the tasks marked done that day.
timesheet_drifts[].timesheet.time_in string, required
Time In, Mountain, HH:MM; null when it has none.
timesheet_drifts[].timesheet.time_out string, required
Time Out, Mountain, HH:MM; null when it has none.
timesheet_drifts[].timesheet_id string, required
The month's returned timesheet.
visit_evidence string, required
The day's visit evidence: visits when it has one, else paper_scan when a paper-scan care log holds its times, else none.

ClientMonthEvidenceDismissal

conflict_key string, required
The conflict dismissed.
dismissed_at string, required
When it was dismissed.
dismissed_by string, required
Who dismissed it.
dismissed_by_user_id string
The member who dismissed it; null for an API key.
reason string, required
Why it was dismissed.

ClientMonthEvidenceDismissed

caregiver_id string, required
The caregiver.
client_id string, required
The client.
dismissed integer, required
How many conflicts this request dismissed; 0 when none was open.
month string, required
YYYY-MM.

ClientMonthEvidenceDriftSide

tasks array of string, required
The names of the tasks marked done that day.
time_in string, required
Time In, Mountain, HH:MM; null when it has none.
time_out string, required
Time Out, Mountain, HH:MM; null when it has none.

ClientMonthEvidenceSource

source string, required
The evidence source; paper_scan, on a day with no visit, is the times of its paper-scan care log.
visits array of object, required
visits[].care_log_id string
On a paper_scan row, the paper-scan care log whose times it shows.
visits[].conflict_key string
The entry's conflict key, on a conflict only.
visits[].end string
Its billable end; null while it is open.
visits[].procedure_code string
Its procedure code.
visits[].start string
Its billable start (adjusted, else actual).
visits[].state string, required
The state of the reconciliation entry the visit is in.
visits[].visit_id string, required
The visit; null on a paper_scan row, which has none.

ClientMonthEvidenceTimesheetDrift

care_log_id string, required
The care log of the day.
conflict_key string, required
The drift's key, built from the differing values; dismiss it through POST /api/v1/evidence-dismissals (or the month through POST /api/v1/clients/{id}/evidence/dismissals).
dismissed boolean, required
Whether it has been dismissed.
fields array of string, required
The fields that differ: time_in, time_out or tasks.
only_other array of string, required
Task names done on the other record and not on the timesheet.
only_timesheet array of string, required
Task names done on the timesheet and not on the other record.
other object, required
other.tasks array of string, required
The names of the tasks marked done that day.
other.time_in string, required
Time In, Mountain, HH:MM; null when it has none.
other.time_out string, required
Time Out, Mountain, HH:MM; null when it has none.
source string, required
What the returned timesheet's day was compared with: the care log, or the Work Order entry and marks assembled from it.
state string, required
Whether the warning is open or dismissed.
timesheet object, required
timesheet.tasks array of string, required
The names of the tasks marked done that day.
timesheet.time_in string, required
Time In, Mountain, HH:MM; null when it has none.
timesheet.time_out string, required
Time Out, Mountain, HH:MM; null when it has none.
timesheet_id string, required
The month's returned timesheet.

ClientMonthEvidenceVisit

care_log_id string
On a paper_scan row, the paper-scan care log whose times it shows.
conflict_key string
The entry's conflict key, on a conflict only.
end string
Its billable end; null while it is open.
procedure_code string
Its procedure code.
start string
Its billable start (adjusted, else actual).
state string, required
The state of the reconciliation entry the visit is in.
visit_id string, required
The visit; null on a paper_scan row, which has none.

ClientNote

A note in a client's communication log: when the agency was in touch, with whom, about which caregivers, and what was said. written_via names the channel that last changed its text: mcp or api, or none for the HomeCareBilling app.

attachment_count integer
How many files are attached; the files are not returned.
caregiver_ids array of string
The agency's caregivers the note concerns (their ids). A caregiver of another agency is refused.
client_id string, required
The client the note is about.
contact_types array of string, required
Every party the contact was with, one or more: the consumer, the case manager, an employee, or other.
employee_names array of string
Employees the note names who are not linked from the caregiver list (caregiver_ids).
id string, required
The record's id.
inserted_at string
When the note was created.
manager_initials string
The initials of who took the note (taken by).
note_date string, required
The day of the contact.
note_text string, required
What was said or done.
time_of_contact string
The time of the contact, HH:MM or HH:MM:SS, as typed (no time zone).
updated_at string
When the note last changed.
written_via string
The channel that last changed the note's text (mcp, api); none for the HomeCareBilling app.

ClientNoteInput

Fields to set. A create needs note_date, contact_types and note_text; manager_initials defaults to the API key's user's initials. An update sends only what changes, and must change something. Notes carry no lock_version.

caregiver_ids array of string
The agency's caregivers the note concerns (their ids). A caregiver of another agency is refused.
contact_types array of string
Every party the contact was with, one or more: the consumer, the case manager, an employee, or other.
employee_names array of string
Employees the note names who are not linked from the caregiver list (caregiver_ids).
manager_initials string
The initials of who took the note (taken by).
note_date string
The day of the contact.
note_text string
What was said or done.
time_of_contact string
The time of the contact, HH:MM or HH:MM:SS, as typed (no time zone).

ClientNotePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ClientNote, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ClientOtherService

One outside provider serving the client; the scheduler reads its days so a caregiver is not booked over it.

address string
The provider's address.
client_id string, required
The client.
company string
The provider's company.
days array of string, required
The weekdays it comes, as su mo tu we th fr sa, in week order.
description string
What the provider does for the client.
id string, required
The record's id.
inserted_at string
When it was recorded.
kind string, required
Adult day care, a CNA, an RN, PT, or another.
phone string
The provider's phone.
times object, required
A time for a chosen day, keyed by its code; a day with none is absent.
times.fr string
The time on Friday.
times.mo string
The time on Monday.
times.sa string
The time on Saturday.
times.su string
The time on Sunday.
times.th string
The time on Thursday.
times.tu string
The time on Tuesday.
times.we string
The time on Wednesday.
updated_at string
When it last changed.

ClientOtherServiceInput

A record with no kind, an unknown day, or a field past its length answers 422 naming the field.

address string
The provider's address, at most 255 characters.
company string
The provider's company, at most 255 characters.
days array of string
The weekdays it comes, any of su mo tu we th fr sa; stored in week order, each once.
description string
What the provider does, at most 2000 characters.
kind string
Required on a create: adult_day, cna, rn, pt or other.
phone string
The provider's phone, at most 255 characters.
times object
A time for a chosen day, keyed by its code, at most 50 characters; a time for a day not chosen is dropped.
times.fr string
The time on Friday.
times.mo string
The time on Monday.
times.sa string
The time on Saturday.
times.su string
The time on Sunday.
times.th string
The time on Thursday.
times.tu string
The time on Tuesday.
times.we string
The time on Wednesday.

ClientOtherServicePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ClientOtherService, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ClientPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Client, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ClientRelation

"Maria Lopez is the client's responsible party since 2025-03-01". ends_on null means current; a current relation of a kind the client holds one of (responsible_party, representative, case_manager, case_manager_supervisor, cma_office) is replaced, never doubled.

client_id string, required
The client.
contact object, required
A responsible party, representative, emergency contact, case manager, physician, pharmacy or key holder. One contact can serve several clients; an edit reaches every one of them.
contact.address string
contact.address_line_2 string
Apartment, suite or unit.
contact.alt_phone string
A second phone, 10 digits.
contact.caregiver_id string
The caregiver this person is, when the contact is one.
contact.city string
contact.client_ids array of string
On a merge's answer only: the clients those relations serve; each one's page shows this contact.
contact.email string
contact.fax string
10 digits.
contact.first_name string
contact.id string, required
The record's id.
contact.inserted_at string
When it was recorded.
contact.last_name string
contact.lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
contact.organization string
The organization, such as the pharmacy's name or a CMA office's county.
contact.phone string
10 digits.
contact.relation_ids array of string
On a merge's answer only: the relations the merge moved onto this contact.
contact.state string
contact.updated_at string
When it last changed.
contact.zip string
5 digits or ZIP+4.
contact_id string, required
The contact.
ends_on string
Until when; null while current.
id string, required
The record's id.
inserted_at string
When it was recorded.
kind string, required
What the person is to the client.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
notes string
rank integer, required
The order among the client's current relations of the kind: emergency contact 1, 2, 3.
relationship string
The relationship, as a closed value.
relationship_label string
The relationship as the agency wrote it, such as "Daughter".
starts_on string
Since when; null when the date is not known.
updated_at string
When it last changed.

ClientRelationEnd

ends_on string
YYYY-MM-DD; today (Mountain) when left out.

ClientRelationInput

Name the person by contact_id (a contact already on file, on a client you may open) or give its fields as contact. An unknown kind, or a contact with every field blank, answers 422 naming the field.

contact object
The new contact's fields, when contact_id is not sent.
contact.address string
contact.address_line_2 string
Apartment, suite or unit.
contact.alt_phone string
A second phone, 10 digits.
contact.city string
contact.email string
contact.fax string
10 digits.
contact.first_name string
contact.last_name string
contact.lock_version integer
Required on PATCH /api/v1/contacts/{id}: the value it was read with; if it changed since, the answer is 409 stale_record. Not read inside a new relation's contact.
contact.organization string
The organization, such as the pharmacy's name or, for a CMA office, a Colorado county.
contact.phone string
10 digits.
contact.state string
contact.zip string
5 digits or ZIP+4.
contact_id string
A contact already on file.
kind string, required
What the person is to the client.
notes string
rank integer
The order among the client's current relations of the kind, 1 when left out. A current relation of the same kind and rank is ended by the new one. Current ranks stay contiguous: a rank past the kind's last current one becomes the next free rank, which the response carries.
relationship string
The relationship as a closed value; read from relationship_label when left out.
relationship_label string
The relationship as the agency writes it, such as "Daughter".
replaces object
The current relation this one replaces, as it was read. Required when the kind is one the client holds one of (responsible_party, representative, case_manager, case_manager_supervisor, cma_office) and the client has a current one; left out, or naming a relation no longer current or at an old lock_version, it answers 409 stale_record and nothing is saved.
replaces.id string, required
The current relation's id.
replaces.lock_version integer, required
Its lock_version, as read.
starts_on string
Since when; today (Mountain) when left out.

ClientRelationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ClientRelation, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ClientSupervisoryPlan

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
planned_supervisory_day integer
One day of the month for all four quarters, used only when no per-quarter field is sent. A day needs a month.
planned_supervisory_offset integer
One month of the quarter (1, 2 or 3) for all four quarters, used only when no per-quarter field is sent. null clears every quarter's month.
planned_supervisory_q1_day integer
Quarter 1's planned day of that month, 1-31. null leaves the day unchosen. A day needs planned_supervisory_q1_offset.
planned_supervisory_q1_offset integer
Quarter 1's planned month: 1, 2 or 3, the month of that quarter. null, with planned_supervisory_q1_day null too, leaves quarter 1 unplanned.
planned_supervisory_q2_day integer
Quarter 2's planned day of that month, 1-31. null leaves the day unchosen. A day needs planned_supervisory_q2_offset.
planned_supervisory_q2_offset integer
Quarter 2's planned month: 1, 2 or 3, the month of that quarter. null, with planned_supervisory_q2_day null too, leaves quarter 2 unplanned.
planned_supervisory_q3_day integer
Quarter 3's planned day of that month, 1-31. null leaves the day unchosen. A day needs planned_supervisory_q3_offset.
planned_supervisory_q3_offset integer
Quarter 3's planned month: 1, 2 or 3, the month of that quarter. null, with planned_supervisory_q3_day null too, leaves quarter 3 unplanned.
planned_supervisory_q4_day integer
Quarter 4's planned day of that month, 1-31. null leaves the day unchosen. A day needs planned_supervisory_q4_offset.
planned_supervisory_q4_offset integer
Quarter 4's planned month: 1, 2 or 3, the month of that quarter. null, with planned_supervisory_q4_day null too, leaves quarter 4 unplanned.

ClientWriteResult

data Client, required
warnings array of object, required
What the write was saved despite, one item per finding: medicaid_id_pending on field medicaid_id (a Medicaid client with no Medicaid ID yet, which cannot be billed until it is added); medicaid_id_removed on field medicaid_id (an update erased the Medicaid ID the client had); client_care.status_off_path on field status (an update moved the status to one the usual path does not offer from the old status; the move was saved); client_care.active_without_start_date on field service_start_date (the saved client is active with no service start date: a create, whose status defaults to active, or an update that made it active).
warnings[].code string, required
warnings[].field string
warnings[].message string, required

CloseDocument

generated_at string, required
When it was generated.
id string, required
The record's id.
summary object, required
The snapshot: client and caregiver, service, month, close reason and date, hours and billing code. Its close notes are left out, as from every Work Order read.
work_order_id string, required
The Work Order it closes.

Complaint

A complaint about the agency's care, from intake to resolution. The status moves intake, investigating, interviewing, visiting, following up, resolved; closed from any open phase. A move to a phase fills in its date when none is given.

answers object
The answers recorded, by the agency's question key.
caregiver_id string
The caregiver it concerns, if any.
caregiver_interview_date string
When the caregiver was interviewed.
caregiver_name string
The caregiver's name, as recorded.
case_manager_followup_date string
When the case manager followed up.
client_id string, required
The client the complaint is about.
client_name string
The client's name, as recorded on the complaint.
complainant_name string
Who complained.
complaint_date string
The day it was received.
complaint_location string
Where it arose.
id string, required
The record's id.
inserted_at string
When the complaint was logged.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
missing_signers array of object
Each required line no live signature fills yet, in order; empty when complete or voided.
missing_signers[].label string, required
The line as the page names it, e.g. "client or authorized representative".
missing_signers[].roles array of string, required
The roles that would fill the line: any one of them.
proposed_resolution string
The resolution proposed.
record_state string
Where the complaint stands as a signed record (US-101.31): draft (it changes here), signed or amended (locked: only its status moves; corrected with an addendum, or voided and copied into a new draft on the complaint page), voided. signing_complete says whether every required line is signed.
resolution_date string
When it was resolved.
signatures array of object
The live signatures, oldest first.
signatures[].method string, required
How it was signed.
signatures[].role string, required
The line signed.
signatures[].signed_at string, required
When.
signatures[].signer_name string, required
Who signed.
signed_at string
When the first signature locked it; null on a draft.
signing_complete boolean
True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
status string, required
The complaint's phase.
supervisory_visit_date string
When the supervisory visit took place.
updated_at string
When the complaint last changed.

ComplaintCreate

Logs a complaint at intake for a client of the agency. client_id is required; caregiver_id is optional; complaint_date defaults to today.

answers object
Answers by the agency's question key: text, true or false for a yes/no, or a list of choices. An empty answer clears it.
caregiver_id string
The caregiver it concerns, if any.
client_id string, required
The client the complaint is about.
complainant_email string
The complainant's email. Written, never returned.
complainant_name string
Who complained.
complainant_phone string
The complainant's phone. Written, never returned.
complaint_date string
The day it was received.
complaint_location string
Where it arose.
proposed_resolution string
The resolution proposed.

ComplaintInput

Fields to change, plus the lock_version read (required). status moves only along the complaint's phases (422 invalid_transition otherwise); a move fills in that phase's date when none is sent or stored.

answers object
Answers by the agency's question key: text, true or false for a yes/no, or a list of choices. An empty answer clears it.
caregiver_interview_date string
When the caregiver was interviewed.
case_manager_followup_date string
When the case manager followed up.
complainant_name string
Who complained.
complaint_date string
The day it was received.
complaint_location string
Where it arose.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
proposed_resolution string
The resolution proposed.
resolution_date string
When it was resolved.
status string
The complaint's phase.
supervisory_visit_date string
When the supervisory visit took place.

ComplaintPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Complaint, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ComplaintSignature

role string, required
Whose line to sign: office, the investigator, signed as you. The complainant's line (client when the complainant is the client, representative for anyone else) is drawn on the device in the app and answers 422 drawn_required here.

ComplianceAlert

One caregiver with the asked-for kind of compliance problem: who, their credential dates, and their training and annual-evaluation standing.

alert_types array of string
Every kind of compliance problem the caregiver has (US-109.14), of the seven alert_type values.
caregiver_name string
The caregiver's name.
credentials object
Credential dates by credential.
evaluation object
evaluation.last_evaluation_date string
The last evaluation.
evaluation.status string
The annual evaluation's standing.
id string, required
The record's id.
training_status string
Training standing.

ComplianceAlertPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ComplianceAlert, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ConnectedApp

app_name string, required
The AI app.
connected_at string
When it was connected (UTC).
id string, required
The record's id.
last_used_at string
Its last request (UTC).
scopes array of string
What it may do.
user_email string
Their email.
user_id string, required
The member who connected it.

ConnectedAppPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].app_name string, required
The AI app.
data[].connected_at string
When it was connected (UTC).
data[].id string, required
The record's id.
data[].last_used_at string
Its last request (UTC).
data[].scopes array of string
What it may do.
data[].user_email string
Their email.
data[].user_id string, required
The member who connected it.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ConnectedAppRevoked

id string, required
The record's id.
revoked_at string, required
When it was revoked (UTC).

Contact

A responsible party, representative, emergency contact, case manager, physician, pharmacy or key holder. One contact can serve several clients; an edit reaches every one of them.

address string
address_line_2 string
Apartment, suite or unit.
alt_phone string
A second phone, 10 digits.
caregiver_id string
The caregiver this person is, when the contact is one.
city string
client_ids array of string
On a merge's answer only: the clients those relations serve; each one's page shows this contact.
email string
fax string
10 digits.
first_name string
id string, required
The record's id.
inserted_at string
When it was recorded.
last_name string
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
organization string
The organization, such as the pharmacy's name or a CMA office's county.
phone string
10 digits.
relation_ids array of string
On a merge's answer only: the relations the merge moved onto this contact.
state string
updated_at string
When it last changed.
zip string
5 digits or ZIP+4.

ContactHistoryEntry

One edit of a contact: when it was saved, who saved it, and the names of the fields it changed. The values themselves, old or new, are never returned.

changed_fields array of string, required
The names of the fields the edit changed, sorted.
inserted_at string, required
When the edit was saved.
user_name string, required
The member who saved it, or "System" when no member is recorded.

ContactHistoryPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ContactHistoryEntry, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ContactInput

The new contact's fields, when contact_id is not sent.

address string
address_line_2 string
Apartment, suite or unit.
alt_phone string
A second phone, 10 digits.
city string
email string
fax string
10 digits.
first_name string
last_name string
lock_version integer
Required on PATCH /api/v1/contacts/{id}: the value it was read with; if it changed since, the answer is 409 stale_record. Not read inside a new relation's contact.
organization string
The organization, such as the pharmacy's name or, for a CMA office, a Colorado county.
phone string
10 digits.
state string
zip string
5 digits or ZIP+4.

ContactMerge

loser_ids array of string, required
The contacts that are the same person as the one in the path: each one's relations move to it and it is deleted. 1 to 50 ids, not including the path's.

ContactPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Contact, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Critical incidentPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of CriticalIncident, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

CriticalIncident

A critical incident the agency recorded: what happened, who was told, and how it was followed up. The status moves draft, reported, under investigation, resolved; closed from any active phase.

action_steps_taken string
What was done at once.
caregiver_id string
The caregiver involved, if any.
client_id string, required
The client the incident is about.
follow_up_plan string
The follow-up plan.
id string, required
The record's id.
incident_date string
The day it happened.
incident_description string
What happened.
incident_location string
Where it happened.
incident_time string
The time it happened, HH:MM:SS.
incident_type string
The kind of incident.
inserted_at string
When the incident was recorded.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
missing_signers array of object
Each required line no live signature fills yet, in order; empty when complete or voided.
missing_signers[].label string, required
The line as the page names it, e.g. "client or authorized representative".
missing_signers[].roles array of string, required
The roles that would fill the line: any one of them.
notifications object
Who was notified: the case manager, family and HCPF.
notifications.case_manager object
notifications.case_manager.date string
When.
notifications.case_manager.notified boolean
Whether they were notified; null when not recorded.
notifications.family object
notifications.family.date string
When.
notifications.family.notified boolean
Whether they were notified; null when not recorded.
notifications.hcpf object
notifications.hcpf.date string
When.
notifications.hcpf.notified boolean
Whether they were notified; null when not recorded.
record_state string
Where the incident stands as a signed record (US-101.31): draft (it changes here), signed or amended (locked: only its status moves; corrected with an addendum, or voided), voided. signing_complete says whether every required line is signed: the office line (reported by) and the supervisor review.
referrals array of object
The referrals made; a list sent replaces the one stored.
referrals[].contact_name string
The contact's name.
referrals[].contact_phone string
The contact's phone.
referrals[].type string
Who the referral went to.
referrals_made string
The referrals made, as text.
reports object
The mandatory reports: APS, CPS, CDPHE and law enforcement, plus other reports as text.
reports.aps object
reports.aps.date string
When.
reports.aps.reported boolean
Whether it was reported; null when not recorded.
reports.aps.worker_name string
The worker who took the report.
reports.cdphe object
reports.cdphe.date string
When.
reports.cdphe.reported boolean
Whether it was reported; null when not recorded.
reports.cdphe.worker_name string
The worker who took the report.
reports.cps object
reports.cps.date string
When.
reports.cps.reported boolean
Whether it was reported; null when not recorded.
reports.cps.worker_name string
The worker who took the report.
reports.law_enforcement object
reports.law_enforcement.date string
When.
reports.law_enforcement.reported boolean
Whether it was reported; null when not recorded.
reports.other string
Other reports made.
signatures array of object
The live signatures, oldest first.
signatures[].method string, required
How it was signed.
signatures[].role string, required
The line signed.
signatures[].signed_at string, required
When.
signatures[].signer_name string, required
Who signed.
signed_at string
When the first signature locked it; null on a draft.
signing_complete boolean
True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
status string, required
The incident's phase.
updated_at string
When the incident last changed.

CriticalIncidentCreate

Reports a draft incident for a client of the agency, reported by the API key's user. client_id and what happened (date, type, location, description, the steps taken at once) are required; caregiver_id is optional.

action_steps_taken string, required
What was done at once.
caregiver_id string
The caregiver involved, if any.
client_id string, required
The client the incident is about.
follow_up_plan string
The follow-up plan.
incident_date string, required
The day it happened.
incident_description string, required
What happened.
incident_location string, required
Where it happened.
incident_time string
The time it happened, HH:MM:SS.
incident_type string, required
The kind of incident.
notifications object
Who was notified: the case manager, family and HCPF.
notifications.case_manager object
notifications.case_manager.date string
When.
notifications.case_manager.notified boolean
Whether they were notified; null when not recorded.
notifications.family object
notifications.family.date string
When.
notifications.family.notified boolean
Whether they were notified; null when not recorded.
notifications.hcpf object
notifications.hcpf.date string
When.
notifications.hcpf.notified boolean
Whether they were notified; null when not recorded.
referrals array of object
The referrals made; a list sent replaces the one stored.
referrals[].contact_name string
The contact's name.
referrals[].contact_phone string
The contact's phone.
referrals[].type string
Who the referral went to.
referrals_made string
The referrals made, as text.
reports object
The mandatory reports: APS, CPS, CDPHE and law enforcement, plus other reports as text.
reports.aps object
reports.aps.date string
When.
reports.aps.reported boolean
Whether it was reported; null when not recorded.
reports.aps.worker_name string
The worker who took the report.
reports.cdphe object
reports.cdphe.date string
When.
reports.cdphe.reported boolean
Whether it was reported; null when not recorded.
reports.cdphe.worker_name string
The worker who took the report.
reports.cps object
reports.cps.date string
When.
reports.cps.reported boolean
Whether it was reported; null when not recorded.
reports.cps.worker_name string
The worker who took the report.
reports.law_enforcement object
reports.law_enforcement.date string
When.
reports.law_enforcement.reported boolean
Whether it was reported; null when not recorded.
reports.other string
Other reports made.

CriticalIncidentInput

Fields to change, plus the lock_version read (required). reports and notifications hold only the legs and fields being changed, merged over what is stored; referrals replaces the list. status moves only along the incident's transitions (422 invalid_transition otherwise).

action_steps_taken string
What was done at once.
follow_up_plan string
The follow-up plan.
incident_date string
The day it happened.
incident_description string
What happened.
incident_location string
Where it happened.
incident_time string
The time it happened, HH:MM:SS.
incident_type string
The kind of incident.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
notifications object
Who was notified: the case manager, family and HCPF.
notifications.case_manager object
notifications.case_manager.date string
When.
notifications.case_manager.notified boolean
Whether they were notified; null when not recorded.
notifications.family object
notifications.family.date string
When.
notifications.family.notified boolean
Whether they were notified; null when not recorded.
notifications.hcpf object
notifications.hcpf.date string
When.
notifications.hcpf.notified boolean
Whether they were notified; null when not recorded.
referrals array of object
The referrals made; a list sent replaces the one stored.
referrals[].contact_name string
The contact's name.
referrals[].contact_phone string
The contact's phone.
referrals[].type string
Who the referral went to.
referrals_made string
The referrals made, as text.
reports object
The mandatory reports: APS, CPS, CDPHE and law enforcement, plus other reports as text.
reports.aps object
reports.aps.date string
When.
reports.aps.reported boolean
Whether it was reported; null when not recorded.
reports.aps.worker_name string
The worker who took the report.
reports.cdphe object
reports.cdphe.date string
When.
reports.cdphe.reported boolean
Whether it was reported; null when not recorded.
reports.cdphe.worker_name string
The worker who took the report.
reports.cps object
reports.cps.date string
When.
reports.cps.reported boolean
Whether it was reported; null when not recorded.
reports.cps.worker_name string
The worker who took the report.
reports.law_enforcement object
reports.law_enforcement.date string
When.
reports.law_enforcement.reported boolean
Whether it was reported; null when not recorded.
reports.other string
Other reports made.
status string
The incident's phase.

CriticalIncidentSignature

role string, required
Whose line to sign, as you: office (reported by) or supervisor (supervisor review).

CsvMapping

mapping object, required
Claim field (the read lists them) to the agency's column name, such as {"member_id": "Medicaid #"}; a field left out, or mapped to a blank column, reads its own name.
optional_fields array of string, required
The claim fields an upload may carry.
required_fields array of string, required
The claim fields an upload must carry.

CsvMappingUpdate

mapping object, required
Claim field (the read lists them) to the agency's column name, such as {"member_id": "Medicaid #"}; a field left out, or mapped to a blank column, reads its own name.

DeletedPlanOfCare

deleted_at string, required
When it was deleted (UTC).
id string, required
The record's id.

DeletedSatisfactionSurvey

deleted_at string, required
When it was deleted (UTC).
id string, required
The record's id.

DeletedVisit

data Visit, required
meta object, required
meta.exceptions_dismissed integer, required
meta.links VisitDeleteLinks, required
warnings array of object, required
What the delete left resting on the visit, in words (US-116.18), beside meta.links; usually empty. Never a refusal: the visit is deleted. Each id is one of visits.delete_keeps_entry_times (one item for the timesheet entries whose EVV times came from it) and visits.delete_reopens_month (one per Work Order month its signature alone froze, open to edits again).
warnings[].fix object
Where it is fixed, when a page fixes it.
warnings[].fix.label string, required
What the link says.
warnings[].fix.path string, required
The app route that fixes it.
warnings[].id string, required
The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
warnings[].message string, required
For a person to read.

Denial

A claim Colorado Medicaid did not pay, with the reasons it gave.

adjustment_codes array of object
The claim adjustment reason codes (CARC) on the remittance.
adjustment_codes[].amount string
The amount adjusted.
adjustment_codes[].group_code string
The CARC group code, such as CO or PR.
adjustment_codes[].meaning string
What Colorado Medicaid's code means, in plain English.
adjustment_codes[].reason_code string
The CARC reason code, such as 45.
adjustment_reason_codes array of string
Claim adjustment reason codes.
batch_id string, required
The batch the claim belongs to.
charge_amount string
Amount billed.
claim_frequency string
CLM05-3: 1 bills a new claim, 7 replaces a paid claim, 8 voids one.
diagnosis_code_1 string
diagnosis_code_2 string
diagnosis_code_3 string
diagnosis_code_4 string
duplicate_of_claim_id string
evv_validation_status string
icn string
HCPF's internal control number.
id string, required
The record's id.
investigation_status string
Where the agency's investigation of a denial stands.
member_id string
The Medicaid member id.
modifier_1 string
modifier_2 string
modifier_3 string
modifier_4 string
original_icn string
The ICN of the paid claim an uploaded replace (7) or void (8) row named.
paid_amount string
Amount paid.
paid_date string
par_number string
The prior authorization request number.
patient_account_number string
patient_first_name string
patient_last_name string
payment_status_code string
place_of_service string
procedure_code string
The HCPCS code billed.
reconciled_at string
When it was marked reconciled with its payment, if it was.
remark_codes array of object
The remittance advice remark codes (RARC) on the remittance.
remark_codes[].code string
The RARC, such as N821.
remark_codes[].meaning string
What the remark code means, in plain English.
replaced_account_number string
The account number the uploaded file gave this claim, when another row or a claim in progress or paid already used it and it was not kept; patient_account_number is the claim's own.
resolution_notes string
The agency's notes on resolving a denial.
row_number integer
Its row in the uploaded file.
service_date_from string
service_date_to string
status string, required
unit_type string
units string
Units billed.
updated_at string
When the record last changed.
validation_errors array of object
Why the claim is invalid, if it is.
validation_errors[].code string
Stable, e.g. required or invalid_format.
validation_errors[].field string
The claim field.
validation_errors[].message string
For a person to read.

DenialPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Denial, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

DocuSignAgencyConnection

The agency's own DocuSign connection, null when it never connected. A disconnected one stays here for its history; account_kind says which account a send goes through.

account_name string
The DocuSign account's name.
connect_hmac_key_set boolean, required
Whether a Connect HMAC key is stored. The key itself is never shown.
connect_hmac_key_set_at string
When the Connect HMAC key was stored.
connected_at string
When it was connected.
connected_by string
Who connected it.
disconnected_at string
When it was disconnected.
docusign_account_id string
The DocuSign account id.
docusign_user_email string
The DocuSign user who connected it.
status string, required
The agency's own DocuSign connection.

DocuSignConnectHmacKey

hmac_key string, required
The HMAC key from the agency's DocuSign Connect configuration, which must be 16 to 256 characters with no spaces. It is stored encrypted and never shown again.

DocuSignEnvelope

account_kind string, required
The DocuSign account it was sent through.
completed_at string
When every signer had signed.
id string, required
The envelope's id.
recipients array of object, required
Its signers.
recipients[].email string, required
Where DocuSign sent the signing link.
recipients[].name string, required
The signer's name.
recipients[].role string, required
Who signs.
record_id string
The record's id.
record_type string
The record's type.
sent_at string
When DocuSign accepted it.
status string, required
Where the envelope is.

DocuSignEnvelopePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].account_kind string, required
The DocuSign account it was sent through.
data[].completed_at string
When every signer had signed.
data[].id string, required
The envelope's id.
data[].recipients array of object, required
Its signers.
data[].recipients[].email string, required
Where DocuSign sent the signing link.
data[].recipients[].name string, required
The signer's name.
data[].recipients[].role string, required
Who signs.
data[].record_id string
The record's id.
data[].record_type string
The record's type.
data[].sent_at string
When DocuSign accepted it.
data[].status string, required
Where the envelope is.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

DocuSignEnvelopeRecipient

email string, required
Where DocuSign sent the signing link.
name string, required
The signer's name.
role string, required
Who signs.

DocuSignEnvelopeSent

account_kind string, required
The DocuSign account it was sent through.
available_balance_microdollars integer
A send through HomeCareBilling's account: the prepaid credit left after the hold.
completed_at string
When every signer had signed.
id string, required
The envelope's id.
price_microdollars integer
A send through HomeCareBilling's account: the prepaid credit held for it, in millionths of a dollar.
recipients array of object, required
Its signers.
recipients[].email string, required
Where DocuSign sent the signing link.
recipients[].name string, required
The signer's name.
recipients[].role string, required
Who signs.
record_id string
The record's id.
record_type string
The record's type.
sent_at string
When DocuSign accepted it.
status string, required
Where the envelope is.

DocuSignOwnKey

integration_key string, required
The integration key of a Private custom integration in the agency's own DocuSign account: must be a UUID, as DocuSign shows it. It is stored encrypted and never shown again.
secret_key string, required
The secret of that integration key, which must be 8 to 256 characters with no spaces. It is stored encrypted and never shown again.

DocuSignRecipientInput

email string, required
Where DocuSign sends the signing link.
name string, required
The signer's name, as it prints.
role string, required
Who signs.

DocuSignSend

recipients array of object
Who signs. Left out, the record's client and its designated representative, where the record has a representative's line, each with an email on file, as the page's Send dialog offers them.
recipients[].email string, required
Where DocuSign sends the signing link.
recipients[].name string, required
The signer's name, as it prints.
recipients[].role string, required
Who signs.

DocuSignSettings

account_kind string, required
The account a send goes through: the agency's own, HomeCareBilling's (paid from prepaid credit), or null when neither is available.
agency_connection object, required
The agency's own DocuSign connection, null when it never connected. A disconnected one stays here for its history; account_kind says which account a send goes through.
agency_connection.account_name string
The DocuSign account's name.
agency_connection.connect_hmac_key_set boolean, required
Whether a Connect HMAC key is stored. The key itself is never shown.
agency_connection.connect_hmac_key_set_at string
When the Connect HMAC key was stored.
agency_connection.connected_at string
When it was connected.
agency_connection.connected_by string
Who connected it.
agency_connection.disconnected_at string
When it was disconnected.
agency_connection.docusign_account_id string
The DocuSign account id.
agency_connection.docusign_user_email string
The DocuSign user who connected it.
agency_connection.status string, required
The agency's own DocuSign connection.
own_key_set boolean, required
Whether the agency has saved its own DocuSign integration key, which Connect and every token refresh then run under. The key and its secret are never shown.
own_key_set_at string
When the agency's own key was saved.
platform_price_microdollars integer
What one envelope costs in prepaid credit, in millionths of a dollar, when sends go through HomeCareBilling's account.
status string, required
The agency's own DocuSign connection: agency_connection.status, or none when it never connected.

ElectronicEvidenceCaregivers

data array of object, required
data[].client_days integer, required
The caregiver's worked client-days in the month.
data[].electronic_days integer, required
Of those, the days with electronic evidence.
data[].id string
The caregiver; null once the caregiver is removed.
data[].name string
The caregiver's "Last, First".
data[].share number
electronic_days / client_days, 0 to 1; null with no worked day.
total integer, required
How many rows the month has.

ElectronicEvidenceCaregiversRow

client_days integer, required
The caregiver's worked client-days in the month.
electronic_days integer, required
Of those, the days with electronic evidence.
id string
The caregiver; null once the caregiver is removed.
name string
The caregiver's "Last, First".
share number
electronic_days / client_days, 0 to 1; null with no worked day.

ElectronicEvidenceClients

data array of object, required
data[].client_days integer, required
The client's worked client-days in the month.
data[].electronic_days integer, required
Of those, the days with electronic evidence.
data[].id string
The client; null once the client is removed.
data[].name string
The client's "Last, First".
data[].share number
electronic_days / client_days, 0 to 1; null with no worked day.
total integer, required
How many rows the month has.

ElectronicEvidenceClientsRow

client_days integer, required
The client's worked client-days in the month.
electronic_days integer, required
Of those, the days with electronic evidence.
id string
The client; null once the client is removed.
name string
The client's "Last, First".
share number
electronic_days / client_days, 0 to 1; null with no worked day.

ElectronicEvidenceReport

caregivers object, required
caregivers.data array of object, required
caregivers.data[].client_days integer, required
The caregiver's worked client-days in the month.
caregivers.data[].electronic_days integer, required
Of those, the days with electronic evidence.
caregivers.data[].id string
The caregiver; null once the caregiver is removed.
caregivers.data[].name string
The caregiver's "Last, First".
caregivers.data[].share number
electronic_days / client_days, 0 to 1; null with no worked day.
caregivers.total integer, required
How many rows the month has.
clients object, required
clients.data array of object, required
clients.data[].client_days integer, required
The client's worked client-days in the month.
clients.data[].electronic_days integer, required
Of those, the days with electronic evidence.
clients.data[].id string
The client; null once the client is removed.
clients.data[].name string
The client's "Last, First".
clients.data[].share number
electronic_days / client_days, 0 to 1; null with no worked day.
clients.total integer, required
How many rows the month has.
computed boolean, required
Whether the month has a snapshot.
limit integer, required
The page size of both tables.
month string, required
YYYY-MM.
offset integer, required
The rows skipped in both tables.
trend array of object, required
The 12 months ending with month, newest first.
trend[].client_days integer
Worked client-days; null when not computed.
trend[].computed boolean, required
False when the month has no snapshot yet: not 0%.
trend[].electronic_days integer
Of those, the days with electronic evidence; null when not computed.
trend[].month string, required
YYYY-MM.
trend[].share number
electronic_days / client_days, 0 to 1; null with no worked day.

ElectronicEvidenceTrendMonth

client_days integer
Worked client-days; null when not computed.
computed boolean, required
False when the month has no snapshot yet: not 0%.
electronic_days integer
Of those, the days with electronic evidence; null when not computed.
month string, required
YYYY-MM.
share number
electronic_days / client_days, 0 to 1; null with no worked day.

EligibilityCheck

A Medicaid eligibility check the agency recorded for a client and one coverage month.

client_id string, required
The client checked.
coverage_month integer
The coverage month, 1 to 12.
coverage_year integer
The coverage year.
id string, required
The record's id.
inserted_at string
When the check was recorded.
method string
note string
Free text on the check.
status string, required
verified_on string

Error

Every error on the API. The details field appears on a 422 and maps each invalid field to its messages.

error object, required
error.code string, required
Stable, machine-readable, for example not_found or idempotency_key_reused.
error.details object
On a 422: each invalid field to a list of its messages. A nested record's field maps to an object of the same shape, and a list of nested records to a list of such objects. On a 409 whose code carries data (for example possible_match), that data, as the operation's 409 response describes it.
error.message string, required
For a person to read.

EvidenceDismissal

already_dismissed boolean, required
true when this request found the conflict dismissed already.
caregiver_id string, required
The caregiver.
client_id string, required
The client.
conflict_key string, required
The conflict dismissed.
dismissed_at string, required
When it was dismissed.
dismissed_by_user_id string
The member who dismissed it.
id string, required
The record's id.
reason string, required
Why it was dismissed.
service_date string, required
The day.

EvvCollection

enrolled_caregivers integer, required
How many caregivers are enrolled in the EVV pilot.
evv_collected_from string, required
The agency's calendar day HCB starts collecting EVV; null for no start day.
evv_rollout string, required
Who HCB collects EVV for: off (alerts start with the agency's first clock-in), pilot (enrolled caregivers only) or all.

EvvCollectionUpdate

evv_collected_from string
The agency's calendar day HCB starts collecting EVV; null for no start day.
evv_rollout string
Who HCB collects EVV for: off (alerts start with the agency's first clock-in), pilot (enrolled caregivers only) or all.

EvvExceptionRule

description string
What it means.
enabled boolean, required
Whether it raises exceptions.
id string, required
The record's id.
rule_type string, required
What the rule checks.
severity string
How serious its exceptions are.
threshold_unit string
The threshold's unit.
threshold_value string
Its threshold.

EvvExceptionRuleUpdate

description string
What it means; null clears it.
enabled boolean
Whether it raises exceptions.
severity string
How serious.
threshold_unit string
The threshold's unit; null clears it.
threshold_value string
The threshold; null clears it.

EvvExceptionRules

EvvExceptionRulesReset

FileCompleteness

One client's or caregiver's file completeness: each item's status, what is wrong, and its expiry.

id string, required
The record's id.
items object, required
Each file item by key.
name string
The person's name.

FileCompletenessItem

One item of a person's file: its status, what is wrong with it, and its expiry.

days integer
Days until it expires, or since it expired.
details string
What is wrong.
expiry_date string
When it expires.
status string, required
complete, missing, expiring_soon, and so on.

FileGaps

One person with a gap in their file: who, and only the items not complete.

gaps object, required
id string, required
The record's id.
name string
The person's name.

FindingDismissal

dismissed_at string, required
When it was dismissed.
dismissed_by_user_id string
The member who dismissed it.
dismissed_via string, required
session (the web app) or token (an API key or connected app).
fingerprint string, required
The figures dismissed.
id string, required
The record's id.
reason string
Why it was dismissed.
restored_at string
When it was shown again; null while it is dismissed.
rule_id string, required
The warning's rule, as the warning names it.
subject_date string
The day, for a warning about one day of its subject.
subject_id string, required
The record's id.
subject_type string, required
What the warning is about, e.g. claim.

HalfMonthSummary

One caregiver's half of a month for one client, as the evidence grid shows it, with where its signing stands. A draft's days are re-read from the grid each time it is answered; the first signature freezes them.

caregiver_id string, required
The caregiver.
client_id string, required
The client.
client_skip_reason string
Why the client could not sign, as the caregiver gave it; null when none.
days array of object, required
The days of the half with care, oldest first.
days[].date string, required
The day.
days[].hours string, required
The day's hours.
days[].shifts array of object, required
The day's shifts.
days[].shifts[].end string
When it ended (UTC).
days[].shifts[].hours string, required
Its hours, to two places.
days[].shifts[].source string, required
Where the shift came from: a care log's source, else the visit's evidence source.
days[].shifts[].start string
When it started (UTC).
days[].shifts[].tasks array of string, required
The codes of the tasks done, from a care log; empty otherwise.
id string, required
The record's id.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
period_end string, required
The half's last day, the 15th or the month's last.
period_start string, required
The half's first day, the 1st or the 16th.
record_state string, required
draft until the first signature freezes it; then signed, amended or voided (corrected by a new draft).
replaces_id string
The voided summary this draft corrects; null when none.
service_type string
The service it attests: the client signs one summary per service. null for a shared summary from before that, which covers every service of the pair until it is voided.
signatures array of object, required
The live signatures, oldest first, without their images.
signatures[].channel string
Where it was captured.
signatures[].id string, required
The signature.
signatures[].method string, required
How it was signed.
signatures[].role string, required
The line signed: caregiver, client or representative.
signatures[].signed_at string, required
When it was signed.
signatures[].signer_name string
The name the line is signed under.
signed_at string
When it was first signed; null for a draft.
signing object, required
signing.caregiver_signed boolean, required
Whether the caregiver's line is signed.
signing.client_signed boolean, required
Whether the client's line is signed, by them or a representative.
signing.complete boolean, required
Whether every line it needs is signed.
signing.hash string, required
The hash of the half as answered; send it as expected_content_hash with a signature, so a half that changed since is refused (409 content_changed) rather than signed.
signing.open boolean, required
Whether that day has come.
signing.opens_on string, required
The first day the half may be signed: the 15th for a first half, the 20th for a second (Colorado's date).
total_hours string
The half's hours.
voided_at string
When it was voided; null unless voided.

HalfMonthSummaryDay

date string, required
The day.
hours string, required
The day's hours.
shifts array of object, required
The day's shifts.
shifts[].end string
When it ended (UTC).
shifts[].hours string, required
Its hours, to two places.
shifts[].source string, required
Where the shift came from: a care log's source, else the visit's evidence source.
shifts[].start string
When it started (UTC).
shifts[].tasks array of string, required
The codes of the tasks done, from a care log; empty otherwise.

HalfMonthSummaryShift

end string
When it ended (UTC).
hours string, required
Its hours, to two places.
source string, required
Where the shift came from: a care log's source, else the visit's evidence source.
start string
When it started (UTC).
tasks array of string, required
The codes of the tasks done, from a care log; empty otherwise.

HalfMonthSummarySignature

channel string
Where it was captured.
id string, required
The signature.
method string, required
How it was signed.
role string, required
The line signed: caregiver, client or representative.
signed_at string, required
When it was signed.
signer_name string
The name the line is signed under.

HalfMonthSummarySigning

caregiver_signed boolean, required
Whether the caregiver's line is signed.
client_signed boolean, required
Whether the client's line is signed, by them or a representative.
complete boolean, required
Whether every line it needs is signed.
hash string, required
The hash of the half as answered; send it as expected_content_hash with a signature, so a half that changed since is refused (409 content_changed) rather than signed.
open boolean, required
Whether that day has come.
opens_on string, required
The first day the half may be signed: the 15th for a first half, the 20th for a second (Colorado's date).

IntakeWarningDismissal

client_id string, required
The record's id.
dismissed_at string, required
When it was dismissed.
dismissed_by_id string
The user who dismissed it; the credential's user here.
missing_forms array of string, required
The forms missing when it was dismissed; the warning shows again only when another form goes missing.
reason string
The reason given, or null.

IntakeWarningDismissalInput

reason string
Why the warning is dismissed, e.g. the intake packet was signed on paper and filed. Optional.

Me

agency_name string, required
The agency the caregiver works for.
email string, required
The caregiver's email.
employee_id string, required
The caregiver's employee id at the agency.
first_name string, required
id string, required
The caregiver's id.
last_name string, required
phone string, required
The caregiver's cell phone, or home phone.
unread_notifications integer, required
Notifications not yet read or dismissed (GET /api/v1/me/notifications).

MeCareLog

One of your care logs not finished yet: a draft with no finished_at, inside the app's reach.

attestation_skip_note string
The caregiver's note on that reason (required for other); null when none.
attestation_skip_reason string
Why the client did not sign, as the caregiver gave it with Client can't sign (US-101.20); the day stays a draft for the office to collect a signature. null when none was given.
attestation_skipped_at string
When the reason was given; null when none was.
attestation_skipped_by_caregiver_id string
The caregiver who gave the reason; null when none was.
caregiver_id string, required
The caregiver.
client_id string, required
The client.
finished_at string
When it was marked finished; null while open.
id string, required
The record's id.
inserted_at string
When it was started.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
notes string
The day's notes.
record_state string, required
draft until the client's signature (or a paper signature on file) locks it; then signed, amended (an addendum was signed) or voided (corrected by a new draft).
replaces_id string
The voided care log this draft corrects; null when none.
service_date string, required
The day.
service_type string
The service, as the Work Order's.
shift_number integer
The shift, 1 to 4.
signed_at string
When it was first signed; null for a draft.
source string
Where it was captured: hcb_app, hcb_phone, office, paper_scan or import.
time_in string
The entered start time, used only when no Visit is linked.
time_out string
The entered end time, used only when no Visit is linked.
updated_at string
When it last changed.
visit_id string
The Visit linked to the day, whose times are the care log's; null when none.
voided_at string
When it was voided; null unless voided.

MeCareLogAttestation

capture_method string
drawn (the default) or initials.
expected_content_hash string
The signing_hash of the day the client read; a day changed since is refused with 409 content_changed.
image string, required
The signature as a base64 PNG, at most 51200 bytes.
role string
Who signs: the client (the default) or their representative in their place.
signer_name string
A representative's attestation by someone the office did not record: their name, signed with no relationship. With neither this nor signer_relation_id, the first listed representative signs, else "Representative". A client signs under their own name.
signer_relation_id string
A representative's attestation: the relation_id of one of the representatives the care log lists, whose name and relationship it is signed under (signer_name is then ignored). One the list does not hold is 422 validation_failed.

MeCareLogAttestationSkip

note string
The reason in words; required for other.
reason string, required
Why the client could not sign.

MeCareLogDetail

One of your care logs: the day, its tasks, its times, the differences from the plan to explain and its live signatures, with the hash to attest it under and the people who may sign in the client's place.

attestation_skip_note string
The caregiver's note on that reason (required for other); null when none.
attestation_skip_reason string
Why the client did not sign, as the caregiver gave it with Client can't sign (US-101.20); the day stays a draft for the office to collect a signature. null when none was given.
attestation_skipped_at string
When the reason was given; null when none was.
attestation_skipped_by_caregiver_id string
The caregiver who gave the reason; null when none was.
caregiver_id string, required
The caregiver.
client_id string, required
The client.
finished_at string
When it was marked finished; null while open.
id string, required
The record's id.
inserted_at string
When it was started.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
notes string
The day's notes.
record_state string, required
draft until the client's signature (or a paper signature on file) locks it; then signed, amended (an addendum was signed) or voided (corrected by a new draft).
replaced_by_id string
The draft that corrects this voided care log; null when none.
replaces_id string
The voided care log this draft corrects; null when none.
representatives array of MeRepresentative, required
The client's current representative, then its current responsible party, one entry per person; empty when the office recorded neither, or when the client is not one you are assigned to today. Send an entry's relation_id as signer_relation_id with a representative's attestation.
service_date string, required
The day.
service_type string
The service, as the Work Order's.
shift_number integer
The shift, 1 to 4.
signatures array of object, required
The live signatures, oldest first, without their images.
signatures[].channel string
Where it was captured.
signatures[].evidence_document_id string
The client's document holding the paper scan; null when none.
signatures[].id string, required
The signature.
signatures[].method string, required
How it was signed; paper_on_file for a paper signature the office marked as on file.
signatures[].role string, required
The line signed (client, caregiver, ...).
signatures[].signed_at string, required
When it was signed.
signatures[].signer_name string
The name the line is signed under.
signed_at string
When it was first signed; null for a draft.
signing_hash string, required
The hash of the day as answered; send it as expected_content_hash with the client's attestation, so a day changed since is refused (409 content_changed) rather than signed.
source string
Where it was captured: hcb_app, hcb_phone, office, paper_scan or import.
tasks array of object, required
Planned tasks first, then those added off the plan.
tasks[].code string
The task's code.
tasks[].count integer, required
How many times.
tasks[].id string, required
The care log's task.
tasks[].name string
The task's name.
tasks[].planned boolean, required
Whether a Work Order in force planned it for the day; false for one added off the plan.
tasks[].reason_code string
Why it was refused, not needed or added.
tasks[].reason_note string
The reason in words.
tasks[].status string
done, refused or not_needed; null when unmarked.
tasks[].task_definition_id string, required
The agency's task; the {task_id} a mark is sent to (POST /care-logs/{id}/tasks/{task_id}/mark).
time_in string
The entered start time, used only when no Visit is linked.
time_out string
The entered end time, used only when no Visit is linked.
times object, required
times.end string
When it ended.
times.source string, required
visit: the linked Visit's billable times (adjusted, else actual, else scheduled); entered: time_in and time_out, when no Visit is linked.
times.start string
When the day's care started.
updated_at string
When it last changed.
visit_id string
The Visit linked to the day, whose times are the care log's; null when none.
voided_at string
When it was voided; null unless voided.
warnings array of object, required
The differences from the plan the care log should explain.
warnings[].code string, required
What differs from the plan. times_missing: no Visit is linked and the time in or time out is empty, so the day counts 0 hours. A care_logs.* code is a finding the save just answered raised: past the weekly or daily caregiver limit, past the Work Order's planned hours, entered times off the clocked Visit by more than 30 minutes, a day the Work Order withdrew, or time out equal to time in (0 hours). None refuses the save.
warnings[].message string, required
The warning in words.
warnings[].task_definition_id string
The task it is about; null for a warning about the day (times_missing).

MeCareLogPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of MeCareLog, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

MeCareLogStart

client_id string, required
The client.
service_date string, required
The day.
service_type string, required
The service, as the Work Order's.
shift_number integer
The shift, 1 to 4 (default 1).
visit_id string
Your Visit to link, with the same client on the same day. Left out, the day's one such Visit is linked when exactly one exists.

MeCareLogTaskAdd

count integer
How many times; 1 when left out.
reason_code string
Why it was done off the plan.
reason_note string
The reason in words.
task_definition_id string, required
The task to add: one of the agency's tasks or a system one.

MeCareLogTaskMark

count integer
How many times; unchanged when left out.
expect_status string
The status the app showed; sent (null included), the mark is refused with 409 stale_record when the task no longer has it, so a clear re-sent after the office changed the task changes nothing.
reason_code string
Why a task was refused or not needed; left out or null clears it, as a mark on the screen does.
reason_note string
The reason in words; left out or null clears it.
status string, required
The status to SET: done, refused or not_needed; null clears it. Sending the status the task already has changes nothing.

MeClockEvent

accuracy number
GPS accuracy in meters.
action string, required
captured_at number
When the phone recorded the clock, in Unix milliseconds: the clock's time, read as clock-in reads it.
id string, required
The app's own id for the event, echoed in synced or failed; resend the same one to retry.
latitude number
longitude number
manual boolean
true records a manual call.
visit_id string, required
One of your visits.

MeClockEventsInput

events array of object, required
At most 100.
events[].accuracy number
GPS accuracy in meters.
events[].action string, required
events[].captured_at number
When the phone recorded the clock, in Unix milliseconds: the clock's time, read as clock-in reads it.
events[].id string, required
The app's own id for the event, echoed in synced or failed; resend the same one to retry.
events[].latitude number
events[].longitude number
events[].manual boolean
true records a manual call.
events[].visit_id string, required
One of your visits.

MeClockEventsResult

failed array of object, required
Events not recorded, each with why; keep them and retry those that can succeed.
failed[].error string
visit_not_found (not one of your visits within reach), unknown_action, invalid_event (an id that is not a string; answered with a null id), clock_in_required, visit_not_clockable (the visit was closed and the server could not keep the clock: retry), sync_failed (retry), clock_in_failed or clock_out_failed.
failed[].id string
synced array of string, required
Ids of events recorded, already recorded, or kept for the office because the visit was closed: drop them.

MeClockInput

accuracy number
GPS accuracy in meters; a negative one, one over 10,000 km, or a non-number is left out, with unknown_accuracy.
captured_at number
When the device recorded the clock, in Unix milliseconds (a fraction is allowed); omit for now. One that is not a number, ahead of now, or before the visit existed (each by more than 5 minutes) is recorded at the server's time with a warning; one sent more than 5 minutes after the time it carries is recorded at that time, with late_sync.
latitude number
The device's latitude. With longitude, a pair that is not a location is left out, with invalid_coordinates; none at all records a manual call.
longitude number
The device's longitude.
manual boolean
true records a manual call, with no coordinates needed; false, null or left out does not.

MeClockResult

call object, required
A clock-in or clock-out recorded on the visit.
call.call_datetime string
When the call was made (UTC).
call.call_type string
How the call was made.
call.id string
The record's id.
call.location_description string
GPS warnings recorded with the call, such as outside the geofence.
gps_warnings array of object, required
What the clock was recorded with; it was recorded whatever they are.
gps_warnings[].message string, required
gps_warnings[].type string, required
One of no_gps, low_accuracy, moderate_accuracy, suspicious_accuracy, outside_geofence, invalid_coordinates, unknown_accuracy, invalid_captured_at, captured_at_out_of_range, late_sync, manual, outside_schedule, before_clock_in; a later one may be added.
visit object, required
visit.actual_end_time string
When you clocked out (UTC).
visit.actual_start_time string
When you clocked in (UTC).
visit.id string, required
The record's id.
visit.status string, required

MeDevice

current boolean, required
Whether this is the device making the request.
device_id string, required
The app's id for the device, sent at sign-in.
expires_at string
When the sign-in ends unless renewed.
id string, required
The record's id.
inserted_at string, required
When the device signed in.
last_seen_at string
When the device was last used.

MeDevicePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of MeDevice, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

MeHalfMonthSummary

Your half-month summary as the app opens it, with the people who may sign the client's line in their place.

caregiver_id string, required
The caregiver.
client_id string, required
The client.
client_skip_reason string
Why the client could not sign, as the caregiver gave it; null when none.
days array of object, required
The days of the half with care, oldest first.
days[].date string, required
The day.
days[].hours string, required
The day's hours.
days[].shifts array of object, required
The day's shifts.
days[].shifts[].end string
When it ended (UTC).
days[].shifts[].hours string, required
Its hours, to two places.
days[].shifts[].source string, required
Where the shift came from: a care log's source, else the visit's evidence source.
days[].shifts[].start string
When it started (UTC).
days[].shifts[].tasks array of string, required
The codes of the tasks done, from a care log; empty otherwise.
id string, required
The record's id.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
period_end string, required
The half's last day, the 15th or the month's last.
period_start string, required
The half's first day, the 1st or the 16th.
record_state string, required
draft until the first signature freezes it; then signed, amended or voided (corrected by a new draft).
replaces_id string
The voided summary this draft corrects; null when none.
representatives array of MeRepresentative, required
The client's current representative, then its current responsible party, one entry per person; empty when the office recorded neither, or when the client is not one you are assigned to today.
service_type string
The service it attests: the client signs one summary per service. null for a shared summary from before that, which covers every service of the pair until it is voided.
signatures array of object, required
The live signatures, oldest first, without their images.
signatures[].channel string
Where it was captured.
signatures[].id string, required
The signature.
signatures[].method string, required
How it was signed.
signatures[].role string, required
The line signed: caregiver, client or representative.
signatures[].signed_at string, required
When it was signed.
signatures[].signer_name string
The name the line is signed under.
signed_at string
When it was first signed; null for a draft.
signing object, required
signing.caregiver_signed boolean, required
Whether the caregiver's line is signed.
signing.client_signed boolean, required
Whether the client's line is signed, by them or a representative.
signing.complete boolean, required
Whether every line it needs is signed.
signing.hash string, required
The hash of the half as answered; send it as expected_content_hash with a signature, so a half that changed since is refused (409 content_changed) rather than signed.
signing.open boolean, required
Whether that day has come.
signing.opens_on string, required
The first day the half may be signed: the 15th for a first half, the 20th for a second (Colorado's date).
total_hours string
The half's hours.
voided_at string
When it was voided; null unless voided.

MeHalfMonthSummaryClientSkip

reason string, required
Why the client could not sign.

MeHalfMonthSummaryDraft

client_id string, required
The client.
period_start string, required
The half's first day, YYYY-MM-DD: the 1st or the 16th.
service_type string
The service the summary attests: the client signs one per service. Left out, the half's only service; a half with care for two services, or with none recorded and no summary yet, is 422 validation_failed.

MeHalfMonthSummarySignature

capture_method string
drawn (the default) or initials.
expected_content_hash string
The signing.hash of the half the signer read; a half changed since is refused with 409 content_changed.
image string, required
The signature as a base64 PNG, at most 51200 bytes.
role string, required
The line signed: yours first, then the client's or their representative's.
signer_name string
A representative's line signed by someone the office did not record: their name, signed with no relationship. With neither this nor signer_relation_id, the first listed representative signs, else "Representative".
signer_relation_id string
A representative's line: the relation_id of one of the representatives the summary lists, whose name and relationship it is signed under (signer_name is then ignored). One the list does not hold is 422 validation_failed.

MeNotification

body string
dismissed_at string
When it was dismissed.
id string, required
The record's id.
inserted_at string
When it was sent.
read_at string
When it was read.
title string, required
type string, required

MeNotificationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of MeNotification, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

MeNotificationsMarked

marked integer, required

MePinChange

The caregiver's current PIN and the new one.

current_pin string, required
The PIN the caregiver signs in with now.
new_pin string, required
Six digits, not repeated or sequential.

MePushToken

platform string, required
registered_at string, required
When this device's token was last registered.

MePushTokenInput

platform string, required
token string, required

MeRefusedClock

assignment string, required
A clock-in or a clock-out.
captured_at string, required
When you clocked (UTC).
id string, required
The record's id.
reviewed_at string
When the office handled it (UTC); null until then.
service_date string, required
The visit's day of service.
visit_id string, required
The record's id.
visit_status string, required
The visit's status when it refused the clock.

MeRefusedClockPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of MeRefusedClock, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

MeRepresentative

A person the office recorded as the client's representative or responsible party. Send relation_id as signer_relation_id to sign a representative's line as them.

name string, required
The person's name, or the organization's when it has no name.
relation_id string, required
The relation the office recorded.
relationship_label string, required
Their relationship to the client, as the office wrote it.

MeSignature

captured_at string, required
When it was signed (UTC).
captured_by_caregiver_id string
The record's id.
id string, required
The record's id.
signature_type string, required
A drawn signature or initials.
signer_name string, required
The signer's name as given.
signer_type string, required
Who signed.
updated_at string
When the server stored this capture (UTC), a replacement's included.
visit_id string, required
The record's id.

MeSignatureInput

captured_at number
When it was signed, in Unix milliseconds; omit for now.
image string, required
The signature as a base64 PNG of at most 51200 bytes once decoded.
replace boolean
true replaces the visit's signature from this signer; otherwise a second one answers 200 with the one it holds.
signature_type string, required
signer_name string, required
The signer's name.
signer_type string, required

MeVisit

actual_end_time string
When you clocked out (UTC).
actual_start_time string
When you clocked in (UTC).
client object, required
Who the visit serves and where, for the caregiver on the way there.
client.address string
client.address_line_2 string
client.city string
client.first_name string
client.geofence_radius_meters integer
How close to the home a clock-in counts as at the home.
client.id string
The record's id.
client.last_name string
client.latitude string
The home's latitude, for the geofence.
client.longitude string
The home's longitude, for the geofence.
client.state string
client.zip string
deleted_at string
When the agency removed the visit (UTC); only read by id.
id string, required
The record's id.
procedure_code string
The service's HCPCS code.
scheduled_end_time string
Scheduled end (UTC).
scheduled_start_time string
Scheduled start (UTC).
service_date string, required
The day of service.
status string, required
Where the visit is in its lifecycle.
visit_type string

MeVisitCall

A clock-in or clock-out recorded on the visit.

call_datetime string
When the call was made (UTC).
call_type string
How the call was made.
id string
The record's id.
location_description string
GPS warnings recorded with the call, such as outside the geofence.

MeVisitClient

Who the visit serves and where, for the caregiver on the way there.

address string
address_line_2 string
city string
first_name string
geofence_radius_meters integer
How close to the home a clock-in counts as at the home.
id string
The record's id.
last_name string
latitude string
The home's latitude, for the geofence.
longitude string
The home's longitude, for the geofence.
state string
zip string

MeVisitDetail

actual_end_time string
When you clocked out (UTC).
actual_start_time string
When you clocked in (UTC).
client object, required
Who the visit serves and where, for the caregiver on the way there.
client.address string
client.address_line_2 string
client.city string
client.first_name string
client.geofence_radius_meters integer
How close to the home a clock-in counts as at the home.
client.id string
The record's id.
client.last_name string
client.latitude string
The home's latitude, for the geofence.
client.longitude string
The home's longitude, for the geofence.
client.state string
client.zip string
deleted_at string
When the agency removed the visit (UTC); only read by id.
id string, required
The record's id.
procedure_code string
The service's HCPCS code.
scheduled_end_time string
Scheduled end (UTC).
scheduled_start_time string
Scheduled start (UTC).
service_date string, required
The day of service.
status string, required
Where the visit is in its lifecycle.
time_in object, required
The clock-in, once recorded.
time_in.call_datetime string
When the call was made (UTC).
time_in.call_type string
How the call was made.
time_in.id string
The record's id.
time_in.location_description string
GPS warnings recorded with the call, such as outside the geofence.
time_out object, required
The clock-out, once recorded.
time_out.call_datetime string
When the call was made (UTC).
time_out.call_type string
How the call was made.
time_out.id string
The record's id.
time_out.location_description string
GPS warnings recorded with the call, such as outside the geofence.
visit_type string

MeVisitPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of MeVisit, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Meeting minutesPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of MeetingMinutes, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

MeetingMinutes

One meeting's minutes. A draft until finalized; finalized minutes are not changed.

adjourned_by string
Who adjourned it.
adjourned_time string
When it was adjourned, HH:MM:SS.
attendees array of object
Who was invited.
attendees[].name string
Who attended.
attendees[].present string
"true" when they were present.
attendees[].title string
Their title.
called_by string
Who called it.
end_time string
When it ended, HH:MM:SS.
id string, required
The record's id.
inserted_at string
When the minutes were created.
location string
Where it was held.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
meeting_date string, required
The day it was held.
meeting_type string, required
The kind of meeting.
new_business_topics array of object
New business, one entry a topic.
new_business_topics[].action_items string
new_business_topics[].deadline string
new_business_topics[].discussion string
new_business_topics[].responsible string
new_business_topics[].topic string
next_meeting_date string
The next meeting's day.
next_meeting_location string
Where the next meeting is.
next_meeting_time string
The next meeting's time, HH:MM:SS.
notes string
Anything else.
old_business string
Old business.
previous_minutes_approved boolean
Whether the previous meeting's minutes were approved.
previous_minutes_notes string
Notes on the previous minutes.
start_time string
When it started, HH:MM:SS.
status string, required
draft, or finalized.
updated_at string
When they last changed.

MeetingMinutesInput

Meeting minutes' fields; meeting_type and meeting_date are required on a create. A PATCH carries lock_version.

adjourned_by string
Who adjourned it.
adjourned_time string
When it was adjourned, HH:MM:SS.
attendees array of object
Who was invited.
attendees[].name string
Who attended.
attendees[].present string
"true" when they were present.
attendees[].title string
Their title.
called_by string
Who called it.
end_time string
When it ended, HH:MM:SS.
location string
Where it was held.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
meeting_date string
The day it was held.
meeting_type string
The kind of meeting.
new_business_topics array of object
New business, one entry a topic.
new_business_topics[].action_items string
new_business_topics[].deadline string
new_business_topics[].discussion string
new_business_topics[].responsible string
new_business_topics[].topic string
next_meeting_date string
The next meeting's day.
next_meeting_location string
Where the next meeting is.
next_meeting_time string
The next meeting's time, HH:MM:SS.
notes string
Anything else.
old_business string
Old business.
previous_minutes_approved boolean
Whether the previous meeting's minutes were approved.
previous_minutes_notes string
Notes on the previous minutes.
start_time string
When it started, HH:MM:SS.

MissingSigner

label string, required
The line as the page names it, e.g. "client or authorized representative".
roles array of string, required
The roles that would fill the line: any one of them.

MonthlyClientReport

The monthly check-in with a client, one per Work Order month. Saved here with its answers, comments and how it was taken; the client signs in person.

client_id string, required
The client.
client_signed boolean
Whether the client's line is signed, on the device or on paper before.
comments string
Comments; null or blank clears them.
conducted_via string
How the check-in was taken.
id string, required
The record's id.
inserted_at string
When the report was first saved.
missing_signers array of object
Each required line no live signature fills yet, in order; empty when complete or voided.
missing_signers[].label string, required
The line as the page names it, e.g. "client or authorized representative".
missing_signers[].roles array of string, required
The roles that would fill the line: any one of them.
month integer
The report's month, 1 to 12.
questions array of QuestionAnswer
The report's questions.
record_state string
Where the report stands as a signed record: draft (it changes here), signed or amended (locked: corrected with an addendum, or voided and started again as a new draft), voided. signing_complete says whether every required line is signed.
signatures array of object
The live signatures, oldest first.
signatures[].method string, required
How it was signed.
signatures[].role string, required
The line signed.
signatures[].signed_at string, required
When.
signatures[].signer_name string, required
Who signed.
signed_at string
When the first signature locked it; null on a draft.
signed_on_paper boolean
Whether the signed paper sheet is on file. A yes is recorded as a paper-on-file signature on the report's signature line (the client's in person, the office's by phone or video), so it can sign the report; read-only.
signing_complete boolean
True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
updated_at string
When the report last changed.
work_order_id string, required
The Work Order month the report belongs to.
year integer
The report's year.

MonthlyClientReportInput

What to save: answers maps a question key to yes or no (or true/false), a text or code, or a list of choices; comments; conducted_via. A save sends something to change. Saving again updates the same report.

answers object
Answers by question key, as the agency's monthly report lists its questions: yes or no (or true/false), a text or code, or a list of choices.
comments string
Comments; null or blank clears them.
conducted_via string
How the check-in was taken.

MonthlyClientReportPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of MonthlyClientReport, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

MonthlyClientReportSignature

signer string, required
Whose line to sign: office, the staff member who conducted a phone or video check-in, signed as you. The client's line is drawn on the device in the app.

MonthlyFollowUp

A client's monthly follow-up: the contact the agency makes with each client once a month.

client_id string, required
The client it is for.
completed boolean, required
Whether it has been logged.
completed_at string
When it was logged.
contact_date string
The day of the contact.
contact_type string
How the client was reached.
due_date string
The day it is due.
id string, required
The record's id.
month integer, required
The month it is filed under (1-12).
notes string
What was discussed.
year integer, required
The year it is filed under.

MonthlyFollowUpLogInput

The contact that completes the follow-up, as the Log form takes it. contact_type and contact_date are required; the date cannot be in the future.

contact_date string, required
The day of the contact (YYYY-MM-DD).
contact_type string, required
How the client was reached.
notes string
Optional: what was discussed.

MoveDirection

direction string, required
Which way to move it one place.

NextActionSnooze

client_id string, required
The client.
snoozed_until string, required
When it comes back.
suggestion_id string, required
The Next Actions suggestion.

NextActionSnoozeCreate

days integer
Days to snooze it, 1 to 365. Leave it out for 7, as the page does.
suggestion_id string, required
The Next Actions suggestion.

NextActionUnsnoozed

client_id string, required
The client.
suggestion_id string, required
The Next Actions suggestion.

NoteAttachment

content_type string, required
Its type.
file_size integer, required
Its size in bytes.
filename string, required
The file's name.
id string, required
The record's id.
inserted_at string
When it was attached.
note_id string, required
The note.
note_kind string, required
The kind of note it is on.
scan_status string, required
The virus scan's verdict; only a clean file can be downloaded.
uploaded_by_id string
Who attached it.

NoteAttachmentList

data array of object, required
data[].content_type string, required
Its type.
data[].file_size integer, required
Its size in bytes.
data[].filename string, required
The file's name.
data[].id string, required
The record's id.
data[].inserted_at string
When it was attached.
data[].note_id string, required
The note.
data[].note_kind string, required
The kind of note it is on.
data[].scan_status string, required
The virus scan's verdict; only a clean file can be downloaded.
data[].uploaded_by_id string
Who attached it.

Notification

body string
Its text.
created_at string
When it was raised (UTC).
id string, required
The record's id.
priority string
How urgent it is.
read_at string
When it was read (UTC).
resolved_at string
When it was resolved (UTC).
source_id string
The record it is about.
source_type string
The kind of record it is about.
title string, required
Its headline.
type string, required
The kind of notification.

NotificationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].body string
Its text.
data[].created_at string
When it was raised (UTC).
data[].id string, required
The record's id.
data[].priority string
How urgent it is.
data[].read_at string
When it was read (UTC).
data[].resolved_at string
When it was resolved (UTC).
data[].source_id string
The record it is about.
data[].source_type string
The kind of record it is about.
data[].title string, required
Its headline.
data[].type string, required
The kind of notification.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

NotificationResolve

notes string
Why it is resolved. Leave it out for none.

NotificationSettings

notify_on_277ca boolean, required
Whether the agency is emailed for this event.
notify_on_835 boolean, required
Whether the agency is emailed for this event.
notify_on_999 boolean, required
Whether the agency is emailed for this event.
notify_on_submission boolean, required
Whether the agency is emailed for this event.
notify_on_ta1 boolean, required
Whether the agency is emailed for this event.
remittance_review_email boolean, required
Whether the agency is emailed for this event.
text_caregivers_before_expiry boolean, required
Whether each caregiver is texted a month, and again a week, before a dated credential of theirs expires.

NotificationSettingsUpdate

notify_on_277ca boolean
Whether the agency is emailed for this event.
notify_on_835 boolean
Whether the agency is emailed for this event.
notify_on_999 boolean
Whether the agency is emailed for this event.
notify_on_submission boolean
Whether the agency is emailed for this event.
notify_on_ta1 boolean
Whether the agency is emailed for this event.
remittance_review_email boolean
Whether the agency is emailed for this event.
text_caregivers_before_expiry boolean
Whether each caregiver is texted a month, and again a week, before a dated credential of theirs expires.

NotificationsMarked

marked integer, required
Notifications marked read.

OIG attestationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of OigAttestation, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

OigAttestation

One month's OIG exclusion attestation. It is never changed once recorded.

administrator_name string
Who attests.
all_clear boolean
Whether nobody matched.
company_document_id string
The attached report, a company document; null for none.
id string, required
The record's id.
inserted_at string
When it was recorded.
leie_file_date string
The list file's date.
leie_source string
Where the exclusion list came from.
recorded_by string
The user who recorded it.
report_state string
The attached report's state: kept in Company Documents, virus scan pending, failed the virus scan, or removed after failing it; null for none.
review_month string, required
The month screened, as its first day.
review_names string
The names to review; required when all_clear is false.
screen_date string
The day the screen was run; not in the future.
screened_count integer
How many people were screened.
signed_on string
The day they signed; not in the future.

OigAttestationInput

An attestation's fields. attested must be true. Attach the report by uploading it as a company document first and sending its id.

administrator_name string
Who attests.
all_clear boolean
Whether nobody matched.
attested boolean
Must be true: the administrator attests the screen was run.
company_document_id string
The report, a company document of this agency.
leie_file_date string
The list file's date.
leie_source string
Where the exclusion list came from.
review_month string
The month screened, as its first day.
review_names string
The names to review; required when all_clear is false.
screen_date string
The day the screen was run; not in the future.
screened_count integer
How many people were screened.
signed_on string
The day they signed; not in the future.

OigCheck

One caregiver's latest OIG exclusion check: whether the monthly screen covers them, when they were last checked, the result and status, and whether a person or the automatic screen recorded it.

employment_status string
The caregiver's status.
id string, required
The record's id.
in_screen boolean
Whether the monthly screen covers them.
last_checked_on string
When last checked.
name string
The caregiver's name.
recorded_by string
automatic screen or a person.
result string
clear, review or excluded.
status string
current, overdue, missing, review, excluded or not_in_screen.

OigCheckPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of OigCheck, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

OigExclusionBulk

checked_on string, required
The day the LEIE was checked, YYYY-MM-DD.

OigExclusionCheck

caregiver_id string, required
The caregiver.
checked_by string
Who recorded it.
checked_on string, required
The day the LEIE was checked.
id string, required
The record's id.
inserted_at string
When it was recorded.
notes string
Notes.
result string, required
source string
Recorded by a person or by a screen run.

OigExclusionCheckCreate

checked_on string, required
The day the LEIE was checked, YYYY-MM-DD; not in the future, not over a year ago.
notes string
Notes, e.g. how a match was reconciled.
result string, required
The result.

OigExclusionCheckPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].caregiver_id string, required
The caregiver.
data[].checked_by string
Who recorded it.
data[].checked_on string, required
The day the LEIE was checked.
data[].id string, required
The record's id.
data[].inserted_at string
When it was recorded.
data[].notes string
Notes.
data[].result string, required
data[].source string
Recorded by a person or by a screen run.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

OigScreen

One OIG exclusion screen: screen date, LEIE file date, how many were screened, how many names it raised to review, how many of those are still open (each counted once, on the newest screen that raised it), and the printable record the Administrator signs.

all_clear boolean
Whether it raised nothing.
id string, required
The record's id.
kind string
monthly, new_hire or single.
leie_file_date string
The LEIE file it screened against.
record_url string
The printable record.
screen_date string
When the screen ran.
screened integer
How many were screened.
still_to_review integer
How many of its reviews are still open.
to_review integer
How many names it raised to review.

OigScreenPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of OigScreen, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

OigScreenQueued

A roster screen request: queued, or already_queued when a screen was already waiting, running or retrying. The screen's row exists once the worker starts; read it from GET /api/v1/oig-screens.

status string, required
What became of the request.

OpenShift

care_type string
client object
The client, by name only: never the address or point.
client.first_name string
client.id string
The record's id.
client.last_name string
client_gender string
cross_streets string
date_mode string
end_time string
HH:MM.
hours string
A one-time shift's hours.
id string
The record's id.
inserted_at string
When it was posted.
kind string
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
note string
ongoing_times object
An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
ongoing_times.end string
HH:MM.
ongoing_times.ends_next_day boolean
The end is past midnight.
ongoing_times.hours string
The hours that day.
ongoing_times.run_days array of integer
ongoing_times.start string
HH:MM.
rate_cents integer
The hourly rate, in cents.
service_area object
service_area.id string
The record's id.
service_area.name string
shift_id string
An ongoing shift's slot.
start_time string
HH:MM.
starts_on string
The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
status string
time_mode string
zip string

OpenShiftAssign

caregiver_id string, required
The caregiver to assign.

OpenShiftCreate

acknowledged array of string
The fingerprints of client_info_found refusals the sender confirmed are not client information.
care_type string, required
The care the shift gives.
client_gender string, required
The client's gender, shown to responders.
client_id string, required
The client the shift is for.
cross_streets string, required
Two nearby major streets, as 'S Chambers Rd & E Hampden Ave'; never a house number.
date_mode string, required
exact needs starts_on; this_week, next_week and within_2_weeks are windows; tbd has no date yet.
end_time string
HH:MM, one-time exact only; earlier than start_time for an overnight shift.
hours string
One-time only, when time_mode is not exact: 0.5 to 24, in halves.
kind string, required
one_time for a single shift; ongoing to fill a Shift Plan slot, whose days and times are the Shift Plan's.
note string
Up to 500 characters for responders. Checked for client information: a match is refused unless acknowledged names its fingerprint.
rate_cents integer, required
The hourly rate shown to responders, in cents.
service_area_id string, required
The agency area the shift is shown at.
shift_id string
Ongoing only: the Shift Plan slot the shift fills.
start_time string
HH:MM, one-time exact only.
starts_on string
The date, for date_mode exact; ignored for a window.
time_mode string
One-time only: exact needs start_time and end_time; am, midday, pm and flexible need hours.
zip string
The client's 5-digit ZIP code, shown to responders.

OpenShiftCrossStreets

client_id string, required
The client.

OpenShiftDashboard

counts object
No section: the four counts.
coverage array of object
No section: one row per area holding an open shift.
rows array of object
section string
total integer

OpenShiftPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].care_type string
data[].client object
The client, by name only: never the address or point.
data[].client.first_name string
data[].client.id string
The record's id.
data[].client.last_name string
data[].client_gender string
data[].cross_streets string
data[].date_mode string
data[].end_time string
HH:MM.
data[].hours string
A one-time shift's hours.
data[].id string
The record's id.
data[].inserted_at string
When it was posted.
data[].kind string
data[].lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
data[].note string
data[].ongoing_times object
An ongoing shift's Shift Plan times on starts_on, and the ISO weekdays (1 Monday .. 7 Sunday) its slot runs on; null for a one-time shift.
data[].ongoing_times.end string
HH:MM.
data[].ongoing_times.ends_next_day boolean
The end is past midnight.
data[].ongoing_times.hours string
The hours that day.
data[].ongoing_times.run_days array of integer
data[].ongoing_times.start string
HH:MM.
data[].rate_cents integer
The hourly rate, in cents.
data[].service_area object
data[].service_area.id string
The record's id.
data[].service_area.name string
data[].shift_id string
An ongoing shift's slot.
data[].start_time string
HH:MM.
data[].starts_on string
The date for exact; the window's last day for this_week, next_week and within_2_weeks; null for tbd.
data[].status string
data[].time_mode string
data[].zip string
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

OpenShiftResponse

One live response to an open shift (a withdrawn one is not listed).

active boolean
The caregiver is active.
caregiver_id string
The caregiver; null for a candidate.
completed integer
Open shifts this caregiver has completed.
home_area object
The caregiver's home service area. Present only for a holder of open_shifts.administer; null when none is set.
home_area.id string
The record's id.
home_area.name string
id string
The record's id.
miles integer
Whole miles from the caregiver's home area to the shift's service area; null when either has no known point.
name string
Last, First.
open_shift_id string
The record's id.
phone string
responded_at string
When they responded.
role string

OpenShiftResponsePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].active boolean
The caregiver is active.
data[].caregiver_id string
The caregiver; null for a candidate.
data[].completed integer
Open shifts this caregiver has completed.
data[].home_area object
The caregiver's home service area. Present only for a holder of open_shifts.administer; null when none is set.
data[].home_area.id string
The record's id.
data[].home_area.name string
data[].id string
The record's id.
data[].miles integer
Whole miles from the caregiver's home area to the shift's service area; null when either has no known point.
data[].name string
Last, First.
data[].open_shift_id string
The record's id.
data[].phone string
data[].responded_at string
When they responded.
data[].role string
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

OpenShiftSettings

The agency's open shifts rules. Sending the object sets only the keys sent; changing it needs agency_settings.manage, and a value out of range answers 422 validation_failed naming open_shifts.<field>.

alert_withdrawn_on_change boolean
A withdrawn responder is also told when a shift's details change.
api_may_assign_non_responder boolean
REST and MCP may assign an active caregiver who did not respond.
assignee_sees_client_details boolean
The assignee sees the client's name and address in the app.
complete_before_start boolean
A shift may be marked completed before its start.
cross_street_min_meters integer
The least distance from the client's door for the cross streets (0-1000).
default_radius_miles integer
The radius a new person starts with; one of radius_choices_miles.
enabled boolean
Open shifts are on for the agency; every open shifts job checks it.
free_cancel_hours integer
A caregiver may cancel free until this many hours before the start (0-168).
my_shifts_history_days integer
How far back My shifts' history reaches, in days (7-365).
not_responding_alerts integer
Alerts unanswered that mark a person as not responding (1-50).
not_responding_days integer
The days those unanswered alerts are counted over (1-365).
pause_days integer
How long a pause from open shifts lasts, in days (0-365).
pause_extends_running boolean
A new pause during a running one keeps the later end.
post_lead_hours integer
An exact-date shift starting sooner than this many hours warns when posted (0-168).
radius_choices_miles array of integer
The radii a person may pick, in miles: 1-8 distinct values, 1-200.
reminder_offsets_hours array of integer
Hours before the start the assignee is reminded: 1-3 distinct values, 1-168.
self_signup_enabled boolean
New people may sign up on the portal themselves.
strike_window_days integer
Only strikes this recent count, in days (1-365).
strikes_before_pause integer
Strikes that pause a person (1-10).

OpenShiftUpdate

acknowledged array of string
The fingerprints of client_info_found refusals the sender confirmed are not client information.
care_type string
The care the shift gives.
client_gender string
The client's gender, shown to responders.
cross_streets string
Two nearby major streets, as 'S Chambers Rd & E Hampden Ave'; never a house number.
date_mode string
exact needs starts_on; this_week, next_week and within_2_weeks are windows; tbd has no date yet.
end_time string
HH:MM, one-time exact only; earlier than start_time for an overnight shift.
hours string
One-time only, when time_mode is not exact: 0.5 to 24, in halves.
kind string
one_time for a single shift; ongoing to fill a Shift Plan slot, whose days and times are the Shift Plan's.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
note string
Up to 500 characters for responders. Checked for client information: a match is refused unless acknowledged names its fingerprint.
rate_cents integer
The hourly rate shown to responders, in cents.
service_area_id string
The agency area the shift is shown at.
shift_id string
Ongoing only: the Shift Plan slot the shift fills.
start_time string
HH:MM, one-time exact only.
starts_on string
The date, for date_mode exact; ignored for a window.
time_mode string
One-time only: exact needs start_time and end_time; am, midday, pm and flexible need hours.
zip string
The client's 5-digit ZIP code, shown to responders.

OverAuthorizationAdjustment

caregiver_id string
The record's id.
from integer
Visits a week before the trim.
task string
The task's key on the plan.
task_definition_id string
The record's id.
task_label string
The task as the plan names it.
to integer
Visits a week after it; 0 means the task was taken off.
work_order_id string
The record's id.

OverAuthorizationResolve

month integer, required
The month, 1 to 12.
target object
Optional: task key or plan task id => the Work Order id to trim it from.
year integer, required
The year.

Page

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ParCheck

client_id string, required
The client.
flags array of string
MI, BI, PLWA: the client's conditions the PAR carries.
other_pars array of object, required
The client's other current PARs, each with only the services it has a plan for: separate Personal Care and Homemaker PARs are both current (RW1-N2). The top-level check then lists only its own services.
other_pars[].flags array of string
MI, BI, PLWA: the client's conditions the PAR carries.
other_pars[].par_effective_date string
The PAR's first day.
other_pars[].par_expiry_date string
The PAR's last day.
other_pars[].par_number string
The PAR's number.
other_pars[].services array of object, required
One column per service, Personal Care, Homemaker, HMA.
other_pars[].services[].base_units string
(hours_weekly + travel_hours) × weeks × 4, unrounded.
other_pars[].services[].billing_code string
The billing code.
other_pars[].services[].extra_hours string
Extra hours a week, for extra_weeks: a second segment.
other_pars[].services[].extra_travel_hours string
Travel hours a week, counted with extra_hours.
other_pars[].services[].extra_units string
(extra_hours + extra_travel_hours) × extra_weeks × 4, unrounded.
other_pars[].services[].extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
other_pars[].services[].extra_without_weeks boolean
Extra hours are set with no extra_weeks, so add nothing.
other_pars[].services[].hours_weekly string
Authorized hours a week.
other_pars[].services[].mismatch boolean, required
total_units and units_on_par disagree.
other_pars[].services[].plan_of_care_id string
The plan it is read from; none when not authorized.
other_pars[].services[].service string, required
other_pars[].services[].total_units integer
base_units + extra_units, rounded half-up.
other_pars[].services[].travel_hours string
Travel hours a week, counted with the hours a week.
other_pars[].services[].units_on_par integer
The units the case manager's letter carries.
other_pars[].services[].variance integer
units_on_par less total_units.
other_pars[].weeks string
The PAR's weeks, as the panel prints them.
par_effective_date string
The PAR's first day.
par_expiry_date string
The PAR's last day.
par_number string
The PAR's number.
services array of object, required
One column per service, Personal Care, Homemaker, HMA.
services[].base_units string
(hours_weekly + travel_hours) × weeks × 4, unrounded.
services[].billing_code string
The billing code.
services[].extra_hours string
Extra hours a week, for extra_weeks: a second segment.
services[].extra_travel_hours string
Travel hours a week, counted with extra_hours.
services[].extra_units string
(extra_hours + extra_travel_hours) × extra_weeks × 4, unrounded.
services[].extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
services[].extra_without_weeks boolean
Extra hours are set with no extra_weeks, so add nothing.
services[].hours_weekly string
Authorized hours a week.
services[].mismatch boolean, required
total_units and units_on_par disagree.
services[].plan_of_care_id string
The plan it is read from; none when not authorized.
services[].service string, required
services[].total_units integer
base_units + extra_units, rounded half-up.
services[].travel_hours string
Travel hours a week, counted with the hours a week.
services[].units_on_par integer
The units the case manager's letter carries.
services[].variance integer
units_on_par less total_units.
weeks string
The PAR's weeks, as the panel prints them.

ParCheckFigures

This service's figures: travel_hours, extra_hours, extra_travel_hours, extra_weeks, units_on_par.

extra_hours string
Extra hours a week, for extra_weeks: a second segment.
extra_travel_hours string
Travel hours a week, counted with extra_hours.
extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
travel_hours string
Travel hours a week, counted with the hours a week.
units_on_par integer
The units the case manager's letter carries.

ParCheckOther

flags array of string
MI, BI, PLWA: the client's conditions the PAR carries.
par_effective_date string
The PAR's first day.
par_expiry_date string
The PAR's last day.
par_number string
The PAR's number.
services array of object, required
One column per service, Personal Care, Homemaker, HMA.
services[].base_units string
(hours_weekly + travel_hours) × weeks × 4, unrounded.
services[].billing_code string
The billing code.
services[].extra_hours string
Extra hours a week, for extra_weeks: a second segment.
services[].extra_travel_hours string
Travel hours a week, counted with extra_hours.
services[].extra_units string
(extra_hours + extra_travel_hours) × extra_weeks × 4, unrounded.
services[].extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
services[].extra_without_weeks boolean
Extra hours are set with no extra_weeks, so add nothing.
services[].hours_weekly string
Authorized hours a week.
services[].mismatch boolean, required
total_units and units_on_par disagree.
services[].plan_of_care_id string
The plan it is read from; none when not authorized.
services[].service string, required
services[].total_units integer
base_units + extra_units, rounded half-up.
services[].travel_hours string
Travel hours a week, counted with the hours a week.
services[].units_on_par integer
The units the case manager's letter carries.
services[].variance integer
units_on_par less total_units.
weeks string
The PAR's weeks, as the panel prints them.

ParCheckService

base_units string
(hours_weekly + travel_hours) × weeks × 4, unrounded.
billing_code string
The billing code.
extra_hours string
Extra hours a week, for extra_weeks: a second segment.
extra_travel_hours string
Travel hours a week, counted with extra_hours.
extra_units string
(extra_hours + extra_travel_hours) × extra_weeks × 4, unrounded.
extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
extra_without_weeks boolean
Extra hours are set with no extra_weeks, so add nothing.
hours_weekly string
Authorized hours a week.
mismatch boolean, required
total_units and units_on_par disagree.
plan_of_care_id string
The plan it is read from; none when not authorized.
service string, required
total_units integer
base_units + extra_units, rounded half-up.
travel_hours string
Travel hours a week, counted with the hours a week.
units_on_par integer
The units the case manager's letter carries.
variance integer
units_on_par less total_units.

ParCheckUpdate

hma object
This service's figures: travel_hours, extra_hours, extra_travel_hours, extra_weeks, units_on_par.
hma.extra_hours string
Extra hours a week, for extra_weeks: a second segment.
hma.extra_travel_hours string
Travel hours a week, counted with extra_hours.
hma.extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
hma.travel_hours string
Travel hours a week, counted with the hours a week.
hma.units_on_par integer
The units the case manager's letter carries.
homemaker object
This service's figures: travel_hours, extra_hours, extra_travel_hours, extra_weeks, units_on_par.
homemaker.extra_hours string
Extra hours a week, for extra_weeks: a second segment.
homemaker.extra_travel_hours string
Travel hours a week, counted with extra_hours.
homemaker.extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
homemaker.travel_hours string
Travel hours a week, counted with the hours a week.
homemaker.units_on_par integer
The units the case manager's letter carries.
personal_care object
This service's figures: travel_hours, extra_hours, extra_travel_hours, extra_weeks, units_on_par.
personal_care.extra_hours string
Extra hours a week, for extra_weeks: a second segment.
personal_care.extra_travel_hours string
Travel hours a week, counted with extra_hours.
personal_care.extra_weeks string
Weeks the extra hours run. None means the extra adds no units.
personal_care.travel_hours string
Travel hours a week, counted with the hours a week.
personal_care.units_on_par integer
The units the case manager's letter carries.

PayrollCheckFinding

caregiver_id string, required
The caregiver, or null for the export as a whole.
code string, required
Which rule found it.
fix_path string, required
The HomeCareBilling page where it is fixed.
message string, required
The sentence Payroll exports > Check shows.
severity string, required
unsendable (no line of the ADP file can be written), refusal (ADP refuses this line; the rest goes) or warning (sent as it is).

PayrollConnectCode

connect_code string, required
The single-use code to paste into the ADP Marketplace checkout form. Answered only here, never stored or shown again; a new code replaces the old.
expires_at string, required
When the code stops working, 7 days after it was made.

PayrollConnection

certificate_expires_at string, required
When the ADP API certificate expires; null when there is none (own_api only).
enabled boolean, required
Whether the ADP payroll integration is on for the agency (Settings > Payroll's switch).
health object, required
health.certificate_expires_at string, required
When the ADP API certificate expires.
health.consecutive_failures integer, required
Failures since the last success.
health.last_failure_at string, required
The last failed one.
health.last_success_at string, required
The last successful token request or call to ADP.
health.message string, required
The sentence the reconnect banner shows while the connection needs attention; null otherwise.
health.paused_until string, required
While ADP is not answering and HomeCareBilling has paused calls to it, when it tries again; null otherwise.
health.status string, required
The connection's state.
health.status_reason string, required
Why the connection needs attention: token_refused, circuit_open, certificate_expired, method_paused, or the code Test connection recorded; null otherwise.
method string, required
How payroll reaches ADP.
methods_offered array of string, required
The sending methods Settings > Payroll offers for this product: built, fitting the product and switched on.
notice string, required
On a change, "Sending switched to the file, because that method is not offered for this ADP." when the method was not offered for the product and the file was stored instead (or, when the marketplace is kept for an ADP product other than the one the agency's ADP Marketplace subscription is for, a sentence naming both products: the connection waits for that product's order); otherwise null.
product string, required
Which ADP the agency runs: run, wfn or unknown.
secrets_set object, required
secrets_set.certificate_pem boolean, required
Whether certificate_pem is set. The value is never answered.
secrets_set.client_id boolean, required
Whether client_id is set. The value is never answered.
secrets_set.client_secret boolean, required
Whether client_secret is set. The value is never answered.
secrets_set.private_key_pem boolean, required
Whether private_key_pem is set. The value is never answered.
secrets_set.sftp_private_key boolean, required
Whether sftp_private_key is set. The value is never answered.
settings object, required
settings.allow_hire_push boolean, required
Whether a caregiver may be added to ADP from HomeCareBilling (RUN's Add to ADP).
settings.employee_id_template string, required
Which RUN Time Sheet Import template keys each caregiver: payroll_assigned (ADP's Employee ID) or time_clock (the Time Clock ID).
settings.mark_exported_on string, required
When a sent export is marked exported.
settings.rate_mode string, required
How API methods send a pay rate.
settings.rate_tolerance string, required
How far ADP's rate may differ from HomeCareBilling's before a warning.
settings.run_company_code string, required
RUN's company code or IID, 1 to 10 letters and numbers; null when unset.
settings.run_file_version string, required
The RUN Time Sheet Import file version.
settings.send_contractors boolean, required
Whether 1099 contractors' hours go to ADP too.
settings.sftp_folder string, required
The SFTP drop's folder; null when unset.
settings.sftp_host string, required
The SFTP drop's host; null when unset.
settings.sftp_host_key_fingerprint string, required
The SHA-256 host key fingerprint the SFTP server presented at the first successful Test connection, trusted from then on; null until then.
settings.sftp_port integer, required
The SFTP drop's port, 1 to 65535; null when unset, which connects on 22.
settings.sftp_user string, required
The SFTP drop's user; null when unset.
sftp_key_fingerprint string, required
The SHA-256 fingerprint (SHA256:..., as ssh-keygen -lf prints it) of the SFTP drop key's public half; null when no key is set. The key is never answered.
status string, required
The connection's state.

PayrollConnectionHealth

certificate_expires_at string, required
When the ADP API certificate expires.
consecutive_failures integer, required
Failures since the last success.
last_failure_at string, required
The last failed one.
last_success_at string, required
The last successful token request or call to ADP.
message string, required
The sentence the reconnect banner shows while the connection needs attention; null otherwise.
paused_until string, required
While ADP is not answering and HomeCareBilling has paused calls to it, when it tries again; null otherwise.
status string, required
The connection's state.
status_reason string, required
Why the connection needs attention: token_refused, circuit_open, certificate_expired, method_paused, or the code Test connection recorded; null otherwise.

PayrollConnectionSecretsSet

certificate_pem boolean, required
Whether certificate_pem is set. The value is never answered.
client_id boolean, required
Whether client_id is set. The value is never answered.
client_secret boolean, required
Whether client_secret is set. The value is never answered.
private_key_pem boolean, required
Whether private_key_pem is set. The value is never answered.
sftp_private_key boolean, required
Whether sftp_private_key is set. The value is never answered.

PayrollConnectionSettings

allow_hire_push boolean, required
Whether a caregiver may be added to ADP from HomeCareBilling (RUN's Add to ADP).
employee_id_template string, required
Which RUN Time Sheet Import template keys each caregiver: payroll_assigned (ADP's Employee ID) or time_clock (the Time Clock ID).
mark_exported_on string, required
When a sent export is marked exported.
rate_mode string, required
How API methods send a pay rate.
rate_tolerance string, required
How far ADP's rate may differ from HomeCareBilling's before a warning.
run_company_code string, required
RUN's company code or IID, 1 to 10 letters and numbers; null when unset.
run_file_version string, required
The RUN Time Sheet Import file version.
send_contractors boolean, required
Whether 1099 contractors' hours go to ADP too.
sftp_folder string, required
The SFTP drop's folder; null when unset.
sftp_host string, required
The SFTP drop's host; null when unset.
sftp_host_key_fingerprint string, required
The SHA-256 host key fingerprint the SFTP server presented at the first successful Test connection, trusted from then on; null until then.
sftp_port integer, required
The SFTP drop's port, 1 to 65535; null when unset, which connects on 22.
sftp_user string, required
The SFTP drop's user; null when unset.

PayrollConnectionTest

connected boolean, required
Whether ADP answered with the saved credentials, or the SFTP drop signed in and listed its folder.
message string, required
The sentence Settings > Payroll's Test connection shows.

PayrollConnectionUpdate

allow_hire_push boolean
RUN: let HomeCareBilling start new hires in RUN (Add to ADP on ADP workers), which sends the caregiver's SSN. Off by default.
employee_id_template string
payroll_assigned (ADP's Employee ID, the default) or time_clock (the Time Clock ID).
enabled boolean
Turn the ADP payroll integration on or off for the agency. Off keeps the connection, its settings and earning codes.
mark_exported_on string
API methods: all_accepted (the default) marks the export exported when ADP accepts every line; manual leaves it to Mark Downloaded.
method string
How payroll reaches ADP; one of methods_offered. Any other is stored as file, with notice saying so.
product string
Which ADP the agency runs: run (signs in at runpayroll.adp.com), wfn (workforcenow.adp.com) or unknown.
run_company_code string
RUN's company code or IID, 1 to 10 letters and numbers; null or blank clears it.
run_file_version string
The RUN Time Sheet Import file version.
send_contractors boolean
Send 1099 contractors' hours to ADP too.

PayrollCredentialsUpdate

certificate_pem string
The certificate API Central signed for the request from POST /payroll/connection/csr, PEM; absent or blank keeps the saved one.
client_id string
The API Central project's client ID; absent or blank keeps the saved one.
client_secret string
The API Central project's client secret; absent or blank keeps the saved one. Never answered.

PayrollCsr

csr_pem string, required
The certificate request to give API Central, PEM. HomeCareBilling keeps its private key; no answer carries it.

PayrollEarningMapping

earning_code string, required
The ADP earning code carrying these hours; null when the slot is unmapped.
file_column integer, required
The Workforce Now file's "Hours N" pair, 3 to 50, or null for the file's own column.
hour_kind string, required
The kind of hours.
rate_code string, required
The ADP rate code, or null.
saved boolean, required
true for a saved code; false for HomeCareBilling's proposal, used until one is saved.
source string, required
admin when a member saved it, adp_default when read from ADP; null on a proposal.
worker_type string, required
Employees or contractors.

PayrollEarningMappingUpdate

earning_code string, required
The ADP earning code, 1 to 10 letters or digits as on your ADP Earnings Codes report (upcased and trimmed); null or blank clears the slot back to its proposal.
file_column integer
The Workforce Now "Hours N" pair, 3 to 50, not used by another slot. Left out keeps it; null clears it.
hour_kind string, required
The kind of hours to map.
rate_code string
On RUN, BASE, RATE_2 to RATE_5 or HRLY4SLRY1; elsewhere up to 10 letters, digits or underscores. Left out keeps it; null clears it.
worker_type string, required
employee or contractor.

PayrollExport

adp_co_code string
billing_period_end string
billing_period_start string
file_ready boolean
Whether GET .../file has a file to return.
format string
adp (Workforce Now) or adp_run.
id string
The record's id.
status string
pending, generated or exported.

PayrollHireAttempt

caregiver_id string, required
The caregiver.
message string, required
The sentence ADP workers shows on the caregiver's row; null where it offers Add to ADP again.
status string, required
Where the send stands: sent (ADP named the worker, now linked), pending_in_adp (an ADP user finishes it in RUN's New Hire Wizard), unconfirmed (ADP did not answer: check RUN's new hires before sending again), abandoned (cleared by "I checked RUN: not there").

PayrollSftpUpdate

folder string
The folder ADP picks paydata files up from; absent, blank or null keeps the saved one.
host string
The SFTP server ADP gave the agency, a host name; absent, blank or null keeps the saved one. A new host trusts the next Test connection's host key.
port integer | string
The SFTP server's port, 1 to 65535; absent or null keeps the saved one, an empty string clears it, and none saved connects on 22. A new port trusts the next Test connection's host key.
private_key string
The private key file ADP gave the agency (OpenSSH or PEM, no passphrase), as text; absent, blank or null keeps the saved one. Never answered.
user string
The SFTP user ADP gave the agency; absent, blank or null keeps the saved one.

PayrollSubmission

attempt integer, required
1 for the first send of the export, one more per resend.
confirmed_at string
When every line was answered.
id string, required
The record's id.
line_count integer, required
How many caregivers' lines the submission has.
lines array of object, required
lines[].caregiver_id string
The caregiver the line pays.
lines[].error_code string
ADP's code, or HomeCareBilling's when it never reached ADP.
lines[].error_message string
Why the line was refused.
lines[].id string, required
The record's id.
lines[].label string, required
What Payroll exports shows for the line.
lines[].status string, required
pending and posting while it goes; accepted; refused by ADP, or before it was posted (error_code not_sent, not_linked or a check rule); unconfirmed while a post that may have been written is confirmed; sent when dropped as a file.
message string
With unchanged: what Payroll exports shows.
payroll_export_id string, required
The payroll export sent.
sent_at string
When posting began.
status string, required
queued and sending while it goes; sent when ADP accepted every line, partially_refused or refused when it refused some or all; unconfirmed when a post may have been written and is being confirmed; superseded once a resend replaced it.
unchanged boolean
Present and true when ADP already had these hours: nothing was sent, and this is the last send that ADP accepted in full.

PayrollSubmissionInput

choices object
Per caregiver id, replace (HomeCareBilling's hours) or keep (ADP's), for each line a 409 needs_choice listed.
resend boolean
true for Fix and resend: lines ADP accepted before are replaced by their ADP item ids, new ones added.

PayrollSubmissionLine

caregiver_id string
The caregiver the line pays.
error_code string
ADP's code, or HomeCareBilling's when it never reached ADP.
error_message string
Why the line was refused.
id string, required
The record's id.
label string, required
What Payroll exports shows for the line.
status string, required
pending and posting while it goes; accepted; refused by ADP, or before it was posted (error_code not_sent, not_linked or a check rule); unconfirmed while a post that may have been written is confirmed; sent when dropped as a file.

PayrollSummaryPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

adp_left_out object
The 1099 contractors the ADP files leave out over every row of the period, and their hours.
adp_left_out.count integer
How many contractors.
adp_left_out.hours string
Their hours, all regular.
data array of PayrollSummaryRow, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
pay_periods array of object, required
The month's pay periods, from the agency's pay period frequency.
pay_periods[].index integer
The period's index, the period parameter that reads it.
pay_periods[].period_end string
pay_periods[].period_start string
period_end string, required
The last day read.
period_start string, required
The first day read.
total integer, required
Every matching row.
totals object, required
Over every row of the period, not this page; a row with no pay counts 0 in total_pay.
totals.attendant_hours string
totals.cash_advance string
totals.daily_overtime_hours string
totals.overtime_hours string
totals.regular_hours string
totals.total_pay string
totals.travel_hours string
warnings array of string, required
The page's attendant classification warnings.

PayrollSummaryRow

One caregiver's pay for the period, as the Payroll Summary shows it.

adp_file_number string
The caregiver's ADP file number.
attendant_hours string
Hours, a decimal string.
attendant_rate string
The rate the period applied, a decimal string; "multiple" when it varied by day; null when none resolved.
caregiver_id string, required
The caregiver.
caregiver_name string
"Last, First", as the payroll pages show it.
cash_advance string
The cash advances this month's payroll deducts from the caregiver, the whole month's whichever pay period is shown.
cash_advance_held array of object
cash_advance_held[].amount string
What that file deducts.
cash_advance_held[].cash_advance_id string
The advance.
cash_advance_held[].description string
As the page's Cash Advance column shows it: "$50.00 on the Oct 01 - Oct 15, 2026 file".
cash_advance_held[].payroll_export_id string
The payroll file that holds it.
cash_advance_held[].period_end string
That file's last day.
cash_advance_held[].period_start string
That file's first day.
daily_overtime_hours string
Hours, a decimal string. Zero unless the agency pays daily overtime.
id string, required
The caregiver (the row is the caregiver's).
overtime_hours string
Hours, a decimal string.
regular_hours string
Hours, a decimal string.
timesheets array of object
timesheets[].attendant_hours string
Attendant hours in the period.
timesheets[].client_id string
The client.
timesheets[].client_name string
"Last, First".
timesheets[].hours string
Worked hours in the period (regular, overtime and daily overtime).
timesheets[].id string
The timesheet.
timesheets[].period_end string
The timesheet's last day.
timesheets[].period_start string
The timesheet's first day.
timesheets[].travel_hours string
Travel hours in the period.
timesheets[].wo_number string
The WO # of the work order it was made from, as the pages show it, or the number imported as text when it names no Work Order; null when it names none.
timesheets[].work_order_id string
The work order it was made from; null when it names none in this agency.
total_pay string
The period's pay; null when no work rate resolved.
travel_hours string
Hours, a decimal string.
travel_rate string
The rate the period applied, a decimal string; "multiple" when it varied by day; null when none resolved.
work_rate string
The rate the period applied, a decimal string; "multiple" when it varied by day; null when none resolved.
worker_classification string
w2 (W-2 employee) or 1099 (independent contractor): a contractor's hours are all regular, and the ADP file leaves them out.

PayrollWorker

adp_hire_date string
The hire date ADP holds.
adp_name string
The worker's name as ADP spells it.
adp_status string, required
The worker's status in ADP.
adp_status_date string
When that status began, in ADP.
adp_worker_id string
ADP's employee or file number for the worker.
associate_oid string
ADP's id for the worker.
caregiver_id string, required
The paired caregiver; null while the worker needs a person.
caregiver_name string
The paired caregiver's name.
id string, required
The worker link, the id POST /payroll/workers/{id}/link takes; null for a caregiver with no ADP worker.
linked_at string
When it was linked.
linked_by_name string
Who linked it, for a manual link.
match_method string
How the pairing was made: by ADP number, by name with birth or hire date, by a person (manual), or by HomeCareBilling adding the worker to ADP.
missing_from_adp boolean, required
True when ADP's last complete worker list no longer held this worker; it then reads terminated.
warning string
What /payroll/workers warns about the row: a different ADP number in HomeCareBilling, or another caregiver already holding this one.

PayrollWorkerLinkInput

caregiver_id string, required
The caregiver this ADP worker is.

PayrollWorkerPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].adp_hire_date string
The hire date ADP holds.
data[].adp_name string
The worker's name as ADP spells it.
data[].adp_status string, required
The worker's status in ADP.
data[].adp_status_date string
When that status began, in ADP.
data[].adp_worker_id string
ADP's employee or file number for the worker.
data[].associate_oid string
ADP's id for the worker.
data[].caregiver_id string, required
The paired caregiver; null while the worker needs a person.
data[].caregiver_name string
The paired caregiver's name.
data[].id string, required
The worker link, the id POST /payroll/workers/{id}/link takes; null for a caregiver with no ADP worker.
data[].linked_at string
When it was linked.
data[].linked_by_name string
Who linked it, for a manual link.
data[].match_method string
How the pairing was made: by ADP number, by name with birth or hire date, by a person (manual), or by HomeCareBilling adding the worker to ADP.
data[].missing_from_adp boolean, required
True when ADP's last complete worker list no longer held this worker; it then reads terminated.
data[].warning string
What /payroll/workers warns about the row: a different ADP number in HomeCareBilling, or another caregiver already holding this one.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

PayrollWorkerSync

queued boolean, required
True: the sync is queued, or already waiting to run.

PcspDocument

client_id string, required
The client.
content_type string
Its type.
file_name string
Its name.
id string, required
The record's id.
uploaded_at string
When it was stored.

PcspReconciliationApply

decisions object
excluded, choices and supersessions.
decisions.choices object
Row index => the authorization id it updates.
decisions.excluded array of integer
Row indexes to leave out.
decisions.supersessions object
Authorization id => end_date or leave.
token string, required
The token the preview answered.

PcspReconciliationDecisions

excluded, choices and supersessions.

choices object
Row index => the authorization id it updates.
excluded array of integer
Row indexes to leave out.
supersessions object
Authorization id => end_date or leave.

PcspReconciliationPreview

candidates array of object, required
Each proposed authorisation, with its index.
expires_in_seconds integer
How long the token is good for.
identity_mismatch array of object
Set when the PCSP names another member; nothing can be applied.
service_plan_type string
initial, csr or revision.
supersessions array of object
token string
The apply token, or null when nothing can be applied.

PcspReconciliationResult

complete boolean, required
Whether nothing is left outstanding.
results array of object, required

PersonDocument

content_type string
Its type.
document_type string
What the document is, as the Documents tab's Type.
documentable_id string, required
The client or caregiver.
documentable_type string, required
Whose file it is on.
expiry_date string
When it expires, if it does.
file_name string, required
The file's name.
file_size integer
Its size in bytes.
id string, required
The record's id.
inserted_at string
When it was uploaded.
notes string
The tab's notes.
paper_form_type string
A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
record_date string
A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
scan_status string, required
The virus scan's verdict; only a clean file can be downloaded.
updated_at string
When it last changed.
uploaded_by string
Who uploaded it.

PersonDocumentList

data array of object, required
data[].content_type string
Its type.
data[].document_type string
What the document is, as the Documents tab's Type.
data[].documentable_id string, required
The client or caregiver.
data[].documentable_type string, required
Whose file it is on.
data[].expiry_date string
When it expires, if it does.
data[].file_name string, required
The file's name.
data[].file_size integer
Its size in bytes.
data[].id string, required
The record's id.
data[].inserted_at string
When it was uploaded.
data[].notes string
The tab's notes.
data[].paper_form_type string
A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
data[].record_date string
A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.
data[].scan_status string, required
The virus scan's verdict; only a clean file can be downloaded.
data[].updated_at string
When it last changed.
data[].uploaded_by string
Who uploaded it.
limit integer, required
offset integer, required
total integer, required

PersonDocumentUpdate

document_type string
What the document is, as the Documents tab's Type.
expiry_date string
When it expires.
notes string
Notes, as the tab's Notes.
paper_form_type string
A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
record_date string
A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.

PersonDocumentUpload

content_type string
Its type; null or left out reads the extension's.
document_type string
What the document is, as the Documents tab's Type.
expiry_date string
When it expires.
file_base64 string, required
The file's bytes, base64.
file_name string, required
Its name, with its extension.
notes string
Notes, as the tab's Notes.
paper_form_type string
A legacy_paper scan's form type, as the paper archive files it (US-101.7); other when not given. Ignored on any other document_type.
record_date string
A legacy_paper scan's date on the paper; a monthly form's is its month's first day. Ignored on any other document_type.

PhoneCareLogDismiss

reason string
Why it can be dismissed, 3 to 500 characters, as the screen asks.

PhoneCareLogException

attestation_skip_reason string
Why the phone attestation did not become a signature, if it did not.
caregiver_id string, required
The caregiver.
client_id string, required
The client.
finished_at string
When the call finished the day.
id string, required
The record's id.
reasons array of string, required
Why it is listed: no_tasks (No tasks entered); call_ended_early (Call ended before finishing); attestation_missing (No client confirmation); attestation_interrupted (Attestation interrupted); attestation_empty (Client recording silent); attestation_unverified (Recording not linked to this log); attestation_not_saved (Client recording could not be saved)
record_state string, required
The care log's record state; a voided one is never listed.
recording_document_id string
The client's kept recording, a voice_attestation document, if any.
service_date string, required
The day.
service_type string, required
The service.
shift_number integer, required
The shift.
visit_id string
The Visit the call clocked.

PhoneCareLogExceptionPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of PhoneCareLogException, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Plan of carePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of PlanOfCare, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

PlanOfCare

A client's Plan of Care for one service, with its tasks. Creating one makes the client's current plan for that billing line past, as on the web (an LRP Homemaker plan is its own line).

authorization_id string
The service authorization (PAR) the plan works under: one of this client's, not deleted. Null or blank unlinks it; another id answers 422 naming authorization_id.
billing_code_hmkr string
The homemaker billing code.
billing_code_ihss string
The IHSS billing code.
billing_code_pcp string
The personal care billing code.
case_manager_name string
The client's case manager.
client_id string, required
The client the plan is for.
cm_authorized_hma_hours_weekly string
Health maintenance hours a week the case manager authorized.
effective_date string
end_date string
extra_hours_weekly_hma string
Extra health maintenance hours a week.
extra_hours_weekly_homemaker string
Extra homemaker hours a week.
extra_hours_weekly_personal_care string
Extra personal care hours a week.
extra_travel_hours_weekly_hma string
Travel hours a week with the extra health maintenance hours.
extra_travel_hours_weekly_homemaker string
Travel hours a week with the extra homemaker hours.
extra_travel_hours_weekly_personal_care string
Travel hours a week with the extra personal care hours.
extra_weeks_hma string
Weeks the extra health maintenance hours run.
extra_weeks_homemaker string
Weeks the extra homemaker hours run.
extra_weeks_personal_care string
Weeks the extra personal care hours run.
flag_bi boolean
Brain injury flag.
flag_mi boolean
Mental illness flag.
flag_plwa boolean
PLWA flag.
hma_hours_weekly string
Health maintenance hours a week.
homemaker_hours_weekly string
Homemaker hours a week.
id string, required
The record's id.
inserted_at string
When the plan was created.
lrp boolean
A legally responsible person provides this Homemaker plan's care (US-83.6): it is its own billing line, billed with HA, and stays current beside the client's regular Homemaker plan. False when left out of a create; only a Homemaker plan may set it, and only on create: a PATCH that changes it answers 422 naming lrp.
lrp_hours_weekly string
Hours a week a legally responsible person provides.
missing_signers array of object
Each required line no live signature fills yet, in order; empty when complete or voided.
missing_signers[].label string, required
The line as the page names it, e.g. "client or authorized representative".
missing_signers[].roles array of string, required
The roles that would fill the line: any one of them.
modifiers_hmkr array of string
Homemaker modifiers.
modifiers_ihss array of string
IHSS modifiers.
modifiers_pcp array of string
Personal care modifiers.
notes string
Free text on the plan.
par_effective_date string
par_expiry_date string
par_number string
The PAR the plan works under.
par_units_hma integer
PAR units authorized for health maintenance.
par_units_homemaker integer
PAR units authorized for homemaker.
par_units_personal_care integer
PAR units authorized for personal care.
personal_care_hours_weekly string
Personal care hours a week.
record_state string
The signed record's state: draft until the first signature, then signed (locked: changed only by revising it), amended (an addendum was signed) or voided (revised into a new draft). signing_complete says whether every required line is signed: the client or representative, and the supervisor.
replaces_id string
The voided plan this draft was revised from, if any.
service_type string
The plan's one service.
signatures array of object
The live signatures, oldest first, without their images. Drawing is done on a device, on the plan page.
signatures[].method string, required
How it was signed: drawn, initials, typed and so on.
signatures[].role string, required
The line signed: client, or representative in the client's place, and supervisor.
signatures[].signed_at string, required
When the line was signed.
signatures[].signer_name string
The name the line is signed under.
signed_at string
When the first signature locked it; null on a draft.
signing_complete boolean
True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
status string, required
tasks array of PlanOfCareTask
The plan's tasks.
travel_hours_weekly_hma string
Health maintenance travel hours a week.
travel_hours_weekly_homemaker string
Homemaker travel hours a week.
travel_hours_weekly_personal_care string
Personal care travel hours a week.
updated_at string
When the plan last changed.
warnings array of object
What a save saved anyway, in this order: over_authorized when an update lowers a task below what the client's Work Orders still schedule; then care_planning.task_hours_over_authorization, one per service whose tasks add up to more hours a week than the plan authorizes, on a create or an update. Empty otherwise, and on a read.
warnings[].code string
The warning.
warnings[].message string
What it means.

PlanOfCareCreate

A new Plan of Care for one of the agency's clients, with its tasks, all of one service. The client's current plan for that billing line becomes past (lrp true makes a Homemaker plan its own line, beside the regular one). A client_id that is not the agency's answers 422 client_not_found.

authorization_id string
The service authorization (PAR) the plan works under: one of this client's, not deleted. Null or blank unlinks it; another id answers 422 naming authorization_id.
billing_code_hmkr string
The homemaker billing code.
billing_code_ihss string
The IHSS billing code.
billing_code_pcp string
The personal care billing code.
case_manager_name string
The client's case manager.
client_id string, required
The client the plan is for.
cm_authorized_hma_hours_weekly string
Health maintenance hours a week the case manager authorized.
effective_date string, required
end_date string
extra_hours_weekly_hma string
Extra health maintenance hours a week.
extra_hours_weekly_homemaker string
Extra homemaker hours a week.
extra_hours_weekly_personal_care string
Extra personal care hours a week.
extra_travel_hours_weekly_hma string
Travel hours a week with the extra health maintenance hours.
extra_travel_hours_weekly_homemaker string
Travel hours a week with the extra homemaker hours.
extra_travel_hours_weekly_personal_care string
Travel hours a week with the extra personal care hours.
extra_weeks_hma string
Weeks the extra health maintenance hours run.
extra_weeks_homemaker string
Weeks the extra homemaker hours run.
extra_weeks_personal_care string
Weeks the extra personal care hours run.
flag_bi boolean
Brain injury flag.
flag_mi boolean
Mental illness flag.
flag_plwa boolean
PLWA flag.
hma_hours_weekly string
Health maintenance hours a week.
homemaker_hours_weekly string
Homemaker hours a week.
lrp boolean
A legally responsible person provides this Homemaker plan's care (US-83.6): it is its own billing line, billed with HA, and stays current beside the client's regular Homemaker plan. False when left out of a create; only a Homemaker plan may set it, and only on create: a PATCH that changes it answers 422 naming lrp.
lrp_hours_weekly string
Hours a week a legally responsible person provides.
modifiers_hmkr array of string
Homemaker modifiers.
modifiers_ihss array of string
IHSS modifiers.
modifiers_pcp array of string
Personal care modifiers.
notes string
Free text on the plan.
par_effective_date string
par_expiry_date string
par_number string
The PAR the plan works under.
par_units_hma integer
PAR units authorized for health maintenance.
par_units_homemaker integer
PAR units authorized for homemaker.
par_units_personal_care integer
PAR units authorized for personal care.
personal_care_hours_weekly string
Personal care hours a week.
service_type string
The plan's service; derived from the tasks when they share one.
tasks array of object, required
The plan's tasks. A create or update replaces them with the list sent.
tasks[].ame_flag boolean
Whether the task is AME.
tasks[].justification string
Why the task needs the time it takes.
tasks[].minutes_fri integer
Minutes on that weekday (minutes_fri).
tasks[].minutes_mon integer
Minutes on that weekday (minutes_mon).
tasks[].minutes_per_task number
Minutes each time.
tasks[].minutes_sat integer
Minutes on that weekday (minutes_sat).
tasks[].minutes_sun integer
Minutes on that weekday (minutes_sun).
tasks[].minutes_thu integer
Minutes on that weekday (minutes_thu).
tasks[].minutes_tue integer
Minutes on that weekday (minutes_tue).
tasks[].minutes_wed integer
Minutes on that weekday (minutes_wed).
tasks[].norms string
The norms that apply to the task.
tasks[].shift_number integer
The shift, 1 to 4.
tasks[].sort_order integer
Where the task sits in the plan.
tasks[].task_category string
The service the task belongs to.
tasks[].task_name string
What the caregiver does; free text, as on the web.
tasks[].times_per_week integer
Times a week.
travel_hours_weekly_hma string
Health maintenance travel hours a week.
travel_hours_weekly_homemaker string
Homemaker travel hours a week.
travel_hours_weekly_personal_care string
Personal care travel hours a week.

PlanOfCareRevision

reason string, required
Why the signed plan is revised, 3 to 1000 characters. It is kept with the voided original.

PlanOfCareSignature

method string, required
How it was signed: drawn, initials, typed and so on.
role string, required
The line signed: client, or representative in the client's place, and supervisor.
signed_at string, required
When the line was signed.
signer_name string
The name the line is signed under.

PlanOfCareSupervisorSignature

signer_name string, required
The supervisor's name as the signature records it; the credential's user is the signer.

PlanOfCareTask

A task on a Plan of Care.

ame_flag boolean
Whether the task is AME.
id string
The record's id.
justification string
Why the task needs the time it takes.
minutes_fri integer
Minutes on that weekday (minutes_fri).
minutes_mon integer
Minutes on that weekday (minutes_mon).
minutes_per_task string
Minutes each time.
minutes_per_week string
Minutes a week, computed by the plan.
minutes_sat integer
Minutes on that weekday (minutes_sat).
minutes_sun integer
Minutes on that weekday (minutes_sun).
minutes_thu integer
Minutes on that weekday (minutes_thu).
minutes_tue integer
Minutes on that weekday (minutes_tue).
minutes_wed integer
Minutes on that weekday (minutes_wed).
norms string
The norms that apply to the task.
shift_number integer
The shift, 1 to 4.
sort_order integer
Where the task sits in the plan.
task_category string
The service the task belongs to.
task_name string
What the caregiver does; free text, as on the web.
times_per_week integer
Times a week.

PlanOfCareTaskInput

A task on a Plan of Care, as a create or update takes it.

ame_flag boolean
Whether the task is AME.
justification string
Why the task needs the time it takes.
minutes_fri integer
Minutes on that weekday (minutes_fri).
minutes_mon integer
Minutes on that weekday (minutes_mon).
minutes_per_task number
Minutes each time.
minutes_sat integer
Minutes on that weekday (minutes_sat).
minutes_sun integer
Minutes on that weekday (minutes_sun).
minutes_thu integer
Minutes on that weekday (minutes_thu).
minutes_tue integer
Minutes on that weekday (minutes_tue).
minutes_wed integer
Minutes on that weekday (minutes_wed).
norms string
The norms that apply to the task.
shift_number integer
The shift, 1 to 4.
sort_order integer
Where the task sits in the plan.
task_category string
The service the task belongs to.
task_name string
What the caregiver does; free text, as on the web.
times_per_week integer
Times a week.

PlanOfCareUpdate

The plan fields to change, and its tasks. A task list sent replaces the plan's tasks; leave it out to keep them. Lowering a task below what the client's Work Orders still schedule is saved with an over_authorized warning.

authorization_id string
The service authorization (PAR) the plan works under: one of this client's, not deleted. Null or blank unlinks it; another id answers 422 naming authorization_id.
billing_code_hmkr string
The homemaker billing code.
billing_code_ihss string
The IHSS billing code.
billing_code_pcp string
The personal care billing code.
case_manager_name string
The client's case manager.
cm_authorized_hma_hours_weekly string
Health maintenance hours a week the case manager authorized.
effective_date string
end_date string
extra_hours_weekly_hma string
Extra health maintenance hours a week.
extra_hours_weekly_homemaker string
Extra homemaker hours a week.
extra_hours_weekly_personal_care string
Extra personal care hours a week.
extra_travel_hours_weekly_hma string
Travel hours a week with the extra health maintenance hours.
extra_travel_hours_weekly_homemaker string
Travel hours a week with the extra homemaker hours.
extra_travel_hours_weekly_personal_care string
Travel hours a week with the extra personal care hours.
extra_weeks_hma string
Weeks the extra health maintenance hours run.
extra_weeks_homemaker string
Weeks the extra homemaker hours run.
extra_weeks_personal_care string
Weeks the extra personal care hours run.
flag_bi boolean
Brain injury flag.
flag_mi boolean
Mental illness flag.
flag_plwa boolean
PLWA flag.
hma_hours_weekly string
Health maintenance hours a week.
homemaker_hours_weekly string
Homemaker hours a week.
lrp boolean
A legally responsible person provides this Homemaker plan's care (US-83.6): it is its own billing line, billed with HA, and stays current beside the client's regular Homemaker plan. False when left out of a create; only a Homemaker plan may set it, and only on create: a PATCH that changes it answers 422 naming lrp.
lrp_hours_weekly string
Hours a week a legally responsible person provides.
modifiers_hmkr array of string
Homemaker modifiers.
modifiers_ihss array of string
IHSS modifiers.
modifiers_pcp array of string
Personal care modifiers.
notes string
Free text on the plan.
par_effective_date string
par_expiry_date string
par_number string
The PAR the plan works under.
par_units_hma integer
PAR units authorized for health maintenance.
par_units_homemaker integer
PAR units authorized for homemaker.
par_units_personal_care integer
PAR units authorized for personal care.
personal_care_hours_weekly string
Personal care hours a week.
tasks array of object
The plan's tasks. A create or update replaces them with the list sent.
tasks[].ame_flag boolean
Whether the task is AME.
tasks[].justification string
Why the task needs the time it takes.
tasks[].minutes_fri integer
Minutes on that weekday (minutes_fri).
tasks[].minutes_mon integer
Minutes on that weekday (minutes_mon).
tasks[].minutes_per_task number
Minutes each time.
tasks[].minutes_sat integer
Minutes on that weekday (minutes_sat).
tasks[].minutes_sun integer
Minutes on that weekday (minutes_sun).
tasks[].minutes_thu integer
Minutes on that weekday (minutes_thu).
tasks[].minutes_tue integer
Minutes on that weekday (minutes_tue).
tasks[].minutes_wed integer
Minutes on that weekday (minutes_wed).
tasks[].norms string
The norms that apply to the task.
tasks[].shift_number integer
The shift, 1 to 4.
tasks[].sort_order integer
Where the task sits in the plan.
tasks[].task_category string
The service the task belongs to.
tasks[].task_name string
What the caregiver does; free text, as on the web.
tasks[].times_per_week integer
Times a week.
travel_hours_weekly_hma string
Health maintenance travel hours a week.
travel_hours_weekly_homemaker string
Homemaker travel hours a week.
travel_hours_weekly_personal_care string
Personal care travel hours a week.

PlanServiceMinutes

authorized_minutes integer, required
rounding string, required
service string, required
task_minutes integer, required

Prospect

Someone in the agency's pipeline: a potential client or a potential employee. Converting one at onboarding makes the client or caregiver and links it here.

address string
Their address on one line, "street, city, ST 12345". Carried to the client or caregiver on conversion.
availability string
Employee: when they can work.
contact_name string
Client: the person to reach about them (family, a case manager). Becomes the client's emergency contact on conversion.
contact_notes string
Notes from contacting them.
contact_phone string
Client: the contact person's 10-digit phone.
converted_at string
When it was converted (UTC).
converted_to_id string
The client or caregiver it was converted to.
converted_to_type string
What it was converted to.
email string
Email address.
employee_comments string
Employee: comments.
first_name string, required
First name.
has_experience boolean
Employee: whether they have care experience.
has_vehicle boolean
Employee: whether they have a vehicle.
id string, required
The record's id.
inserted_at string
When it was added.
insurance_type string
Client: their coverage.
languages array of string
Languages spoken, for either kind of lead (at most 5). A potential client's become the client's language preference on conversion.
last_name string, required
Last name.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
medicaid_id string
Client: their Colorado Medicaid ID, one letter and six digits. Carried to the client on conversion.
next_follow_up_date string
When to follow up next.
phone string
Phone number.
physical_restrictions string
Employee: physical restrictions.
prospect_type string, required
A potential client or a potential employee.
referral_source string
Client: who referred them.
service_needs string
Client: what services they need.
source string
How they found the agency.
status string, required
Where they are in the pipeline.
updated_at string
When it last changed.
working_area string
Employee: where they can work.

ProspectConversion

converted_to_id string, required
The client or caregiver the prospect became: a new record, or the client already on file it was linked to.
converted_to_type string, required
What was made.
prospect Prospect, required
warnings array of string, required
What the conversion did not do as asked: a Medicaid ID left off, an existing client linked, namesakes on file. Usually empty.

ProspectConversionInput

as string
Start onboarding (US-122.23), as the Pipeline page's Start onboarding does: an open caregiver lead at any stage (new to onboarding) is moved to onboarding and becomes a caregiver with status potential, its open-shift responses, alerts and portal devices moving with it; a former employee's re-hire lead sets that caregiver card back to potential instead of making one. A closed lead answers 422 lead_not_open, a client lead 422 not_employee_lead. Send it again with the possible-match answer. Absent: convert at onboarding into an active caregiver or a client.
create_new boolean | array of string
The answer to a 409 possible_match when the prospect is someone else: a new record is made, and warnings counts the namesakes passed over. A list of record ids names the namesakes the caller was shown, and makes the record only if it names every namesake on file now that the caller can open, and, with hidden_seen, no more than that many on cards it cannot; one filed since (or one the 409 counted in more and did not list) answers 409 possible_match again. true is an explicit "create regardless": the record is made, passing over every namesake on file, including any the caller never saw. false or absent makes nothing.
hidden_seen integer
With a create_new list: the hidden count of the 409 possible_match it answers, the namesakes on cards the caller cannot open, which are never named. The list then also passes over up to that many of them, as the Pipeline page's "Someone else" does; one more than that (filed since) answers 409 possible_match again. Absent or 0 passes over none.
same_person_id string
The answer to a 409 possible_match: the id of one of its matches, which is the same person. The prospect is linked to that record and nothing is made. An id that is no longer one of the prospect's namesakes answers 409 possible_match again.

ProspectCreate

Adds a prospect, as the Pipeline page's New does. first_name, last_name, phone and prospect_type are required.

address string
Their address on one line, "street, city, ST 12345". Carried to the client or caregiver on conversion.
availability string
Employee: when they can work.
contact_name string
Client: the person to reach about them (family, a case manager). Becomes the client's emergency contact on conversion.
contact_notes string
Notes from contacting them.
contact_phone string
Client: the contact person's 10-digit phone.
email string
Email address.
employee_comments string
Employee: comments.
first_name string, required
First name.
has_experience boolean
Employee: whether they have care experience.
has_vehicle boolean
Employee: whether they have a vehicle.
insurance_type string
Client: their coverage.
languages array of string
Languages spoken, for either kind of lead (at most 5). A potential client's become the client's language preference on conversion.
last_name string, required
Last name.
medicaid_id string
Client: their Colorado Medicaid ID, one letter and six digits. Carried to the client on conversion.
next_follow_up_date string
When to follow up next.
phone string, required
Phone number.
physical_restrictions string
Employee: physical restrictions.
prospect_type string, required
A potential client or a potential employee.
referral_source string
Client: who referred them.
service_needs string
Client: what services they need.
source string
How they found the agency.
status string
Where they are in the pipeline. Not converted: only POST /api/v1/prospects/{id}/convert converts a prospect, with the client or caregiver it makes.
working_area string
Employee: where they can work.

ProspectInput

Send only the fields to change, with the lock_version read. A status moves only along the pipeline (new → contacted → interested → interviewing → onboarding; declined or archived back to new); converted is reached only by POST /api/v1/prospects/{id}/convert, never sent as a status (a create or update sending it answers 422).

address string
Their address on one line, "street, city, ST 12345". Carried to the client or caregiver on conversion.
availability string
Employee: when they can work.
contact_name string
Client: the person to reach about them (family, a case manager). Becomes the client's emergency contact on conversion.
contact_notes string
Notes from contacting them.
contact_phone string
Client: the contact person's 10-digit phone.
email string
Email address.
employee_comments string
Employee: comments.
first_name string
First name.
has_experience boolean
Employee: whether they have care experience.
has_vehicle boolean
Employee: whether they have a vehicle.
insurance_type string
Client: their coverage.
languages array of string
Languages spoken, for either kind of lead (at most 5). A potential client's become the client's language preference on conversion.
last_name string
Last name.
medicaid_id string
Client: their Colorado Medicaid ID, one letter and six digits. Carried to the client on conversion.
next_follow_up_date string
When to follow up next.
phone string
Phone number.
physical_restrictions string
Employee: physical restrictions.
referral_source string
Client: who referred them.
service_needs string
Client: what services they need.
source string
How they found the agency.
status string
Where they are in the pipeline. Not converted: only POST /api/v1/prospects/{id}/convert converts a prospect, with the client or caregiver it makes.
working_area string
Employee: where they can work.

ProspectPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Prospect, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Provider revalidationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ProviderRevalidation, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ProviderCarePlan

authorizations_reconciled_at string
When its authorisations were last fully reconciled.
certification_end_date string
The certification period's end.
certification_start_date string
The certification period's start.
client_id string, required
The client.
created_at string
When it was created.
current_revision_id string
Its current revision.
id string, required
The record's id.
source_document_id string
The PCSP it was imported from.
status string, required
Whether it is the client's current plan.
updated_at string
When it last changed.

ProviderCarePlanDetail

authorizations_reconciled_at string
When its authorisations were last fully reconciled.
certification_end_date string
The certification period's end.
certification_start_date string
The certification period's start.
client_id string, required
The client.
content object, required
The current revision's fields, by key.
created_at string
When it was created.
current_revision_id string
Its current revision.
id string, required
The record's id.
reconciliation_outcome object
The last reconciliation's rows.
source_document_id string
The PCSP it was imported from.
status string, required
Whether it is the client's current plan.
updated_at string
When it last changed.

ProviderCarePlanPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].authorizations_reconciled_at string
When its authorisations were last fully reconciled.
data[].certification_end_date string
The certification period's end.
data[].certification_start_date string
The certification period's start.
data[].client_id string, required
The client.
data[].created_at string
When it was created.
data[].current_revision_id string
Its current revision.
data[].id string, required
The record's id.
data[].source_document_id string
The PCSP it was imported from.
data[].status string, required
Whether it is the client's current plan.
data[].updated_at string
When it last changed.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ProviderCarePlanReconciliation

complete boolean
Whether nothing is left outstanding.
rows array of object
One per service row.

ProviderCarePlanSave

certification_choice string
Which period wins when the PCSP's and the client's certification disagree.
certification_end_date string
The PCSP's certification end, YYYY-MM-DD.
certification_start_date string
The PCSP's certification start, YYYY-MM-DD.
change_note string
Why this revision.
client_id string
For a new plan: the client.
content object
The plan's fields, by key, as get_provider_care_plan shows them.
source_document_id string
The PCSP stored for the client, with store_pcsp; a new plan only, where null means none.

ProviderRevalidation

A Medicaid revalidation due date for one NPI. The bell reminds every member holding compliance.view at 90, 60 and 30 days.

id string, required
The record's id.
inserted_at string
When the date was entered.
last_alerted_threshold integer
The notice last sent, 90, 60 or 30 days; null when none has been. A changed date clears it.
location_name string
Which location the NPI is enrolled for, when it has several.
notes string
Anything the agency wants to remember about it.
npi string, required
The NPI, exactly 10 digits.
revalidation_due_on string, required
The revalidation due date the Provider Web Portal shows (YYYY-MM-DD).
updated_at string
When it last changed.

ProviderRevalidationInput

A revalidation date's fields. A POST needs npi and revalidation_due_on; a PATCH sets only the fields sent, and a changed date is reminded again at 90, 60 and 30 days.

location_name string
Which location the NPI is enrolled for, when it has several.
notes string
Anything the agency wants to remember about it.
npi string
The NPI, exactly 10 digits.
revalidation_due_on string
The revalidation due date the Provider Web Portal shows (YYYY-MM-DD).

ProviderTypeCertification

certification_text string
certification_translations object
certification_version string
code string
id string
The record's id.

ProviderTypeCertificationUpdate

certification_text string
English; empty for the standard wording.
certification_version string, required
As GET /api/v1/provider-type-modifiers (find_provider_type_modifiers) returned it.
translation string
Optional: into the agency's card language.

ProviderTypeModifierWarning

message string, required
What the admin is warned of.
rule_id string, required
The rule that raised it.

ProviderTypeModifiers

agency_owned boolean
Whether the agency has its own copy of the template. Its first certification save on a system template makes that copy; modifier changes write the agency's offering and make no copy.
billing_code string
The HCPCS code it bills.
certification_text string
The certification its cards print, in English.
certification_translations object
Its translations, by language code.
certification_version string
What a certification save sends back, to refuse one saved since.
code string, required
The provider type's code, as the path takes it.
id string
The record's id.
modifiers array of string, required
The modifiers it bills, and the batch validation expects.
name string
The provider type's name.

QuestionAnswer

A question the agency asks, keyed by its question key, with its wording, type, the options a choice offers, and the answer on record. Send an answer back under the same key.

answer string | array of string
The answer on record: text, a code, or a list of choices.
comment string
A visit answer's comment; a monthly report keeps none.
key string, required
The question's key; answers are sent under it.
options array of string
The answers a yes/no or choice takes; none for free text.
question string
The question's wording.
type string, required
yes_no, text, choice, multi_choice, date and the like.

Recertification

The renewal of a service authorization (PAR).

authorization_id string, required
The authorization being renewed.
case_manager string
The case manager handling the renewal.
id string, required
The record's id.
inserted_at string
When the recertification was started.
notes string
Free text on the renewal.
renewed_authorization_id string
The authorization that renewed it, once renewed.
renewed_on string
requested_on string
state string, required
target_date string
updated_at string
When it last changed.

RecertificationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Recertification, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Reconciliation

The payment against its claims: bpr_total should equal claims_total minus plb_net, and balanced is false when it does not. In the remittances list these are the figures stored when the 835 was recorded: null for one recorded before they were stored, and an amount they do not hold readably is null, and then so is balanced. On a single remittance they are computed from its parse, and null only when it has none.

balanced boolean
bpr_total string
What HCPF paid, the BPR amount.
claims_total string
The claims' paid amounts added up.
plb_net string
Provider-level adjustments (PLB), net.

RecordAddendum

Text added to a signed record after signing, signed by its author. The record it amends is never changed.

author_user_id string
The member who wrote and signed it.
body string, required
What was added.
id string, required
The addendum.
reason string, required
Why it was added.
record_id string, required
The record it amends.
record_state string, required
signed once its author's signature is recorded.
record_type string, required
The type of the record it amends: supervisor_visit, plan_of_care, monthly_client_report, complaint, critical_incident, client_consent_form, client_emergency_info or care_log.
signed_at string
When it was signed.
signer_name string
The name it is signed under.
true_copy_document_id string
Its true copy (PDF): the record's print as it stood when the addendum was signed; null until stored.

RecordAddendumInput

body string, required
What to add, up to 5000 characters. The signed record itself never changes.
reason string, required
Why it is added, 3 to 1000 characters.
signer_name string
The name the addendum is signed under, a typed signature by the credential's user; the user's own name when left out.

RecordImportResult

dry_run boolean, required
true: nothing was written; the counts are what the import would do.
failed array of object, required
Rows refused, by row number (the first row after the header is 1), with the errors by field.
failed[].errors object, required
Field name to its error messages.
failed[].row integer, required
format string, required
How the file was read: HCB's own columns, or an InMyTeam export recognised by its headers.
imported integer, required
Rows written as new records.
pay_withheld object
Caregivers only: the rows whose pay rates, W-4 and ADP fields were left out because the key's member lacks payroll.manage, and the words for it; null when none were.
pay_withheld.message string
pay_withheld.rows integer
reasons object, required
Rows imported, updated or skipped in a way to check, by code (already_on_file, pay_rates_skipped, office_staff...): each {row, detail}, the detail naming no person.
skipped integer, required
Rows not written; reasons says why (already_on_file, empty_row, office_staff...).
updated integer, required
Rows matching a record on file that filled in what that record left blank.

RecordSignatureSummary

method string, required
How it was signed.
role string, required
The line signed.
signed_at string, required
When.
signer_name string, required
Who signed.

RecurringLineCreate

charge_amount string, required
Amount billed each period.
diagnosis_code_1 string
A diagnosis code.
diagnosis_code_2 string
A diagnosis code.
diagnosis_code_3 string
A diagnosis code.
diagnosis_code_4 string
A diagnosis code.
member_id string, required
The Medicaid member id.
modifier_1 string
A modifier.
modifier_2 string
A modifier.
modifier_3 string
A modifier.
modifier_4 string
A modifier.
par_number string
The prior authorization request number.
patient_dob string
The member's date of birth, YYYY-MM-DD. Written only; never answered.
patient_first_name string
The member's first name.
patient_last_name string
The member's last name.
place_of_service string
The place of service code, e.g. 99.
procedure_code string, required
The procedure code, e.g. T1019.
rendering_npi string
The rendering provider's NPI.
units string, required
Units billed each period.

RecurringLineUpdate

charge_amount string
Amount billed each period.
diagnosis_code_1 string
A diagnosis code. Null clears it.
diagnosis_code_2 string
A diagnosis code. Null clears it.
diagnosis_code_3 string
A diagnosis code. Null clears it.
diagnosis_code_4 string
A diagnosis code. Null clears it.
member_id string
The Medicaid member id.
modifier_1 string
A modifier. Null clears it.
modifier_2 string
A modifier. Null clears it.
modifier_3 string
A modifier. Null clears it.
modifier_4 string
A modifier. Null clears it.
par_number string
The prior authorization request number. Null clears it.
patient_dob string
The member's date of birth, YYYY-MM-DD. Written only; never answered. Null clears it.
patient_first_name string
The member's first name. Null clears it.
patient_last_name string
The member's last name. Null clears it.
place_of_service string
The place of service code, e.g. 99.
procedure_code string
The procedure code, e.g. T1019.
rendering_npi string
The rendering provider's NPI. Null clears it.
status string
paused leaves the line out of runs until it is set active again, whatever paused it.
units string
Units billed each period.

RecurringLineWarning

authorization_id string
The PAR an over_weekly_allowance warning was judged against; null for every other code.
code string, required
What to check.
line_id string
The line it is about.
message string, required
The words the schedule page shows.

RecurringPeriod

The period the schedule bills next, the one Skip acts on; null once it has none.

period_end string, required
The last day billed.
period_start string, required
The first day billed.

RecurringProposal

anchor_date string
Period 0's first day.
batch_id string
The batch.
cadence string
limit integer
lines array of object
lines_total integer
name string
offset integer
period object
period.period_end string, required
The last day billed.
period.period_start string, required
The first day billed.
submit_mode string
submit_time string
submit_weekday integer

RecurringRun

One billed period of a recurring schedule. status records the scheduling decision only: submitted means handed to delivery, and whether HCPF got the file is the batch's own status.

batch_id string
The batch it made; null for a period skipped before a batch was made.
fail_reason string
Why it was not sent.
held_at string
When it was held.
hold_reason string
Why it is held.
id string, required
The record's id.
inserted_at string
When the record was created.
notice_sent_at string
When the notice announcing it was queued.
period_end string, required
The last day billed.
period_start string, required
The first day billed.
schedule_id string, required
The schedule it belongs to.
scheduled_submit_at string
When it goes out unless held; null under approval or once left.
skip_reason string
Why it was skipped.
skipped_lines array of object
Each line left out of the run: its line_id, the reason, and the claim and batch it would have duplicated.
skipped_lines[].conflicting_batch_id string
That claim's batch.
skipped_lines[].conflicting_claim_id string
The claim it overlapped.
skipped_lines[].line_id string
The schedule line.
skipped_lines[].reason string
Why it was left out.
status string, required
updated_at string
When the record last changed.

RecurringSchedule

A standing instruction to bill an uploaded batch's lines again every week, two weeks or month. Each period's run makes a batch of the schedule's active lines with that period's dates.

anchor_date string
The first day of the source batch's period, period 0.
cadence string, required
How often it bills: weekly, biweekly (every two weeks) or monthly.
end_date string
No run is made for a period starting after it.
id string, required
The record's id.
inserted_at string
When the record was created.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
name string
The schedule's name, as the schedule page shows it.
paused_at string
When it was last paused.
resumed_at string
When it was last resumed.
source_batch_id string
The uploaded batch it was made from.
status string, required
active, paused (no runs until resumed) or ended (final).
submit_mode string, required
auto sends each run at its send time unless held; approval waits for a Submit.
submit_time string
The time a run is sent, HH:MM:SS, Mountain time.
submit_weekday integer
The day a run is sent, Monday 1 to Sunday 7, in Mountain time.
updated_at string
When the record last changed.

RecurringScheduleCreate

batch_id string, required
The uploaded batch to make recurring.
end_date string
No run is made for a period starting after it, YYYY-MM-DD.
name string
The schedule's name.
submit_mode string
auto sends each run at its send time unless held; approval waits for a Submit.
submit_time string
The time a run is sent, HH:MM or HH:MM:SS, Mountain time.
submit_weekday integer
The day a run is sent, Monday 1 to Sunday 7, in Mountain time.

RecurringScheduleLine

One claim line a recurring schedule bills every period, copied from a claim of the source batch or added by hand.

charge_amount string
Amount billed each period.
diagnosis_code_1 string
diagnosis_code_2 string
diagnosis_code_3 string
diagnosis_code_4 string
id string, required
The record's id.
inserted_at string
When the record was created.
member_id string
The Medicaid member id.
modifier_1 string
modifier_2 string
modifier_3 string
modifier_4 string
ordering_npi string
par_number string
The prior authorization request number.
patient_first_name string
patient_last_name string
pause_reason string
tenant when paused by hand; denied when HCPF denied its claim (paused_by_claim_id).
paused_by_claim_id string
The denied claim that paused it, when one did.
place_of_service string
The place of service code.
position integer
Its order on the schedule.
procedure_code string
The procedure code, e.g. T1019.
rendering_npi string
schedule_id string, required
The schedule it belongs to.
source_claim_id string
The claim it was copied from; null when added by hand.
status string, required
active, or paused: left out of runs until resumed.
unit_type string
The unit type, UN unless the source claim said otherwise.
units string
Units billed each period.
updated_at string
When the record last changed.

RecurringSchedulePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of RecurringSchedule | object, required
data[].next_period object
The period the schedule bills next, the one Skip acts on; null once it has none.
data[].next_period.period_end string, required
The last day billed.
data[].next_period.period_start string, required
The first day billed.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

RecurringScheduleUpdate

end_date string
YYYY-MM-DD; null clears it.
lock_version integer
The lock_version the schedule was read with; required when a setting (name, submit_mode, submit_weekday, submit_time, end_date) is sent. A schedule changed since answers 409 stale_record.
name string
The schedule's name.
status string
Pause (paused), resume (active) or end (ended, final) the schedule.
submit_mode string
auto sends each run at its send time unless held; approval waits for a Submit.
submit_time string
The time a run is sent, HH:MM or HH:MM:SS, Mountain time.
submit_weekday integer
The day a run is sent, Monday 1 to Sunday 7, in Mountain time.

RecurringSkip

period_start string, required
The next_period.period_start this schedule was read with. Any other answers 409 period_moved, so a repeated skip never skips a second period.

RefusedClock

assignment string, required
A clock-in or a clock-out.
captured_at string, required
When the caregiver clocked (UTC), the device's time when it sent one.
caregiver_id string, required
The record's id.
device_id string
The device that sent the clock.
gps_accuracy_meters number
How accurate the location was, in meters.
id string, required
The record's id.
inserted_at string
When the server kept it (UTC).
latitude string
Where the device was.
longitude string
Where the device was.
reviewed_at string
When the office marked it reviewed (UTC); null while open.
visit_id string, required
The record's id.
visit_status string, required
The visit's status when it refused the clock.

RefusedClockPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of RefusedClock, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Reminder

A reminder on the Today page: a supervisory visit, a recertification, a follow-up or one the agency wrote. Agency-wide reminders name no client.

client_first_name string
The client's first name.
client_id string
The client it is about.
client_last_name string
The client's last name.
due_date string, required
The day it is due.
due_time string
The time of day it is due, HH:MM:SS (Mountain time), when it has one.
event_type string, required
id string, required
The record's id.
status string, required
upcoming or overdue on the agenda.
title string, required
What is due.

ReminderClosed

The reminder's status after the call. changed is false when it was already where it was asked to go (a retry): nothing was changed, and any next occurrence the first call scheduled is not repeated here.

already boolean, required
It was already completed or dismissed, as asked, before this call.
changed boolean, required
Whether this call changed it.
id string, required
The record's id.
next object
The next occurrence completing a recurring reminder scheduled.
next.due_date string
The day it is due.
next.id string
The record's id.
recurrence_stopped boolean, required
A recurring reminder has no next one: dismissing ends the series, and completing one whose next date is past or too far out schedules none.
status string, required
completed or dismissed.

ReminderPreferences

birthday_lead_days integer, required
Days of notice before a birthday, 0 to 30.
default_reminder_time string, required
The time of day reminders are due, as HH:MM:SS in the agency's timezone.
email_digest_enabled boolean, required
Whether reminders are emailed as a digest.
paused_until string, required
Reminder email paused until then, an ISO 8601 time in the future; null resumes it.
recert_lead_days integer, required
Days of notice before a recert, 0 to 180.
supervisor_visit_cadence_mode string, required
How the next supervisory visit is counted.
supervisor_visit_cadence_value integer, required
Days or months between supervisory visits, 0 to 365.

ReminderPreferencesUpdate

birthday_lead_days integer
Days of notice before a birthday, 0 to 30.
default_reminder_time string
The time of day reminders are due, as HH:MM:SS in the agency's timezone.
email_digest_enabled boolean
Whether reminders are emailed as a digest.
paused_until string
Reminder email paused until then, an ISO 8601 time in the future; null resumes it.
recert_lead_days integer
Days of notice before a recert, 0 to 180.
supervisor_visit_cadence_mode string
How the next supervisory visit is counted.
supervisor_visit_cadence_value integer
Days or months between supervisory visits, 0 to 365.

Remittance

An 835 remittance, with its totals. GET its id for the claim lines.

file_name string
The file's name as HCPF named it.
id string, required
The record's id.
inserted_at string
When the record was created.
parsed_at string
received_at string
When it was downloaded.
reconciliation Reconciliation
updated_at string
When the record last changed.

RemittanceDetail

What HCPF paid, denied and reversed, and why. A carc is GROUP-REASON (e.g. CO-45); each code has its plain-English description beside it. The id is the 835 Response's. The MCP remittance tools return one record per batch a remittance touched, each carrying this id as response_id. reconciliation is null for a remittance with no parse.

batch_ids array of string
The agency's batches whose claims it pays or denies.
complete boolean
False only when the remittance has no parse, and then reconciliation is null and lines is empty. Otherwise true: every line was matched against all of the agency's claims, so a null claim_id means the line matched none of them.
denial_groups array of object, required
Denied claims grouped by their reason.
denial_groups[].billed_total string
Billed on those claims.
denial_groups[].carc string
GROUP-REASON.
denial_groups[].carc_description string
denial_groups[].claim_count integer
denial_groups[].rarc string
Remark code.
denial_groups[].rarc_description string
id string, required
The record's id.
limit integer, required
Lines per page.
lines array of object, required
One per claim (CLP) on the remittance, a page at a time: lines_total counts them all, and limit and offset say which page this is.
lines[].billed_amount string
Billed.
lines[].carc string
Claim adjustment reason, GROUP-REASON.
lines[].carc_description string
lines[].claim_id string
The agency's claim it matched. Null when it matched none: a claim the agency did not submit through HCB.
lines[].icn string
HCPF's internal control number.
lines[].paid_amount string
Paid; negative on a reversal.
lines[].rarc string
Remark code.
lines[].rarc_description string
lines[].status_code string
CLP02: 1 paid, 4 denied, 22 reversed, ...
lines_total integer, required
Every line on the remittance.
offset integer, required
Lines skipped.
outcomes object, required
Counts and amounts by outcome: claims_count, paid_count/paid_amount, denied_count/denied_amount, reversed_count/reversed_amount, other_count/other_amount, billed_total. Amounts are decimal strings.
received_at string
When it was downloaded.
reconciliation Reconciliation, required

RemittancePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Remittance, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ReportPresetApply

confirm boolean
Confirm a change the page would ask about first.
preset string, required
The preset's name.

ReportQuestion

active boolean
Whether new reports ask it.
advisory boolean
Whether a statute or the agency's paper asks for it.
config object
Its type's settings.
id string, required
The record's id.
item_type string
What kind of question it is.
labels object, required
Its text by language code (en, and the print language).
position integer
Its place on the form.
printed boolean
Whether it prints.
question_key string, required
Its frozen key; answers are kept under it.
report_type string, required
Its report type.
required_to_sign boolean
Whether it must be answered before signing.
seeded boolean
Whether it ships with the form.
translated boolean
Whether it prints in the second language.

ReportQuestionCreate

describes string
text: the key of the question it explains; null or an empty string clears it.
heading string
consent_text: its heading.
item_type string
What kind of question it is; the report type's first kind when omitted.
label_en string, required
The English text.
label_secondary string
The text in the agency's print language; null or an empty string removes it.
multiline boolean
text: whether the answer is a paragraph.
option_labels object
choice and multi_choice: a caption for each code, keyed by code. It replaces the stored captions. A code it names must be in the options, or be one this same write removes from them, whose caption is dropped with it. Sent without it, an options change keeps the captions of the codes still listed.
options array of string
choice and multi_choice: the option codes, in print order.
print_region string
yes_no on the supervisory sheet: where it prints. A new one prints in the table unless told otherwise. The sheet's own band questions print below both tables and take none.

ReportQuestionFlag

flag string, required
The flag to set.
value boolean, required
What to set it to.

ReportQuestionHide

confirm boolean
Confirm a change the page would ask about first.

ReportQuestionMove

direction string, required
Which way.

ReportQuestionUpdate

confirm boolean
Confirm a change the page would ask about.
describes string
text: the key of the question it explains; null or an empty string clears it.
heading string
consent_text: its heading.
item_type string
Its kind, which never changes: the type it has is accepted, any other is refused.
label_en string, required
The English text.
label_secondary string
The text in the agency's print language; null or an empty string removes it.
multiline boolean
text: whether the answer is a paragraph.
option_labels object
choice and multi_choice: a caption for each code, keyed by code. It replaces the stored captions. A code it names must be in the options, or be one this same write removes from them, whose caption is dropped with it. Sent without it, an options change keeps the captions of the codes still listed.
options array of string
choice and multi_choice: the option codes, in print order.
print_region string
yes_no on the supervisory sheet: where it prints. A new one prints in the table unless told otherwise. The sheet's own band questions print below both tables and take none.

ReportQuestionsMoved

ReportQuestionsPreset

ReportTemplate

form object, required
form.orientation string, required
How it prints.
form.report_type string, required
The report type.
form.title string
The printed title; null prints the default.
form.version integer
How many times it has been saved.
questions array of object, required
questions[].active boolean
Whether new reports ask it.
questions[].advisory boolean
Whether a statute or the agency's paper asks for it.
questions[].config object
Its type's settings.
questions[].id string, required
The record's id.
questions[].item_type string
What kind of question it is.
questions[].labels object, required
Its text by language code (en, and the print language).
questions[].position integer
Its place on the form.
questions[].printed boolean
Whether it prints.
questions[].question_key string, required
Its frozen key; answers are kept under it.
questions[].report_type string, required
Its report type.
questions[].required_to_sign boolean
Whether it must be answered before signing.
questions[].seeded boolean
Whether it ships with the form.
questions[].translated boolean
Whether it prints in the second language.

ReportTemplateForm

orientation string, required
How it prints.
report_type string, required
The report type.
title string
The printed title; null prints the default.
version integer
How many times it has been saved.

ReportTemplateFormUpdate

orientation string, required
How it prints.
title string
The printed title; null, blank or left out prints the default.

Response

A file HCPF sent back: an acknowledgment of a submission (response_type says which kind), or era835, a remittance, whose amounts are at /api/v1/remittances/{id}.

acknowledged boolean
For an acknowledgment: whether HCPF accepted the submission.
batch_id string
The batch whose submission it answers; null for a remittance, which can pay several (see its batch_ids).
error_code string
For a refusal, HCPF's code.
error_message string
For a refusal, what HCPF said.
file_name string
The file's name as HCPF named it.
id string, required
The record's id.
inserted_at string
When the record was created.
parsed_at string
processed_at string
When claims were updated from it.
received_at string
When it was downloaded.
response_type string, required
updated_at string
When the record last changed.

ResponsePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Response, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

RestoreBody

lock_version integer, required
The lock_version the deleted record has: the one its DELETE answered, or read it by listing with include_deleted=true.

ResubmissionDeadline

A denied or unpaid claim and the last day Colorado Medicaid accepts it: 365 days from its first date of service, or 60 days from the answer to its latest ICN when that is later. Dismiss one with POST /api/v1/revenue-warnings/dismissals, sending kind resubmission_deadline, its claim_id as subject_id and its fingerprint; a newer ICN that moves the date lists it again. It blocks nothing.

basis string, required
What the date counts from: 365 days from the date of service, or 60 days from the latest ICN's answer.
batch_id string
The claim file the claim is in.
claim_id string, required
The record's id.
client_id string
The client the claim bills for.
days_left integer, required
Days from today to resubmit_by; negative once it has passed.
dismissed boolean, required
Whether a member dismissed this line at this date.
fingerprint string, required
The resubmit_by date, which a dismissal names.
icn string
The newest claim's ICN, when HCPF gave it one.
id string, required
The claim's id, as claim_id.
kind string, required
The dismissal kind: resubmission_deadline.
procedure_code string, required
The HCPCS procedure code.
resubmit_by string, required
The last day the line can be resubmitted.
service_date_from string, required
The claim's first date of service.
service_date_to string, required
The claim's last date of service.
status string, required
The newest claim's status.

ResubmissionDeadlinePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ResubmissionDeadline, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

RevenueAtRisk

A PAR ending inside the window with authorized care unused and no renewal on file (source unused_authorization: bill the care or renew the PAR), or a scheduled visit inside the window that no active or pending PAR of its client and code covers (source uncovered_visit: enter the renewal PAR or move the visit). Nothing here blocks a claim.

client_id string, required
The record's id.
client_name string, required
The client, last name first.
date string, required
The PAR's end date, or the visit's date of service.
service_code string, required
The HCPCS code.
source string, required
What is at risk.
subject_id string, required
The service authorization (unused_authorization) or the visit (uncovered_visit).
units string, required
15-minute units for an hourly code, visits for a per-visit code: the PAR's unused units, or the visit's scheduled time. Null when the code's unit cannot be told.
value string, required
Whole dollars at HCPF's published rate. Null when no published rate prices it; such a row adds nothing to the total.

RevenueAtRiskPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of RevenueAtRisk, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
summary object, required
summary.total string, required
unused.value plus uncovered.value, in whole dollars.
summary.truncated boolean, required
True when the window held more PARs or visits than one read values; the total is then a floor.
summary.uncovered object, required
Scheduled care with no PAR.
summary.uncovered.count integer, required
Rows, priced or not.
summary.uncovered.value string, required
Whole dollars, the priced rows only.
summary.unpriced_count integer, required
Rows with no published rate, left out of the total.
summary.unused object, required
Authorized care ending unused.
summary.unused.count integer, required
Rows, priced or not.
summary.unused.value string, required
Whole dollars, the priced rows only.
summary.within_days integer, required
The window read.
total integer, required
Every matching row.

RevenueAtRiskPart

Scheduled care with no PAR.

count integer, required
Rows, priced or not.
value string, required
Whole dollars, the priced rows only.

RevenueAtRiskSummary

total string, required
unused.value plus uncovered.value, in whole dollars.
truncated boolean, required
True when the window held more PARs or visits than one read values; the total is then a floor.
uncovered object, required
Scheduled care with no PAR.
uncovered.count integer, required
Rows, priced or not.
uncovered.value string, required
Whole dollars, the priced rows only.
unpriced_count integer, required
Rows with no published rate, left out of the total.
unused object, required
Authorized care ending unused.
unused.count integer, required
Rows, priced or not.
unused.value string, required
Whole dollars, the priced rows only.
within_days integer, required
The window read.

RevenueWarning

A warning about money a claim may lose. It blocks nothing. Dismiss it with POST /api/v1/revenue-warnings/dismissals, sending its kind, its claim_id as subject_id, and its fingerprint; a dismissed warning whose figures change gets a new fingerprint and warns again.

claim_id string, required
The record's id.
dismissed boolean, required
Whether a member dismissed this warning at these figures.
fingerprint string, required
The figures the warning states, joined with a colon.
kind string, required
What the warning is about.
link string
The web app path where the agency checks the warning (a care log changed after the claim was sent opens the client's evidence grid); null when the warning has none.
message string, required
The warning, in plain English.
row_number integer, required
The claim's row in the uploaded file.

RevenueWarningDismissal

dismissed_at string, required
When it was dismissed.
dismissed_by_id string
The member who dismissed it.
fingerprint string, required
The figures dismissed.
id string, required
The record's id.
kind string, required
The warning's kind.
subject_id string, required
The record's id.

RevenueWarningPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of RevenueWarning, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

SampleRecordCounts

clients integer, required
Sample clients.
employees integer, required
Sample employees.
visits integer, required
Sample visits.

SampleRecordsQueued

cases array of object
Each case's result.
cases[].case string, required
The case's id.
cases[].dry_run boolean, required
True: written to the server log, nothing sent to Sandata and nothing changed.
cases[].records integer, required
How many records the case holds.
cases[].refused object
POST /settings/sandata/certification/send only: present when this case was refused while the other went; it changed nothing.
cases[].refused.code string, required
The refusal's code, as an error carries it.
cases[].refused.message string, required
Why the case was not sent.
cases[].sending integer, required
Live: how many of them were queued, those Sandata does not hold as they are now, a record it refused included until it is parked. Dry run: how many were written to the server log.
dry_run boolean
Whether this was a dry run.
queued boolean, required
True when they were queued for Sandata; false in a dry run.

SampleVisitsQueued

case string
The test case sent.
queued_visits integer, required
Sample visits queued.

SandataCertification

cases array of object
Sandata's certification test cases, in order, each sent on its own.
cases[].applied boolean
Round 2: whether the case's change was made. Null in round 1.
cases[].blocked string
Why a send is refused now; null when it is not.
cases[].id string, required
The case's id, as POST /settings/sandata/certification/cases/{id} takes it.
cases[].records integer, required
How many records it sends.
cases[].round integer, required
1: the sample records as created. 2: changes to records Sandata accepted.
cases[].scenario string, required
The Sandata scenario it covers.
cases[].state object
Of those records, how many Sandata holds as they are now (accepted), are waiting for Sandata's answer (waiting), were refused as they are now and go again on a send (refused), were refused too often to go again until they change (parked), cannot be sent as they are (held_back), and are left to send (to_send); each record is in exactly one. Null while Sandata is paused or not set up.
cases[].title string, required
What the page calls it.
cleanup_refusal string
Why sample records cannot be removed; null when they can.
completed_count integer, required
Steps done.
dry_run boolean
Whether sends are a dry run: written to the server log, nothing sent to Sandata. Only the certification tenant has one.
environment string
The Sandata environment the sends reach.
generate_refusal string
Why sample records cannot be created; null when they can.
globally_enabled boolean
The platform switch: whether Sandata is turned on for agencies. It never pauses the certification tenant; see sandata_open.
parties array of object, required
Each sample client and employee, and where it stands with Sandata.
parties[].batch string
Its latest batch's status; null when never sent.
parties[].id string, required
The record's id.
parties[].kind string, required
Client or employee.
parties[].name string, required
Its name.
parties[].state string, required
Where it stands with Sandata.
percentage number, required
Steps done, in percent.
sandata_open boolean
False while Sandata is paused for this agency: the platform switch is off and this is not the certification tenant.
send_refusal string
Why sample records cannot be sent; null when they can.
steps array of object, required
The checklist, in order.
steps[].category string, required
Its section on the page.
steps[].completed boolean, required
Whether it is done.
steps[].date string
The day it was marked done; null when not done.
steps[].key string, required
The step's key.
steps[].notes string
Its notes; null when none.
steps[].text string, required
What the page calls it.
test_data_exists boolean
Whether sample records exist.
total_count integer, required
Steps in all.

SandataConnected

connected boolean, required
Always true.

SandataConnectionTest

sandata_agency_id string
The Sandata Account.
sandata_api_url string
The Sandata API URL (https).
sandata_entity_guid string
The EntityGuid header, sent when set.
sandata_password string
The password; null or blank tests the saved one.
sandata_username string
The username; null or blank tests the saved one.

SandataSettings

sandata_agency_id string
The Sandata Account.
sandata_api_url string
The Sandata API URL (https).
sandata_batch_size integer
Visits per send, 1 to 5000.
sandata_custom_cron string
A five-field cron expression, for a custom schedule.
sandata_default_timezone string
The timezone visits are sent in.
sandata_enabled string
Whether visits are sent to Sandata.
sandata_entity_guid string
The EntityGuid header, sent when set.
sandata_password object, required
sandata_password.set boolean, required
Whether a value is saved; read it with the secrets operation.
sandata_provider_id string
The agency's Medicaid provider id (8 to 10 digits).
sandata_send_visit_memo string
Whether the visit memo is sent.
sandata_submission_schedule string
When visits are sent: a preset or custom.
sandata_username object, required
sandata_username.set boolean, required
Whether a value is saved; read it with the secrets operation.

SandataSettingsUpdate

sandata_agency_id string
The Sandata Account.
sandata_api_url string
The Sandata API URL (https).
sandata_batch_size integer
Visits per send, 1 to 5000.
sandata_custom_cron string
A five-field cron expression, for a custom schedule.
sandata_default_timezone string
The timezone visits are sent in.
sandata_enabled string
Whether visits are sent to Sandata.
sandata_entity_guid string
The EntityGuid header, sent when set.
sandata_password string
The password; null or blank keeps the saved one.
sandata_provider_id string
The agency's Medicaid provider id (8 to 10 digits).
sandata_send_visit_memo string
Whether the visit memo is sent.
sandata_submission_schedule string
When visits are sent: a preset or custom.
sandata_username string
The username; null or blank keeps the saved one.

SatisfactionSurvey

One satisfaction survey of a client: a draft until it is completed.

client_id string, required
The client surveyed.
comments string
Comments.
conducted_by_id string
Who conducted it.
conducted_via string
How it was conducted.
id string, required
The record's id.
inserted_at string
When it was recorded.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
responses object
The answers, by question key.
status string, required
A draft, or completed.
survey_date string, required
The day of the survey.
updated_at string
When it last changed.

SatisfactionSurveyInput

Send only the fields to change, with the lock_version read.

comments string
Comments.
conducted_via string
How it was conducted.
responses object
The answers, by question key; the answers sent replace those stored. A yes/no question takes yes, no or na, a rating poor, fair, good or excellent.
responses.q1 string
Were you given a copy of the Consumer/Employee Handbook?
responses.q10 string
Is the employee courteous and respectful?
responses.q11 string
Does the employee report changes in your condition to the supervisor?
responses.q12 string
Does the employee maintain confidentiality?
responses.q13 string
Does the employee follow infection control/universal precaution practices?
responses.q14 string
If applicable, does the employee properly handle your medications?
responses.q15 string
Has the agency sent a substitute when the regular employee is absent?
responses.q16a string
Bathing
responses.q16b string
Dressing
responses.q16c string
Grooming
responses.q16d string
Toileting
responses.q16e string
Eating/Feeding
responses.q16f string
Transferring/Mobility
responses.q16g string
Meal Preparation
responses.q16h string
Housekeeping
responses.q16i string
Laundry
responses.q16j string
Shopping/Errands
responses.q17 string
Has the employee ever asked you to sign a blank timesheet?
responses.q18 string
Has the employee ever asked you to sign a timesheet without reviewing it?
responses.q19 string
Has the employee ever asked you for money or gifts?
responses.q2 string
Were you informed about the complaint/grievance procedures?
responses.q20 string
Has anyone from the agency asked you to pay for services?
responses.q21 string
Has the agency supervisor visited you at least once every 6 months?
responses.q22 string
What do you like best about the services you receive?
responses.q23 string
What changes would you suggest to improve services?
responses.q24 string
Would you recommend this agency to others?
responses.q25 string
Do you feel safe with the employee in your home?
responses.q26 string
How would you rate the overall quality of services?
responses.q27 string
Additional comments:
responses.q3a string
Name of the agency
responses.q3b string
Name of the supervisor
responses.q3c string
How to contact the agency
responses.q3d string
What to do in case of an emergency
responses.q3e string
How to report complaints
responses.q3f string
Services to be provided
responses.q4 string
Were you asked to sign a document verifying the above information?
responses.q5 string
Are you receiving the services as outlined in the service plan?
responses.q6 string
Were you involved in the development of the service plan?
responses.q7 string
Has the service plan been reviewed at least annually?
responses.q8 string
Does the employee arrive and leave on time?
responses.q9 string
Does the employee perform the tasks listed in the service plan?
survey_date string
The day of the survey, YYYY-MM-DD.

SatisfactionSurveyPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of SatisfactionSurvey, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

SavedProviderTypeModifiers

agency_owned boolean
Whether the agency has its own copy of the template. Its first certification save on a system template makes that copy; modifier changes write the agency's offering and make no copy.
billing_code string
The HCPCS code it bills.
certification_text string
The certification its cards print, in English.
certification_translations object
Its translations, by language code.
certification_version string
What a certification save sends back, to refuse one saved since.
code string, required
The provider type's code, as the path takes it.
id string
The record's id.
modifiers array of string, required
The modifiers it bills, and the batch validation expects.
name string
The provider type's name.
warnings array of object, required
What the saved set warns of; usually empty. Never a refusal: the set is saved. Each names its rule (catalog.unpriced_modifier: a modifier no fee schedule in force today or later prices on the billing code; it bills as entered) and the message.
warnings[].message string, required
What the admin is warned of.
warnings[].rule_id string, required
The rule that raised it.

ScheduleImportResult

dry_run boolean, required
true: nothing was written; items are what the import would do.
failed array of object
Real run only: items refused, by row, with the errors by field.
failed[].errors object, required
failed[].row integer, required
imported integer
Real run only: new assignments written.
items array of object, required
items[].assignment_id string
items[].caregiver string, required
"Last, First" from the agency's records, or the PDF's name when none matched.
items[].caregiver_id string
Null when not matched.
items[].client string, required
"Last, First" from the agency's records, or the PDF's name when none matched.
items[].client_id string
Null when not matched.
items[].days_after array of object, required
The days the file gives.
items[].days_after[].day_of_week string, required
items[].days_after[].end_time string, required
HH:MM:SS
items[].days_after[].ends_next_day boolean, required
true: the visit ends after midnight, on the next day.
items[].days_after[].shift_number integer, required
1 to 4: the visit's place on its day.
items[].days_after[].start_time string, required
HH:MM:SS
items[].days_before array of object, required
The days HCB holds now.
items[].days_before[].day_of_week string, required
items[].days_before[].end_time string, required
HH:MM:SS
items[].days_before[].ends_next_day boolean, required
true: the visit ends after midnight, on the next day.
items[].days_before[].shift_number integer, required
1 to 4: the visit's place on its day.
items[].days_before[].start_time string, required
HH:MM:SS
items[].outcome string, required
new: a pair HCB has no active or open temporary assignment for; changed: its days differ; unchanged: they match; not_imported: a name or service that did not resolve (reason says which); not_on_schedule: an active assignment, or a temporary one with no end date, that the file does not name, left as it is.
items[].reason string, required
items[].row integer, required
The item's number, which failed, reasons and warnings name.
items[].service string, required
InMyTeam's service label (PCA, HMKRrel...), or for not_on_schedule the assignment's provider type.
items[].warnings array of string, required
reasons object
Real run only: rows by code, each {row, detail}.
skipped integer
Real run only: items not written; reasons says why (unchanged, not_imported, not_on_schedule, already_on_file, changed_since_preview).
updated integer
Real run only: assignments whose days were replaced.
warnings array of object
Real run only: rows written with something to check (no PAR or billing code...), each {row, detail}.
warnings[].detail string
warnings[].row integer
week_start string, required
The Sunday the schedule's week starts on.

SecretSet

set boolean, required
Whether a value is saved; read it with the secrets operation.

SecuritySettings

require_two_factor boolean, required
Whether every member must sign in with two-factor.
session_timeout_minutes integer, required
Minutes idle before sign-out.

SecuritySettingsUpdate

code string
Deprecated: send otp_code. Read when otp_code is absent, until April 30, 2027.
otp_code string
A current 6-digit code from your authenticator app; needed to turn the requirement off.
require_two_factor boolean
Require two-factor sign-in of every member (true), or stop (false). Requiring it needs your own two-factor on first.
session_timeout_minutes integer
Minutes idle before sign-out: 5, 15, 30 or 60.

Service authorizationPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ServiceAuthorization, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Service ratePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of ServiceRate, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ServiceArea

archived boolean, required
Archived: kept for the shifts that name it, offered for none.
county string
A Colorado county.
id string, required
The record's id.
latitude string, required
The latitude of the area's centre.
longitude string, required
The longitude of the area's centre.
name string, required
The area's name.
position integer, required
Its place in the agency's list, 1 first; an archived area keeps its last.

ServiceAreaCreate

county string
A Colorado county (Douglas), or null for none.
latitude number, required
The latitude of the area's centre.
longitude number, required
The longitude of the area's centre.
name string, required
The area's name, as the agency writes it (Denver — Downtown, Parker).
position integer
Optional; last when left out. Its place in the agency's list, 1 first; the other areas move to make room, and a place past the end puts it last.

ServiceAreaPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].archived boolean, required
Archived: kept for the shifts that name it, offered for none.
data[].county string
A Colorado county.
data[].id string, required
The record's id.
data[].latitude string, required
The latitude of the area's centre.
data[].longitude string, required
The longitude of the area's centre.
data[].name string, required
The area's name.
data[].position integer, required
Its place in the agency's list, 1 first; an archived area keeps its last.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

ServiceAreaUpdate

archived boolean
true archives the area: it keeps its id and stays on what names it, and is offered for nothing new; false restores it, last in the list unless a position is sent.
county string
A Colorado county (Douglas), or null for none.
latitude number
The latitude of the area's centre.
longitude number
The longitude of the area's centre.
name string
The area's name, as the agency writes it (Denver — Downtown, Parker).
position integer
Its place in the agency's list, 1 first; the other areas move to make room, and a place past the end puts it last.

ServiceAuthorization

A service authorization (a PAR): the units of a service HCPF authorized for a client, and what is left of them. Not an HTTP authorization. The four usage figures are live: they move as time is billed WITHOUT changing updated_at or lock_version, so a sync that skips records it already holds must re-read an authorization (GET) for current figures.

authorized_units string
Units authorized.
client_id string, required
The client the service is authorized for.
cm_authorization_reference string
The case manager's approval reference.
cm_authorized_on string
The day the case manager approved (YYYY-MM-DD).
committed_units string
Units scheduled or entered but not yet billed. Null unless the authorization is active.
deleted_at string
Set when the agency deleted the record. Only a list with include_deleted=true returns deleted records.
effective_date string
Effective date (YYYY-MM-DD).
end_date string
End date (YYYY-MM-DD).
id string, required
The record's id.
inserted_at string
When the record was created.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
modifiers array of string
Billing code modifiers, like U1.
par_number string
The prior authorization request (PAR) number.
payer string
Who pays for the service.
remaining_units string
Authorized minus used, never below zero. Null unless the authorization is active.
service_code string
The HCPCS code authorized, five letters and digits like T1019.
shown_status string
The status the agency's screens show, and the one the status filter matches: expired once the end date has passed, even before the nightly job stores it in status.
status string, required
unit_type string
What one authorized unit is.
unused_value string
Roughly what the authorized units not yet billed on claims are worth, in whole US dollars, at HCPF's published rate on the end date ("2496"). Null unless the authorization is active, or when no published rate prices its code and modifiers.
updated_at string
When the record last changed.
used_units string
Units used by this authorization's own billed time. Null unless the authorization is active.
utilization_percentage string
Used as a percentage of authorized, to one decimal place. Null unless the authorization is active.
weekly_hours string
Hours a week the authorization allows: its total spread evenly over its dates (inclusive days / 7), to two places. Null for a visits authorization, or when the units or dates are missing.
weekly_units string
Billing units a week the authorization allows (15-minute units for an hours authorization, visits for a visits one), to two places. Null when the units, unit type or dates are missing.

ServiceAuthorizationCreate

A new service authorization for one of the agency's clients. A client_id that is not the agency's answers 422 client_not_found. It is created pending: billing and utilization alerts ignore it until it is activated, in the app or with POST /api/v1/authorizations/{id}/transition.

authorized_units string, required
Units authorized.
client_id string, required
The client the service is authorized for.
cm_authorization_reference string
The case manager's approval reference.
cm_authorized_on string
The day the case manager approved (YYYY-MM-DD).
effective_date string, required
Effective date (YYYY-MM-DD).
end_date string, required
End date (YYYY-MM-DD).
modifiers array of string
Billing code modifiers, like U1.
notes string
Free text; written, never returned.
par_number string
The prior authorization request (PAR) number.
payer string, required
Who pays for the service.
service_code string, required
The HCPCS code authorized, five letters and digits like T1019.
unit_type string, required
What one authorized unit is.

ServiceAuthorizationRenewal

The new PAR's fields; its client is the renewed PAR's.

authorized_units string, required
Units authorized.
cm_authorization_reference string
The case manager's approval reference.
cm_authorized_on string
The day the case manager approved (YYYY-MM-DD).
effective_date string, required
Effective date (YYYY-MM-DD).
end_date string, required
End date (YYYY-MM-DD).
modifiers array of string
Billing code modifiers, like U1.
notes string
Free text; written, never returned.
par_number string
The prior authorization request (PAR) number.
payer string, required
Who pays for the service.
service_code string, required
The HCPCS code authorized, five letters and digits like T1019.
unit_type string, required
What one authorized unit is.

ServiceAuthorizationUpdate

Fields to change, plus the lock_version you read (required). Raising authorized_units needs the case manager's approval, sent with it: cm_authorization_reference and cm_authorized_on. Those two are recorded only with an increase: a changed value sent without one answers 422 validation_failed, and the stored value sent back unchanged is accepted.

authorized_units string
Units authorized. Raising it needs the case manager's approval, sent with it: cm_authorization_reference and cm_authorized_on.
cm_authorization_reference string
The case manager's approval reference; recorded only with a units increase, so a changed value (null included) is accepted only with one.
cm_authorized_on string
The day the case manager approved (YYYY-MM-DD); recorded only with a units increase, so a changed value (null included) is accepted only with one.
effective_date string
Effective date (YYYY-MM-DD).
end_date string
End date (YYYY-MM-DD).
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
modifiers array of string
Billing code modifiers, like U1.
notes string
Free text; written, never returned.
par_number string
The prior authorization request (PAR) number.
payer string
Who pays for the service.
service_code string
The HCPCS code authorized, five letters and digits like T1019.
unit_type string
What one authorized unit is.

ServiceRate

What a billing code and modifiers pay per 15-minute unit, from effective_date to end_date. A rate the agency deletes is removed outright, and no list or sync reports it: a client keeping rates re-reads the whole list, which is short. The status filter reads end_date against today's date in Colorado: active is no end_date or one today or later, which includes a rate whose effective_date is still ahead; expired is an end_date before today. A rate expiring does not move its updated_at: sync without status and judge end_date yourself.

description string
effective_date string
end_date string
The last day it applies; none while it is current.
id string, required
The record's id.
inserted_at string
When the record was created.
modifiers array of string
Billing code modifiers.
procedure_code string, required
The HCPCS code.
rate_per_unit string, required
Dollars per 15-minute unit.
updated_at string
When the record last changed.

ServiceRateCreate

A new rate for one of the agency's billing codes and its modifiers, from effective_date. A rate with the same code, modifiers and effective_date as one the agency already has is refused, as is a rate_per_unit not greater than 0.

description string
effective_date string, required
modifiers array of string, required
Billing code modifiers.
procedure_code string, required
The HCPCS code.
rate_per_unit string, required
Dollars per 15-minute unit.

ServiceRateUpdate

The rate fields to change. A service rate carries no lock_version: the change is applied to the rate as it is when the request arrives.

description string
effective_date string
rate_per_unit string
Dollars per 15-minute unit.

SettingSecret

key string, required
The credential's key.
value string, required
Its value; null when none is saved.

ShiftPlan

addable object
Per service, the state form's tasks the table does not hold: what Add task offers.
addable.hm array of string
addable.pc array of string
cards array of object
cards[].after string
The shift: PC1 ... PC4, HM1 ...
cards[].care_instructions string
The shift's Care Instructions.
cards[].caregiver_id string
Its Work Order's caregiver.
cards[].caregiver_week object
The shift's caregiver's week across the agency's clients: this client's shifts as the screen times them, the others from their Work Orders.
cards[].caregiver_week.by_client array of object
cards[].caregiver_week.by_client[].client string
cards[].caregiver_week.by_client[].minutes integer
A week.
cards[].caregiver_week.caregiver string
Last, First.
cards[].caregiver_week.caregiver_id string
The caregiver.
cards[].caregiver_week.minutes integer
Her minutes a week.
cards[].caregiver_week.visits array of object
cards[].caregiver_week.visits[].client string
Last, First.
cards[].caregiver_week.visits[].day integer
The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
cards[].caregiver_week.visits[].end integer
Minutes after midnight.
cards[].caregiver_week.visits[].here boolean
A shift of this client's plan.
cards[].caregiver_week.visits[].minutes integer
The visit's minutes.
cards[].caregiver_week.visits[].service string
cards[].caregiver_week.visits[].start integer
Minutes after midnight.
cards[].days array of object
Its columns in the agency's week order.
cards[].days[].by_day boolean
It starts at a time of its own that day (shift_settings by_day).
cards[].days[].day integer
The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
cards[].days[].end integer
Minutes after midnight it ends; past 1440 runs past midnight.
cards[].days[].label string
cards[].days[].minutes integer
The minutes it holds that day.
cards[].days[].overlap boolean
It overlaps another shift that day.
cards[].days[].start integer
Minutes after midnight the shift starts, null when off.
cards[].days[].working boolean
A day the service works.
cards[].effective_date string
Its Work Order's Effective Date.
cards[].empty boolean
No visits fall on this shift.
cards[].label string
cards[].lock_version integer
Its Work Order's lock_version, null before Generate.
cards[].rows array of object
cards[].rows[].cells array of object
cards[].rows[].cells[].count integer
The marks that day.
cards[].rows[].cells[].day integer
The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
cards[].rows[].cells[].edited boolean
Differs from the layout; Undo puts it back.
cards[].rows[].cells[].minutes integer
The minutes they hold.
cards[].rows[].in_plan boolean
One of the plan's tasks, so its cells can be changed.
cards[].rows[].min_task string
Min / Task on this shift, as the printed Work Order writes it: the row's week over its visits, at most 2 places (40 + 35 is 37.5). Null with no marks.
cards[].rows[].minutes integer
One visit's minutes.
cards[].rows[].name string
What a cell change names as row.
cards[].rows[].slug string
cards[].rows[].times integer
Times / Week: the row's marks on this shift. Null with no marks.
cards[].rows[].week integer
Week: the row's day minutes added on this shift. Null with no marks.
cards[].service string
cards[].shift_id string
The shift: PC1 ... PC4, HM1 ...
cards[].shift_number integer
k of the service's shifts.
cards[].work_order_id string
Its generated Work Order, null before Generate.
caregivers object
Shift id => the caregiver picked for it, which Generate reads. A shift left out has none yet: it is planned and printable, and Generate makes it no Work Order.
client_id string
The record's id.
edited boolean
Some cell differs from the layout.
hma object
The client's HMA calculator week, which the Shift Plan does not lay out: HMA stays on its Plan of Care. Null when the client has no current HMA plan with tasks.
hma.plan_id string
The HMA Plan of Care's id.
hma.weekly_minutes integer
Its tasks' minutes a week.
id string
The record's id.
other_work_orders array of object
The client's live Work Orders made outside the Shift Plan, in force this month or later, by Effective Date (at most 50): the screen names them so the month is not made twice.
other_work_orders[].caregiver object, required
The Work Order's caregiver; null when it has none.
other_work_orders[].caregiver.first_name string
other_work_orders[].caregiver.id string
The record's id.
other_work_orders[].caregiver.last_name string
other_work_orders[].closing_date string, required
Its Closing Date; null while it stays open.
other_work_orders[].effective_date string, required
Its Effective Date.
other_work_orders[].id string, required
The record's id.
other_work_orders[].number integer, required
The Work Order's WO #.
other_work_orders[].service string, required
The Work Order's service.
other_work_orders[].shift_id string
The Shift Plan's shift that made it; only on a Work Order the plan made.
overlaps array of object
overlaps[].a string
The shift: PC1 ... PC4, HM1 ...
overlaps[].b string
The shift: PC1 ... PC4, HM1 ...
overlaps[].day integer
The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
print_problems array of string
What the screen asks to check before a print or Download Excel.
services object
services.hm object
The service's week against its calculator.
services.hm.authorized integer
The calculator's minutes a week.
services.hm.cfc_hours string
The tasks' CFC hours a week.
services.hm.off_tasks array of object
When the week is off: each row whose placed minutes differ from its tasks' Min / week.
services.hm.off_tasks[].calculator integer
The tasks' Min / week.
services.hm.off_tasks[].name string
services.hm.off_tasks[].placed integer
The minutes the shifts place.
services.hm.pill string
As the screen shows it.
services.hm.placed integer
The minutes the shifts place in the week.
services.hm.status string
services.hm.total string
The calculator's TOTAL hours, null without a Plan of Care.
services.pc object
The service's week against its calculator.
services.pc.authorized integer
The calculator's minutes a week.
services.pc.cfc_hours string
The tasks' CFC hours a week.
services.pc.off_tasks array of object
When the week is off: each row whose placed minutes differ from its tasks' Min / week.
services.pc.off_tasks[].calculator integer
The tasks' Min / week.
services.pc.off_tasks[].name string
services.pc.off_tasks[].placed integer
The minutes the shifts place.
services.pc.pill string
As the screen shows it.
services.pc.placed integer
The minutes the shifts place in the week.
services.pc.status string
services.pc.total string
The calculator's TOTAL hours, null without a Plan of Care.
settings object
days, shifts_per_day, shift_settings, gap_minutes, split_long_tasks, marks_mode, as PATCH takes them, task_overrides, the task table's edits, and care_instructions, shift id => text.
task_table array of object
task_table[].edited boolean
A figure differs from the Plan of Care's.
task_table[].fractional boolean
Min / task is not whole.
task_table[].max integer
The state's weekly maximum, in minutes; null for a task it does not list.
task_table[].min_task string
Min / task.
task_table[].min_week string
Min / week.
task_table[].name string
What a task change names as task.
task_table[].norm string
The state's norm and weekly maximum, as the screen shows it under the task.
task_table[].over_max boolean
Min / week is above the state's weekly maximum: needs justification and supervisor approval. Never a refusal.
task_table[].service string
task_table[].split object
A split task: its visits and the minutes of each.
task_table[].split.minutes integer
Each.
task_table[].split.visits integer
Visits.
task_table[].times integer
Times / week.
task_table[].uneven boolean
Times / week was rounded.
task_totals object
task_totals.hm object
The service's task table summed, as its Total row reads.
task_totals.hm.hours string
Their CFC hours, to 2 places.
task_totals.hm.minutes string
The sum of the rows' Min / week.
task_totals.pc object
The service's task table summed, as its Total row reads.
task_totals.pc.hours string
Their CFC hours, to 2 places.
task_totals.pc.minutes string
The sum of the rows' Min / week.
warnings array of string
What the screen warns of; never a refusal.

ShiftPlanCareInstructions

text string, required
The shift's Care Instructions, as the card's box takes them; blank or null removes them. At most the characters a Work Order's notes hold, else 422 too_long.

ShiftPlanCaregiverSet

caregiver_id string, required
The caregiver picked for the shift, any of the agency's on file, or null to let go of the pick.

ShiftPlanCellSet

count integer, required
The marks that day; the screen offers 0 to 8. The count the automatic layout gives that cell lets go of the change.
day integer, required
The Shift Plan's day: 0 Saturday, 1 Sunday, 2 Monday ... 6 Friday.
row string, required
The row's name, as the card's rows name it (Bathing, Toileting).
shift_id string, required
The shift: PC1 ... PC4, HM1 ...

ShiftPlanGenerate

caregivers object
Optional: shift id => the caregiver for its Work Order, or null for none, each saved as the shift's pick as PUT /clients/{id}/shift-plan/caregivers/{shift_id} saves it. A shift left out takes its saved pick (the plan's caregivers); a shift with no caregiver gets no Work Order and keeps the one it has.

ShiftPlanSettingsUpdate

days object
Optional: pc and/or hm => the service's working days; a service left out keeps its days.
days.hm array of integer
The service's working days.
days.pc array of integer
The service's working days.
gap_minutes integer
Optional: minutes between a shift and the one it starts after.
marks_mode string
Optional: the day cells as marks (x) or minutes.
shift_settings object
Optional: shift id => the keys that change: time (HH:MM, its start), after (the shift it starts after, null for none), by_day (day => HH:MM, a start of its own that day). A key left out is kept.
shifts_per_day object
Optional: pc and/or hm => shifts a day; a service left out keeps its count.
shifts_per_day.hm integer
Shifts a day, 0 to 4.
shifts_per_day.pc integer
Shifts a day, 0 to 4.
split_long_tasks boolean
Optional: whether a long, rare task is split.

ShiftPlanTaskAdd

service string, required
The task's service.
task string, required
A task on the state form for that service, by its name (Dusting, Meal Prep/Menu Planning); the screen's Add task lists the ones the table does not hold.

ShiftPlanTaskUpdate

field string, required
The figure: times (Times / week), min_task (Min / task) or min_week (Min / week).
service string, required
The task's service.
task string, required
The task, as the task table names it (Bathing).
value number, required
Above 0; a whole number for times. Past a week answers 422 too_large.

ShiftPlanWorkOrderLine

caregiver object, required
The Work Order's caregiver; null when it has none.
caregiver.first_name string
caregiver.id string
The record's id.
caregiver.last_name string
closing_date string, required
Its Closing Date; null while it stays open.
effective_date string, required
Its Effective Date.
id string, required
The record's id.
number integer, required
The Work Order's WO #.
service string, required
The Work Order's service.
shift_id string
The Shift Plan's shift that made it; only on a Work Order the plan made.

SignWarning

id string, required
The warning's stable id.
question_key string
The record's question that fixes it, when one does.
text string, required
What the signer is warned of.

SignedRecordEvent

One event of a signed record's history, oldest first: a signature, a signature voided, the true copy stored, an addendum, the record voided, or the record it replaces or that replaced it.

actor_name string
Who: the signer's name, the addendum's author, or the member who voided; null for a true copy or a replacement.
at string, required
When it happened.
body string
An addendum's text, in full.
kind string, required
What happened.
link string
The path that opens what the event names: a true copy's PDF, an addendum's true copy, or the other record's page.
method string
How a signature was made, for signed: drawn, typed, pin and so on.
reason string
The reason given, for an addendum, a voided signature or a voided record.
record_id string
For replaces and replaced_by: the other record.
role string
The signature's role, for signed and signature_voided: client, supervisor and so on.
signed_at string
When an addendum was signed.

SignedRecordEventPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of SignedRecordEvent, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

SignedRecordState

Where a signed record stands: signed, amended (it has an addendum) or voided.

id string, required
The record.
record_state string, required
The record's state.
record_type string, required
supervisor_visit, plan_of_care, monthly_client_report, complaint, critical_incident, client_consent_form, client_emergency_info, care_log or half_month_summary.
signed_at string
When its first signature was made.
void_reason string
Why it was voided; null unless voided.
voided_at string
When it was voided; null unless voided.
voided_by_user_id string
Who voided it; null unless voided.

SignedRecordVoid

reason string, required
Why the record is voided, 3 to 1000 characters. It is kept with the voided record.

Supervisory visitPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of SupervisoryVisit, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

SupervisoryVisit

A supervisor's visit to a client's home to check on the caregiver's work. Recorded and edited here as a draft only; completing, signing and reopening happen on the visit page, where signatures are captured in person.

caregiver_id string
The caregiver observed.
caregiver_name string
The caregiver's name.
client_id string, required
The client visited.
client_name string
The client's name.
id string, required
The record's id.
inserted_at string
When the visit was recorded.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
missing_signers array of object
Each required line no live signature fills yet, in order; empty when complete or voided.
missing_signers[].label string, required
The line as the page names it, e.g. "client or authorized representative".
missing_signers[].roles array of string, required
The roles that would fill the line: any one of them.
questions array of QuestionAnswer
The checklist.
record_state string
The signed record's state: draft until the first signature, then signed (locked), amended (an addendum was signed) or voided (replaced by a new draft). signing_complete says whether every required line is signed: the supervisor, the client, and the caregiver or PCP; a telehealth visit needs the supervisor alone.
signatures array of object
The live signatures, oldest first, without their images.
signatures[].method string, required
How it was signed: typed, drawn, initials, pin and so on.
signatures[].role string, required
The line signed.
signatures[].signed_at string, required
When the line was signed.
signatures[].signer_name string
The name the line is signed under.
signed_at string
When the first signature locked it; null on a draft.
signed_on_paper boolean
Whether the signed paper sheet is on file. A yes is recorded as a paper-on-file signature in each role the visit still needs, so it can sign the visit; read-only.
signing_complete boolean
True once the record is signed or amended and every required line holds a signature. A signed record can be false: signed by one line, with another still open. A voided record is always false, whatever it holds, and its missing_signers is empty: nothing can sign it, and its replacement is the record to complete.
status string, required
draft, completed or signed.
supervisor_name string
Who conducted the visit; null or blank clears it.
updated_at string
When the visit last changed.
visit_date string
The day of the visit; null or blank clears it.
visit_type string
In person (the default), or telehealth.

SupervisoryVisitCreate

Records a draft visit, conducted by the API key's user. client_id and caregiver_id are required. A telehealth visit needs agency_settings.manage and the agency's telehealth acknowledgment.

answers object
Checklist answers by question key, as the visit's own read lists its questions: a text or code (yes, no, na for a yes/no), a list of choices, or {value, comment}.
caregiver_id string, required
The caregiver observed (their id).
client_id string, required
The client visited (their id).
supervisor_name string
Who conducted the visit; null or blank clears it.
visit_date string
The day of the visit; null or blank clears it.
visit_type string
In person (the default), or telehealth.

SupervisoryVisitDate

date string
The visit's date, YYYY-MM-DD, or null to clear it; empty clears it too.

SupervisoryVisitDue

A client and when their last supervisory visit was, most urgent first.

client_id string, required
The client.
client_name string
The client's name.
due_status string, required
How urgent the next visit is.
last_visit_date string
The last visit; none if never visited.
planned_day integer
The client's planned day of the month for the visit, null when none is planned; with planned_for, capped to that month's last day.

SupervisoryVisitDuePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of SupervisoryVisitDue, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

SupervisoryVisitInput

Fields to change on a draft visit, plus the lock_version read (required). answers maps a question key to a text or code (yes, no, na for a yes/no), a list of choices, or {value, comment}; a half not sent is kept, a half sent blank is cleared.

answers object
Checklist answers by question key, as the visit's own read lists its questions: a text or code (yes, no, na for a yes/no), a list of choices, or {value, comment}.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
supervisor_name string
Who conducted the visit; null or blank clears it.
visit_date string
The day of the visit; null or blank clears it.
visit_type string
In person (the default), or telehealth.

SupervisoryVisitReopen

reason string
Why the visit is being corrected, 3 to 1000 characters; required once any line is signed, when the visit is voided and copied into a new draft.

SupervisoryVisitSignature

method string, required
How it was signed: typed, drawn, initials, pin and so on.
role string, required
The line signed.
signed_at string, required
When the line was signed.
signer_name string
The name the line is signed under.

SupportTicket

A request to the HomeCareBilling support team that the API key's user raised, and where it has got to. Support replies by email, quoting the reference.

category string, required
id string, required
The record's id.
inserted_at string
When the ticket was filed.
priority string, required
reference string, required
The ticket's reference, e.g. #HCB-a1b2c3d4, as support's emails quote it.
resolution_notes string
What support did, once resolved.
resolved_at string
When the ticket was resolved.
sla_status string
Whether support is answering within its target.
status string, required
Where the ticket has got to.
subject string, required
The request's short summary.
updated_at string
When the ticket last changed.

SupportTicketInput

The request. subject, description, category and priority are required. For a bug report, fill screen, record_ids, steps_to_reproduce, expected and actual from what the user told you; a bug report missing what the server cannot work out from the user's recent activity is answered 422 needs_more_info, with the questions to ask and a follow_up_id to send back with the answers. A screenshot or any other field is not accepted and is ignored.

actual string
Bug reports: what happened instead, the error message shown or "nothing". "don't know" when they do not know.
category string, required
bug_report for something broken, feature_request for an idea, question for how to do something, general for anything else.
description string, required
What happened, where in the app, and what was expected. Leave out client names and Medicaid IDs; support will ask if they need them.
expected string
Bug reports: what the user expected to happen.
follow_up_id string
Only when answering a needs_more_info reply: the follow_up_id it gave. That call files the request whatever is still missing, and repeating it files no second one.
priority string, required
urgent only when it stops claims from being sent or paid, high when it gets in the way of daily work, normal for questions, low for ideas.
record_ids array of string
Bug reports: the ids of the records it happens on (from the page address), or ["any"] when it happens on any record, or ["don't know"]; a single string is read as a one-item list. Ids only, never names.
screen string
Bug reports: the screen or feature the problem is on, e.g. Today, Needs attention, a client's page. "don't know" when the user does not know.
steps_to_reproduce string
Bug reports: what the user clicked or tried, step by step. "don't know" when they do not know.
subject string, required
A short summary of the request.

SupportTicketPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of SupportTicket, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Task set templatePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of TaskSetTemplate, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

TaskSetTemplate

A reusable set of tasks with default minutes and visits a week. Editing one never changes a Work Order made from it.

id string, required
The record's id.
inserted_at string
When the template was created.
is_default boolean
Whether it is the agency's default template.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
name string, required
The template's name, unique in the agency.
service_type string, required
The service it is for.
tasks array of object, required
The tasks, each name once.
tasks[].minutes_per_task integer, required
Minutes each time.
tasks[].task_category string, required
The service the task belongs to.
tasks[].task_name string, required
The task, as the Work Order names it.
tasks[].times_per_week integer, required
Visits a week.
updated_at string
When it last changed.

TaskSetTemplateInput

A task set template's fields. A tasks list sent replaces the template's tasks. A PATCH carries lock_version.

is_default boolean
Whether it is the agency's default template.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
name string
The template's name, unique in the agency.
service_type string
The service it is for.
tasks array of object
The tasks, each name once.
tasks[].minutes_per_task integer, required
Minutes each time.
tasks[].task_category string, required
The service the task belongs to.
tasks[].task_name string, required
The task, as the Work Order names it.
tasks[].times_per_week integer, required
Visits a week.

TelephonyCleared

settings object, required
settings.telephony_match_window_minutes string
Minutes a call may be from its visit, 1 to 480.
settings.telephony_send_sms_confirmation string
SMS confirmation; unavailable for now.
settings.twilio_account_sid object, required
settings.twilio_account_sid.masked string, required
Its last four characters, as ****1234; empty when none.
settings.twilio_account_sid.set boolean, required
Whether an Account SID is saved.
settings.twilio_auth_token object, required
settings.twilio_auth_token.set boolean, required
Whether a value is saved; read it with the secrets operation.
settings.twilio_phone_number string
The agency's own Twilio number, 10 digits.
settings.twilio_record_calls string
Whether calls are recorded.
warnings array of string, required
Set when the old number's webhook could not be reset.

TelephonyPinsAssigned

assigned integer, required
Caregivers given a PIN.
incomplete boolean
Whether it stopped part way.
reason string
Why it stopped: no free PIN left (exhausted), a refused audit row rolled back the next assignment (audit_log_failed; the ones before it were kept), or a caregiver changed during the run (stale).

TelephonySave

cleared boolean
True when every credential was blank, so it was cleared.
settings object, required
settings.telephony_match_window_minutes string
Minutes a call may be from its visit, 1 to 480.
settings.telephony_send_sms_confirmation string
SMS confirmation; unavailable for now.
settings.twilio_account_sid object, required
settings.twilio_account_sid.masked string, required
Its last four characters, as ****1234; empty when none.
settings.twilio_account_sid.set boolean, required
Whether an Account SID is saved.
settings.twilio_auth_token object, required
settings.twilio_auth_token.set boolean, required
Whether a value is saved; read it with the secrets operation.
settings.twilio_phone_number string
The agency's own Twilio number, 10 digits.
settings.twilio_record_calls string
Whether calls are recorded.
warnings array of string, required
What went through but needs attention.

TelephonySettings

telephony_match_window_minutes string
Minutes a call may be from its visit, 1 to 480.
telephony_send_sms_confirmation string
SMS confirmation; unavailable for now.
twilio_account_sid object, required
twilio_account_sid.masked string, required
Its last four characters, as ****1234; empty when none.
twilio_account_sid.set boolean, required
Whether an Account SID is saved.
twilio_auth_token object, required
twilio_auth_token.set boolean, required
Whether a value is saved; read it with the secrets operation.
twilio_phone_number string
The agency's own Twilio number, 10 digits.
twilio_record_calls string
Whether calls are recorded.

TelephonySettingsUpdate

telephony_match_window_minutes string
Minutes, 1 to 480.
twilio_account_sid string
The Account SID; null or blank keeps the saved one.
twilio_auth_token string
The Auth Token; null or blank keeps the saved one.
twilio_phone_number string
The agency's Twilio number.
twilio_record_calls string
Whether calls are recorded.

TelephonyTest

twilio_account_sid string
The Account SID; null or blank keeps the saved one.
twilio_auth_token string
The Auth Token; null or blank keeps the saved one.
twilio_phone_number string
The agency's Twilio number.

TelephonyTested

owns_number boolean, required
Always true.

Timesheet

The hours worked for one client and caregiver in one billing period.

assignment_id string
The assignment it bills under.
billing_period_end string
billing_period_start string
caregiver_id string, required
The caregiver who worked.
client_id string, required
The client served.
deleted_at string
Set when the agency deleted the record. Only a list with include_deleted=true returns deleted records.
entries array of object
The dated hours, one per visit, as they are now. An entry can change without moving this record's updated_at; re-read the record by id to have them current.
entries[].date string
entries[].hours_worked string
Hours worked that day.
entries[].time_in string
HH:MM:SS, local time.
entries[].time_out string
HH:MM:SS, local time.
first_half_hours string
Hours, days 1 to 15.
half_signature_sources object
Where each half's signatures come from (US-101.25, US-119.10, US-119.14): a signed half-month summary whose attested hours agree with what the Timesheets bill (summary, its id), one whose hours differ by a quarter hour or more on the days listed (hours_differ, its id and the days; not counted as signed), the same summary signed by this Timesheet's own Work Order's paper card (paper, its id), one signed by the paper card of another Work Order of the client and caregiver (paper_elsewhere, its id and that Work Order's number; not counted as signed), another card's rows written when this Timesheet was returned for correction, counted as signed until its submit refreshes them from the corrected entries (paper_refresh, its id; US-119.16), or neither (missing). Not who signed or when.
half_signature_sources.first string
Days 1 to 15.
half_signature_sources.first_hours_differ_days array of string
For hours_differ: the dates of days 1 to 15 whose billed hours differ from the summary's by a quarter hour or more; null otherwise.
half_signature_sources.first_paper_work_order_number string
For paper_elsewhere: the number of the Work Order whose paper card signs days 1 to 15; null otherwise.
half_signature_sources.first_summary_id string
The half-month summary that signs days 1 to 15.
half_signature_sources.second string
Day 16 on.
half_signature_sources.second_hours_differ_days array of string
For hours_differ: the dates of day 16 on whose billed hours differ from the summary's by a quarter hour or more; null otherwise.
half_signature_sources.second_paper_work_order_number string
For paper_elsewhere: the number of the Work Order whose paper card signs day 16 on; null otherwise.
half_signature_sources.second_summary_id string
The half-month summary that signs day 16 on.
id string, required
The record's id.
inserted_at string
When the record was created.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
second_half_hours string
Hours, day 16 on.
status string, required
total_hours string
Hours in the billing period.
updated_at string
When the record last changed, its hours included.
wo_number string
The WO # of the work order it was made from, as the pages show it, or the number imported as text when it names no Work Order; null when it names none.
work_order_id string
The work order it was made from; null when it names none in this agency.
work_order_number string
The stored link to the work order it was made from: the Work Order's id, or a number imported as text. Read wo_number and work_order_id instead.

TimesheetCreate

month integer, required
The month, 1 to 12.
year integer, required
The year.

TimesheetEntry

date string
day_of_week string
deviation_explanation string
evv_clock_in string
The EVV clock-in pulled from the matched visit.
evv_clock_out string
The EVV clock-out pulled from the matched visit.
evv_source string
hours_worked string
Hours that day.
id string
The record's id.
time_in string
HH:MM:SS.
time_out string
HH:MM:SS.
timesheet_id string
The record's id.
travel_time boolean
visit_id string
The EVV visit the times were pulled from.

TimesheetEntryCreate

date string, required
The date, YYYY-MM-DD.
deviation_explanation string
Why the times deviate from the plan; null or blank clears it.
time_in string
HH:MM:SS; null or blank clears it.
time_out string
HH:MM:SS; null or blank clears it.
travel_time boolean
Whether the entry is travel time.

TimesheetEntryUpdate

date string
The date, YYYY-MM-DD.
deviation_explanation string
Why the times deviate from the plan; null or blank clears it.
time_in string
HH:MM:SS; null or blank clears it.
time_out string
HH:MM:SS; null or blank clears it.
travel_time boolean
Whether the entry is travel time.

TimesheetPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Timesheet, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

TimesheetReject

reason string, required
Why it is rejected.

TimesheetSign

client_name string
The client's name, for a client slot.
resign boolean
Re-sign a signed slot (needs signed_records.void).
signature_type string, required
The slot to sign.

TimesheetSubmit

acknowledge_missing_signatures boolean
Submit with signatures missing.

TimesheetTask

completed boolean
frequency integer
Times done.
id string
The record's id.
notes string
task_category string
task_name string
time_minutes integer
Minutes spent.
timesheet_entry_id string
The record's id.

TimesheetTaskCreate

completed boolean
Whether the task was done.
frequency integer
Times done.
notes string
Notes on the task; null or blank clears them.
task_name string, required
HCPF's task name.
time_minutes integer
Minutes spent.
timesheet_entry_id string, required
The entry the task was done on.

TimesheetTaskUpdate

completed boolean
Whether the task was done.
frequency integer
Times done.
notes string
Notes on the task; null or blank clears them.
time_minutes integer
Minutes spent.

TpidAuthorization

tpid_authorized boolean, required
Whether the agency confirmed its Trading Partner authorization.

TpidAuthorizationUpdate

authorized boolean, required
Whether the agency authorized HomeCareBilling as its Trading Partner: confirmed (true) or not (false).

TrainingBulkCompletion

completed_date string, required
The completion date, YYYY-MM-DD; its year is the training year.
replace boolean
Also move dates already recorded.

TwoFactorReset

two_factor_enabled boolean, required
Always false once reset.
user_id string, required
The record's id.

Underpayment

A paid claim HCPF paid less than its published rate says, after the adjustments that lawfully explain short pay (deductible, coinsurance, copay, prior payer, patient liability). It blocks nothing. Dismiss it with POST /api/v1/revenue-warnings/dismissals, sending kind underpayment, its claim_id as subject_id, and its fingerprint; a dismissed row whose paid amount changes is listed again.

carcs array of object, required
carcs[].amount string, required
The amount the remittance adjusted for this reason.
carcs[].description string, required
What the code means, in plain English.
carcs[].group_code string, required
The CARC group: CO, PR, OA or PI.
carcs[].reason_code string, required
The CARC reason code.
claim_id string, required
The underpaid claim.
client_id string, required
The record's id.
dismissed boolean, required
Whether a member dismissed it at these amounts.
expected string, required
The lesser of the charge and the published rate times the units.
fingerprint string, required
The expected and paid amounts, joined with a colon.
gap string, required
How much less HCPF paid than expected, after explained adjustments.
id string, required
The claim's id, as claim_id.
kind string, required
Always underpayment: the kind to dismiss it as.
modifiers array of string, required
paid string, required
What HCPF paid.
paid_date string, required
When the remittance paid it.
procedure_code string, required
The HCPCS code billed.
published_rate string, required
HCPF's published rate per unit on the dates of service.
service_date_from string, required
The first date of service.
service_date_to string, required
The last date of service.
tenant_rate string, required
The agency's own rate per unit the claim was billed at; null for a claim from a spreadsheet upload. Shown only: the expected amount never uses it.
units string, required
Units billed.

UnderpaymentAdjustment

amount string, required
The amount the remittance adjusted for this reason.
description string, required
What the code means, in plain English.
group_code string, required
The CARC group: CO, PR, OA or PI.
reason_code string, required
The CARC reason code.

UnderpaymentPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Underpayment, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
paid_from string, required
The first paid date read.
paid_to string, required
The last paid date read.
total integer, required
Every matching row.
total_gap string, required
The sum of every listed row's gap, not just this page's.
truncated boolean, required
True when the period held more paid claims than one read judges (5000): only the newest-paid were judged. Narrow the dates to see the rest.

UniversityVideo

A narrated HCB University video of a job in the app, recorded on the demo agency, so it holds no agency's data.

duration_ms integer, required
The English render's length in milliseconds.
locales array of string, required
The languages the video has a render in, e.g. ["en"].
section string, required
The catalog section, e.g. billing or clients.
slug string, required
The video's id, as GET /university/videos/{slug} takes it.
summary string, required
One or two sentences on what the video shows.
title string, required
The video's title.
url string, required
The video's player page in HomeCareBilling; it asks the viewer to sign in.

UniversityVideoDetail

An HCB University video with its chapters, and the video, captions and poster of each rendered language as signed URLs to play or show directly.

chapters array of object, required
The English render's chapters, in order.
chapters[].start_ms integer, required
Where it starts, in milliseconds.
chapters[].title string, required
The chapter's title.
duration_ms integer, required
The English render's length in milliseconds.
locales array of string, required
The languages the video has a render in, e.g. ["en"].
pages array of string, required
The app pages the video shows, e.g. ["/batches"].
renders array of object, required
One per rendered language, in language order.
renders[].captions_url string, required
The WebVTT captions. A signed storage URL that works for 6 hours; null when it could not be signed.
renders[].locale string, required
The language, e.g. en.
renders[].poster_url string, required
The poster image (JPEG). A signed storage URL that works for 6 hours; null when it could not be signed.
renders[].render_id string, required
The render's id.
renders[].video_url string, required
The MP4. A signed storage URL that works for 6 hours; null when it could not be signed.
section string, required
The catalog section, e.g. billing or clients.
slug string, required
The video's id, as GET /university/videos/{slug} takes it.
summary string, required
One or two sentences on what the video shows.
title string, required
The video's title.
url string, required
The video's player page in HomeCareBilling; it asks the viewer to sign in.

UniversityVideoPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of UniversityVideo, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

UnmatchedCall

call_assignment string
A clock-in or clock-out.
call_datetime string, required
When the call came in (UTC).
caregiver_id string
The record's id.
chosen_visit_id string
The record's id.
dismiss_reason string
Why the office dismissed it.
id string, required
The record's id.
inserted_at string
When the server kept it (UTC).
matched_visit_id string
The record's id.
originating_phone_last4 string
The calling number's last four digits; the rest is masked.
reason string
Why it was kept: no_matching_visit or outside_window (no visit to clock), or, when the visit the caregiver chose refused it once locked (chosen_visit_id), visit_closed, visit_reassigned, visit_already_clocked, no_clock_in or not_recorded.
reviewed_at string
When the office matched or dismissed it (UTC).
status string, required
pending, matched or dismissed.

UnmatchedCallDismiss

reason string, required
Why it is dismissed: 10 to 500 characters, as on the screen.

UnmatchedCallMatch

visit_id string, required
The visit the call clocked.

UnmatchedCallPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of UnmatchedCall, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

VaccinationBulkEntry

caregiver_id string, required
The caregiver.
notes string
Notes.
status string, required
vaccination_date string
When vaccinated.

VaccinationBulkResult

updated integer, required
Vaccination records written.

VaccinationBulkUpdate

updates array of object, required
One per caregiver: {caregiver_id, status, vaccination_date, notes}.
updates[].caregiver_id string, required
The caregiver.
updates[].notes string
Notes.
updates[].status string, required
updates[].vaccination_date string
When vaccinated.
year integer, required
The flu season's year.

Visit

actual_end_time string
When the caregiver clocked out (UTC).
actual_start_time string
When the caregiver clocked in (UTC).
adjusted_end_time string
The agency's corrected end, when it changed the clocked one (UTC); written with its UTC offset, refused without one (422 time_offset_required).
adjusted_start_time string
The agency's corrected start, when it changed the clocked one (UTC); written with its UTC offset, refused without one (422 time_offset_required).
alternate_location boolean
Whether the service was given away from the client's home address.
assignment_id string
The assignment the visit came from, if any.
billable_hours string
Hours the visit bills.
caregiver_id string, required
The caregiver who served.
client_id string, required
The client served.
client_signature_captured boolean
Whether the client signed for the visit.
deleted_at string
Set when the agency deleted the record. Only a list with include_deleted=true returns deleted records.
group_identifier string
For a group visit, the caregiver's name for the group session.
id string, required
The record's id.
import_external_id string
For an imported visit, that system's id for it (Sandata's Visit ID); else null.
import_system string
For an imported visit, the system it was imported from; else null.
inserted_at string
When the visit was created.
location_verified boolean
Whether the clock-in was inside the client's geofence.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
memo string
The agency's note on the visit.
modifiers array of string
The procedure modifiers.
payable_hours string
Hours the visit pays the caregiver.
procedure_code string
The HCPCS code.
sandata_sent_at string
When Sandata first took the visit.
sandata_submission_status string
Where the visit is in the Sandata queue.
sandata_visit_id string
Sandata's id for the visit, once Sandata has it.
scheduled_end_time string
Scheduled end (UTC).
scheduled_start_time string
Scheduled start (UTC).
service_date string, required
The day of service.
source string
How the visit was created; import is an EVV vendor's record of a shift, read-only, beside the agency's own visit for it.
status string, required
Where the visit is in its lifecycle.
updated_at string
When the visit last changed.
visit_type string

Visit exceptionPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of VisitException, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

VisitBulkTransition

cancellation_note string
A note on the cancellation (a cancel only, up to 1000 characters); needs a cancellation_reason.
cancellation_reason string
Why the visit is cancelled (a cancel only), from the web's pick list: caregiver_call_off (Caregiver called off), client_cancelled (Client cancelled (don't come)), client_hospitalized (Client in hospital or facility), client_unavailable (Client not home or unavailable), schedule_change (Schedule changed), weather_emergency (Weather or emergency), entered_in_error (Entered in error or duplicate), other (Other). Optional; a cancel without one records no reason.
ids array of string, required
The visits to move, at most 100.

VisitBulkTransitionResult

failed array of object, required
Not moved: not_found (not this agency's visit), invalid_transition (its status cannot move there), exception_not_dismissed (a cancel whose open exception could not be dismissed), imported_visit (a visit imported from another EVV system, US-101.9, which is read-only here) or error (the write failed; retrying is safe).
failed[].id string, required
The record's id.
failed[].reason string, required
Why.
succeeded_ids array of string, required
Moved now.

VisitCall

A clock event: the caregiver's app, a phone call (IVR) or a manual entry. Calls are never edited; a correction is a change.

call_assignment string
What the call recorded.
call_datetime string
When the call was made (UTC).
call_type string
How the call was made.
device_id string
The device that made the call.
gps_accuracy_meters number
id string
The record's id.
latitude string
Where the device was.
location_description string
GPS warnings recorded with the call, such as outside the geofence.
longitude string
Where the device was.
superseded_at string
Set when the visit was reassigned away from the caregiver who made the call: the call stays as history and no longer counts as the visit's clock.

VisitChange

A correction the agency made to the visit, with Colorado's reason code.

change_datetime string
When it changed (UTC).
change_source string
Where the change was made.
changed_by_id string
The user who made it.
field_changed string
The field that changed.
id string
The record's id.
new_value object
old_value object
reason_code string
Why it changed: Colorado's reason code, such as CLKIN, CLKOUT, SCHED or OTHER.
reason_memo string
resolution_code string

VisitCreate

A new scheduled visit. Its service date is the scheduled start's day in Mountain time. The client, caregiver and assignment must be this agency's, the assignment for that client and caregiver. A visit overlapping the caregiver's others, on an assignment no longer open, or with a window over 24 hours is created with a warning; a window over 31 days is refused.

alternate_location boolean
Whether the service was given away from the client's home address.
assignment_id string
The assignment the visit comes from, if any.
caregiver_id string, required
The caregiver serving.
client_id string, required
The client served.
group_identifier string
For a group visit, the caregiver's name for the group session.
memo string
The agency's note on the visit.
modifiers array of string
The procedure modifiers.
procedure_code string
The HCPCS code.
scheduled_end_time string, required
Scheduled end, with its UTC offset; refused without one, as the start.
scheduled_start_time string, required
Scheduled start, with its UTC offset (Z or -06:00); one without is refused (422 time_offset_required), as is a value that is not a time (422 invalid_time).
visit_type string

VisitDetail

actual_end_time string
When the caregiver clocked out (UTC).
actual_start_time string
When the caregiver clocked in (UTC).
adjusted_end_time string
The agency's corrected end, when it changed the clocked one (UTC); written with its UTC offset, refused without one (422 time_offset_required).
adjusted_start_time string
The agency's corrected start, when it changed the clocked one (UTC); written with its UTC offset, refused without one (422 time_offset_required).
alternate_location boolean
Whether the service was given away from the client's home address.
assignment_id string
The assignment the visit came from, if any.
billable_hours string
Hours the visit bills.
calls array of object, required
The newest 200 at most, oldest first.
calls[].call_assignment string
What the call recorded.
calls[].call_datetime string
When the call was made (UTC).
calls[].call_type string
How the call was made.
calls[].device_id string
The device that made the call.
calls[].gps_accuracy_meters number
calls[].id string
The record's id.
calls[].latitude string
Where the device was.
calls[].location_description string
GPS warnings recorded with the call, such as outside the geofence.
calls[].longitude string
Where the device was.
calls[].superseded_at string
Set when the visit was reassigned away from the caregiver who made the call: the call stays as history and no longer counts as the visit's clock.
caregiver_id string, required
The caregiver who served.
changes array of object, required
The newest 200 at most, oldest first.
changes[].change_datetime string
When it changed (UTC).
changes[].change_source string
Where the change was made.
changes[].changed_by_id string
The user who made it.
changes[].field_changed string
The field that changed.
changes[].id string
The record's id.
changes[].new_value object
changes[].old_value object
changes[].reason_code string
Why it changed: Colorado's reason code, such as CLKIN, CLKOUT, SCHED or OTHER.
changes[].reason_memo string
changes[].resolution_code string
client_id string, required
The client served.
client_signature_captured boolean
Whether the client signed for the visit.
deleted_at string
Set when the agency deleted the record. Only a list with include_deleted=true returns deleted records.
group_identifier string
For a group visit, the caregiver's name for the group session.
id string, required
The record's id.
import_external_id string
For an imported visit, that system's id for it (Sandata's Visit ID); else null.
import_system string
For an imported visit, the system it was imported from; else null.
inserted_at string
When the visit was created.
location_verified boolean
Whether the clock-in was inside the client's geofence.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
memo string
The agency's note on the visit.
modifiers array of string
The procedure modifiers.
payable_hours string
Hours the visit pays the caregiver.
procedure_code string
The HCPCS code.
sandata_sent_at string
When Sandata first took the visit.
sandata_submission_status string
Where the visit is in the Sandata queue.
sandata_visit_id string
Sandata's id for the visit, once Sandata has it.
scheduled_end_time string
Scheduled end (UTC).
scheduled_start_time string
Scheduled start (UTC).
service_date string, required
The day of service.
signatures array of object, required
The newest 200 at most, oldest first.
signatures[].captured_at string
When it was signed (UTC).
signatures[].id string
The record's id.
signatures[].signature_type string
signatures[].signer_name string
signatures[].signer_type string
source string
How the visit was created; import is an EVV vendor's record of a shift, read-only, beside the agency's own visit for it.
status string, required
Where the visit is in its lifecycle.
updated_at string
When the visit last changed.
visit_type string

VisitException

assigned_to_id string
The member it is assigned to; set by the assignment operation.
auto_detected boolean
Whether a rule detected it, rather than a person.
detected_at string, required
When it was detected (UTC).
detection_details object
What the rule measured, such as the distance from the geofence.
exception_type string, required
The rule the visit broke.
id string, required
The record's id.
inserted_at string
When the exception was recorded.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
resolution_code string
Why it was resolved as it was.
resolution_notes string
The office's note on the resolution.
resolved_at string
When it was resolved (UTC).
resolved_by_id string
The member who resolved it.
sandata_ack_status string
Where the acknowledgement to Sandata is; null until the reconciler first looks at it, held means it can never be sent.
sandata_exception_id string
The Addendum exception code Sandata reported for the visit (for example "15"), when it did; only an ACK code (15, 21) is acknowledged.
sandata_reason_code integer
The Colorado Appendix 3 reason code that describes the exception type, as reference data; null when the type has none. Sandata receives no reason code from an exception: an acknowledgement carries the Addendum exception code, and a visit change carries the reason its own edit records (GET /api/v1/visit-exceptions/reason-codes lists them).
severity string, required
status string, required
open until resolved.
updated_at string
When the exception last changed.
visit_id string, required
The visit the exception is on.

VisitExceptionAssignment

assigned_to_id string, required
A user of this agency, or null to unassign. A user of another agency answers 422 assignee_not_found.

VisitExceptionBulkResolve

action string, required
What to do with them; dismiss needs resolution_notes.
ids array of string, required
The exceptions to resolve, at most 100.
resolution_code string, required
Why they are resolved.
resolution_notes string
Required to dismiss. At most 2000 characters.

VisitExceptionBulkResult

failed_ids array of string, required
Not resolved because the write failed; retrying them is safe.
resolved_ids array of string, required
Resolved now.
skipped_ids array of string, required
Not open, or not this agency's: nothing was done to them.

VisitExceptionReasonCodes

resolution_codes array of string, required
What resolution_code takes.
sandata_reason_codes array of object, required
The Colorado Appendix 3 reason codes that describe each exception type (an exception's sandata_reason_code), as reference data.
sandata_reason_codes[].code integer, required
sandata_reason_codes[].description string, required
sandata_reason_codes[].location_required boolean, required
The note must give the client's location.
sandata_reason_codes[].note_required boolean, required
Sandata needs a note with this code; it is built from the client's address, not from resolution_notes.

VisitExceptionResolve

action string, required
What to do with it: acknowledge marks it reviewed; correct also sets the visit's adjusted times; dismiss flags it as not applicable and needs resolution_notes.
adjusted_end_time string
Required for correct: the visit's corrected end (ISO 8601, with an offset).
adjusted_start_time string
Required for correct: the visit's corrected start (ISO 8601, with an offset).
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
resolution_code string, required
Why it is resolved (GET /api/v1/visit-exceptions/reason-codes).
resolution_notes string
Required to dismiss. At most 2000 characters.

VisitImport

completed_at string
counts VisitImportCounts
How its rows were taken, once it has ended.
error object
A failed import's reason: missing_columns, csv_parse_error, empty_file, too_many_rows, file_too_large, unreadable_file, internal_error, abandoned (stopped and not resumed within 2 hours).
error.code string
error.message string
file_name string
The file's name as sent.
findings array of VisitImportFinding
Warnings about rows that were written, once it has ended: a visit on a day a submitted Returned Timesheet holds, left unlinked to that day's care log.
id string, required
The record's id.
inserted_at string
When it was started.
status string, required
total_rows integer
The file's visit rows.
unresolved array of VisitImportUnresolved
The rows not written, by number and reason.

VisitImportCounts

already_ours integer, required
HCB's own visits, as HCB sent them to Sandata; never imported.
changed integer, required
Visits imported before whose times, code or people Sandata changed.
new integer, required
Sandata visits not imported before.
unchanged integer, required
Visits imported before, as they were.
unresolved integer, required
Rows not written; see unresolved.

VisitImportFinding

care_log_id string
message string, required
The warning in words.
period object
The Returned Timesheet's billing period.
period.end string
period.start string
row integer, required
The row's number, the heading row being 1.
rule_id string, required
service_date string
status string
The Returned Timesheet's status: submitted, approved or exported.
timesheet_id string

VisitImportPreview

counts VisitImportCounts, required
dry_run boolean, required
Always true: nothing was written.
total_rows integer, required
The file's visit rows.
unresolved array of VisitImportUnresolved, required

VisitImportUnresolved

message string, required
The reason in words.
reason string, required
row integer, required
The row's number, the heading row being 1.

VisitPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of Visit, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

VisitReassign

The caregiver to hand the visit to, and the lock_version you read.

caregiver_id string, required
One of this agency's caregivers.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.

VisitSandataException

code string, required
The ACK exception Sandata raised on the visit, as its Aggregator shows it: 15 Unmatched Client ID / Phone, 21 No Show Exception.

VisitSignatureSummary

Who signed for the visit and how. The image is not returned here.

captured_at string
When it was signed (UTC).
id string
The record's id.
signature_type string
signer_name string
signer_type string

VisitTransition

The status to move the visit to, and the lock_version you read.

cancellation_note string
A note on the cancellation (a cancel only, up to 1000 characters); needs a cancellation_reason.
cancellation_reason string
Why the visit is cancelled (a cancel only), from the web's pick list: caregiver_call_off (Caregiver called off), client_cancelled (Client cancelled (don't come)), client_hospitalized (Client in hospital or facility), client_unavailable (Client not home or unavailable), schedule_change (Schedule changed), weather_emergency (Weather or emergency), entered_in_error (Entered in error or duplicate), other (Other). Optional; a cancel without one records no reason.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
status string, required
The status to move the visit to.

VisitUpdate

Fields to change, plus the lock_version you read (required). Moving the scheduled start moves the service date to the start's Mountain day (warned as service_date_moved); a window over 24 hours is saved with a long_window warning, one over 31 days is refused. visit_type changes only while the visit is not queued for or sent to Sandata; a visit that is not a group visit carries no group_identifier.

adjusted_end_time string
The agency's corrected end, when it changed the clocked one (UTC); written with its UTC offset, refused without one (422 time_offset_required).
adjusted_start_time string
The agency's corrected start, when it changed the clocked one (UTC); written with its UTC offset, refused without one (422 time_offset_required).
alternate_location boolean
Whether the service was given away from the client's home address.
group_identifier string
For a group visit, the caregiver's name for the group session.
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
memo string
The agency's note on the visit.
modifiers array of string
The procedure modifiers.
procedure_code string
The HCPCS code.
reason_code string
Colorado's reason for a change to adjusted_start_time or adjusted_end_time. Left out, null or blank, the change is saved with OTHER and the answer warns.
reason_memo string
A note on the reason, kept with the change.
scheduled_end_time string
Scheduled end, with its UTC offset; refused without one, as the start.
scheduled_start_time string
Scheduled start, with its UTC offset (Z or -06:00); one without is refused (422 time_offset_required), as is a value that is not a time (422 invalid_time).
visit_type string

VisitWriteResult

data Visit, required
warnings array of object, required
What the write was saved despite: reason_code_missing (an adjusted time changed with no reason_code; recorded as OTHER), overlapping_visit (the caregiver has another visit at that time), group_identifier_dropped (a group name sent for a visit that is not a group visit, which keeps none), assignment_not_open, long_window (over 24 hours) service_date_moved (a moved start re-dated the visit), and on a reassignment calls_superseded (the earlier caregiver's clock calls stay as history and no longer count) caregiver_not_active or months_unfrozen (the visit's signature alone froze the earlier caregiver's Work Order month, which can be edited again).
warnings[].code string, required
warnings[].field string
warnings[].message string, required

W4Change

A caregiver whose W-4 changed since payroll was last told.

adp_file_number string
The caregiver's ADP file number.
caregiver_id string, required
The caregiver.
caregiver_name string
"Last, First", as the payroll pages show it.
id string, required
The caregiver (the row is the caregiver).
w4_changed_at string, required
When the W-4 changed; POST /caregivers/{id}/w4-sent-to-payroll takes it back to clear it.
w4_dependents integer
The dependents now on file.
w4_filing_status string
The filing status now on file.

W4ChangePage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of W4Change, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

Warning

fix object
Where it is fixed, when a page fixes it.
fix.label string, required
What the link says.
fix.path string, required
The app route that fixes it.
id string, required
The rule that raised it, stable, e.g. client_care.medicaid_id_pending.
message string, required
For a person to read.

WebhookDelivery

attempts integer
Attempts so far.
created_at string
When the event was queued (UTC).
delivered_at string
When it was delivered (UTC).
endpoint_id string, required
The endpoint it went to.
event_id string
The event's id, the same on every attempt.
event_type string, required
The event type.
id string, required
The record's id.
last_error string
The last failure.
last_status_code integer
The last HTTP status the endpoint answered.
status string, required
Where it stands.

WebhookDeliveryPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].attempts integer
Attempts so far.
data[].created_at string
When the event was queued (UTC).
data[].delivered_at string
When it was delivered (UTC).
data[].endpoint_id string, required
The endpoint it went to.
data[].event_id string
The event's id, the same on every attempt.
data[].event_type string, required
The event type.
data[].id string, required
The record's id.
data[].last_error string
The last failure.
data[].last_status_code integer
The last HTTP status the endpoint answered.
data[].status string, required
Where it stands.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

WebhookEndpoint

active boolean, required
Whether events are sent.
created_at string
When it was registered (UTC).
events array of string, required
Event types sent.
id string, required
The record's id.
url string, required
Where events are posted.

WebhookEndpointCreate

events array of string, required
Event types to send.
url string, required
An https URL.

WebhookEndpointCreated

data object, required
data.active boolean, required
Whether events are sent.
data.created_at string
When it was registered (UTC).
data.events array of string, required
Event types sent.
data.id string, required
The record's id.
data.url string, required
Where events are posted.
secret string, required
The signing secret, shown this once.

WebhookEndpointPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of object, required
data[].active boolean, required
Whether events are sent.
data[].created_at string
When it was registered (UTC).
data[].events array of string, required
Event types sent.
data[].id string, required
The record's id.
data[].url string, required
Where events are posted.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

WebhookEndpointUpdate

active boolean
Whether events are sent.
events array of string
Event types to send.

Work orderPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of WorkOrder, required
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
total integer, required
Every matching row.

WorkOrder

What was ordered for one client, caregiver and month. An archived work order leaves the plain list; a list with updated_since (a sync) includes archived ones, archived_at set, so a sync learns of an archive.

archived_at string
Set when the agency archived it.
authorization_id string
The service authorization (PAR) it bills against, one of this client's and not deleted; see /api/v1/authorizations. Null or blank unlinks it; another id answers 422 naming authorization_id.
billing_code string
The HCPCS code billed for the service.
caregiver_id string, required
The caregiver serving.
client_id string, required
The client served.
client_signature_date string
When the client signed; null while unsigned.
closing_date string
effective_date string
entries array of object
The delivered days: one per Care Log of this Work Order's client, caregiver, service and shift in its month, as they are now; a combined (legacy) Work Order's are every day recorded on it, since no Care Log carries a combined service. A day can change without moving this record's updated_at; re-read the record by id to have it current.
entries[].date string
entries[].hours_worked string
Hours worked that day.
entries[].time_in string
HH:MM:SS, local time.
entries[].time_out string
HH:MM:SS, local time.
expires_on string
id string, required
The record's id.
inserted_at string
When the record was created.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
modifiers array of string
Billing code modifiers.
month integer, required
1 to 12.
office_hours_total string
Hours the office recorded for the month.
paper_signatures_collected boolean
Whether the signed paper Time & Services card is collected.
paper_signatures_collected_at string
When the paper card was marked collected.
provider_signature_date string
When the provider signed; null while unsigned.
seen_by_date object
Each date of the month (YYYY-MM-DD) to an opaque value: send it as seen to PUT /api/v1/work-orders/{id}/days/{date}, and a date changed since this read is refused with 409 stale_record and nothing written. Its format is not a contract.
service_type string
shift_number integer
The shift, 1 to 4 (default 1).
status string, required
supervisor_designee_signature_date string
When the supervisor's designee signed; null while unsigned.
supervisor_signature_date string
When the supervisor signed; null while unsigned.
updated_at string
When the record last changed.
verified_hours_first_half string
Verified hours, days 1 to 15.
verified_hours_second_half string
Verified hours, day 16 on.
warnings array of object
What the catalog warns of; usually empty. Never a refusal: the work order is saved and bills as entered. Each names its rule (catalog.unknown_code: no HCPF fee schedule prices the billing code) and the message. Recomputed on every read, so it clears once the code changes to a priced one or a fee schedule prices it.
warnings[].message string, required
What the agency is warned of.
warnings[].rule_id string, required
The rule that raised it.
wo_number integer
The agency's work order number.
wo_type string
year integer, required

WorkOrderCareLogFill

differences array of object, required
Always empty: the fill writes nothing (US-118.17).
differences[].date string
differences[].reason string
filled array of string, required
Always empty: the fill writes nothing (US-118.17).
flagged array of object, required
Always empty: the fill writes nothing (US-118.17).
flagged[].date string
flagged[].reason string
unchanged array of string, required
Every date of the month with a delivery (a live care log the Work Order holds), each once, in order.
updated array of string, required
Always empty: the fill writes nothing (US-118.17).

WorkOrderChangeCaregiver

caregiver_id string, required
The caregiver who takes over.
from string, required
The first day the new caregiver works it, YYYY-MM-DD. On or before the Effective Date the whole Work Order moves and this one is archived; later, this one closes the day before.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.

WorkOrderCreate

A new work order. The client and caregiver must be members of the agency that are not deleted; a pair already holding a work order for the month, service, shift and type is refused.

billing_code string
The HCPCS code billed for the service.
caregiver_id string, required
The caregiver serving.
client_id string, required
The client served.
effective_date string
expires_on string
extra_reason string
Why an extra work order is needed (wo_type extra).
modifiers array of string
Billing code modifiers.
month integer, required
1 to 12.
notes string
Free text; written, never returned.
service_type string, required
shift_number integer
The shift, 1 to 4 (default 1).
wo_type string
year integer, required

WorkOrderDayChange

confirm boolean
Optional: mark a date with recorded work not worked.
seen string
The date's value from seen_by_date on GET /api/v1/work-orders/{id} (the get_work_order tool answers it too), to refuse a date changed since that read.
shaded boolean, required
true worked, false not worked.

WorkOrderDistribute

month integer, required
The month, 1 to 12.
selections array of object, required
One per service and shift being generated.
selections[].frequencies object, required
caregiver id => plan task id => visits a week. A caregiver whose counts are all 0 gets no Work Order.
selections[].service_type string, required
The service.
selections[].shift_number integer
Optional: the shift, 1 to 4; default 1.
year integer, required
The year.

WorkOrderDuplicate

caregiver_id string
With mode: the copy's caregiver, this agency's; this Work Order's when not sent.
client_id string
With mode: the copy's client, this agency's; this Work Order's when not sent.
closing_date string
close_previous: this Work Order's Closing Date; the day before effective_date when not sent, as the page's dialog fills it in. Refused before this Work Order's own Effective Date.
effective_date string
keep_both and close_previous, which need it: the copy's Effective Date.
lock_version integer
With mode: the lock_version this Work Order was read with. close_previous needs it, since it closes this Work Order: one changed since answers 409 stale_record, as a second close from the page is refused. Checked when sent with the other modes.
mode string
Makes a new standing Work Order as the page's Duplicate does: keep_both keeps this one as it is; close_previous closes it at closing_date; temporary makes a copy that runs temporary_from to temporary_to. Not with month or year.
month integer
Target month; send with year.
temporary_from string
temporary, which needs it: the copy's first day.
temporary_to string
temporary, which needs it: the copy's last day.
year integer
Target year; send with month.

WorkOrderEvvFill

differences array of object, required
Always empty: the fill writes nothing (US-118.17).
differences[].date string
differences[].entry_id string
The record's id.
differences[].entry_time_in string
HH:MM:SS, Mountain.
differences[].entry_time_out string
HH:MM:SS, Mountain.
differences[].visit_clock_in string
The visit's clock-in (UTC).
differences[].visit_clock_out string
The visit's clock-out (UTC).
differences[].visit_id string
The record's id.
filled array of string, required
Always empty: the fill writes nothing (US-118.17).
flagged array of object, required
Always empty: the fill writes nothing (US-118.17).
flagged[].date string
flagged[].reason string
unchanged array of string, required
Every date of the month with a delivery (a live care log the Work Order holds), each once, in order.
updated array of string, required
Always empty: the fill writes nothing (US-118.17).

WorkOrderGenerate

lrp boolean
Optional: generate the Homemaker Work Order from the client's LRP (legally responsible person) Homemaker plan instead of the regular one, as that plan's page does. Default false.
month integer, required
The month, 1 to 12.
overwrite boolean
Optional: replace the days of a Work Order already in the slot. Default false.
schedule_pattern array of integer
Optional: the weekdays the Work Order runs on, as the Work Order takes them.
service_type_override string
Optional: generate this service instead of the assignment's own; legacy is one Work Order carrying both.
shift_number integer
Optional: the shift, 1 to 4; default 1.
year integer, required
The year.

WorkOrderPlan

lines array of object, required
lines[].minutes integer
Minutes each time (the line's Min/Task).
lines[].notes string
The line's notes.
lines[].task_definition_id string, required
The record's id.
lines[].weekday_counts array of integer
Times on each weekday, Monday first.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
slot_days object, required
Weekday, 1 (Monday) to 7, to its visits in order.
work_order_id string, required
The record's id.

WorkOrderPlanUpdate

drop_lines array of string
Task definition ids whose lines to remove.
lines array of object
Task lines: task_definition_id, minutes, weekday_counts (seven, Monday first), notes.
lines[].minutes integer
Minutes each time (the line's Min/Task).
lines[].notes string
The line's notes.
lines[].task_definition_id string, required
The record's id.
lines[].weekday_counts array of integer
Times on each weekday, Monday first.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
slot_days object
Weekday 1 (Monday) to 7 => its visits, each time_in and time_out (HH:MM:SS); [] clears the day.

WorkOrderSign

date string
The signature date, YYYY-MM-DD: today when left out or null.
lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
signature string, required
The signature as the pad saves it: a base64 PNG of at most 50 KB, with or without a data:image/png;base64, prefix.
signature_type string, required
Whose signature.

WorkOrderTaskMark

completed boolean
count integer
Times that day.
date string
id string
The record's id.
notes string
task_definition_id string
The record's id.
warnings array of object
Dismissible warnings the day's care log raised on this write (a weekly or daily limit, a day a submitted Returned Timesheet missed), each with code and message. Absent for a combined Work Order.
warnings[].code string
warnings[].message string
warnings[].task_definition_id string
work_order_id string
The record's id.

WorkOrderTaskToggle

completed boolean, required
true done, false not done, null untouched.

WorkOrderTransition

lock_version integer, required
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
status string, required
The new status.

WorkOrderUnplannedTask

date string, required
The date, YYYY-MM-DD.
notes string
Optional notes.
task_definition_id string, required
The task's definition id.

WorkOrderUpdate

Fields to change, plus the lock_version you read (required).

billing_code string
The HCPCS code billed for the service.
effective_date string
lock_version integer
Optimistic lock. A PATCH must send the value it read; if the record changed since, the answer is 409 stale_record.
modifiers array of string
Billing code modifiers.

WorkOrderWarning

message string, required
What the agency is warned of.
rule_id string, required
The rule that raised it.

WorkforceReportPage

One page of a list. The total counts every matching record under the same filters, so a client can tell the whole list from the first page.

data array of WorkforceReportRow, required
from string, required
The period's first day.
limit integer, required
Rows asked for (default 100); a larger request is served 200.
offset integer, required
Rows skipped.
to string, required
The period's last day.
total integer, required
Every matching row.

WorkforceReportRow

One worker's hours, wage and members served in one primary service.

average_weekly_hours string
The hours of the period's last four weeks, over four.
below_base_wage boolean
Whether wage_rate is under the 17.00 statewide base wage.
caregiver_id string, required
The caregiver.
caregiver_name string
"Last, First". The CSV never carries it.
counties array of string
The clients' counties.
employee_id string
The caregiver's employee ID, the file's Unique Worker ID.
employment_type string
"Employee" for every caregiver.
end_date string
The end of employment, only when it falls in the period.
hours string
The worked visits' payable hours in the period.
id string, required
The row: the caregiver and the service.
members_served integer
The distinct clients served.
missing array of string
The cells the report could not fill; the row is kept with them blank.
modifiers array of string
The visits' modifiers.
npi string
The agency's NPI.
primary_service string
The procedure code and modifiers, "T1019 U1"; null with no code.
procedure_code string
The visits' procedure code.
start_date string
The hire date, only when it falls in the period.
wage_missing_dates array of string
Days worked with no pay rate in force.
wage_rate string
The lowest work rate in force on a day worked (the client's own rate where one is set); null when none was.