MCP App Store
by KeenEthics

Overview

Use TaxDome, the practice management software for accounting, tax and bookkeeping firms, in ChatGPT. Firm staff can find overdue jobs, get a brief on a client before a call, list unpaid invoices, and create or update client accounts, contacts, jobs, tasks and notes. Clients of a TaxDome firm can see what their accountant still needs, where their tax return stands and what they owe, fill in the firm's questionnaires and reply to the firm. Everyone signs in with their own TaxDome login, and ChatGPT sees only what that person can see.

Tools

v4_account_role_assignments_get

ChatGPT
Read one account role assignment Requires the account_role_assignments:read scope.

v4_account_role_assignments_list

ChatGPT
List account role assignments Requires the account_role_assignments:read scope.

v4_account_roles_get

ChatGPT
Read one account role Requires the account_roles:read scope.

v4_account_roles_list

ChatGPT
List the account roles of the firm Requires the account_roles:read scope.

v4_bills_get

ChatGPT
Show a bill Requires the bills:read scope. How to call it: creator_type and creator_id are the person TaxDome shows as the invoice's Assignee (Team member); an invoice has no other assignee. v4_firm_members_list names them.

v4_bills_list

ChatGPT
List bills Requires the bills:read scope. How to call it: Unpaid is filter[status][in] with posted, partially_paid, awaited and processing_deprecated. count=true on the first page gives meta.total_found; a sum of unpaid_amount needs every page. Overdue is filter[overdue]=true (true is the only value): the threshold is the firm's own setting, so never substitute a posted_at cut-off of your own. creator_type and creator_id are the person TaxDome shows as the invoice's Assignee (Team member); an invoice has no other assignee. v4_firm_members_list names them.

v4_bills_list_line_items

ChatGPT
List a bill's line items Requires the bills:read scope.

v4_blobs_create

ChatGPT
Mint a presigned blob upload Requires the blobs:modify scope. How to call it: Only a caller that holds the file's bytes can finish an upload: checksum is the base64 MD5 of those exact bytes (no trailing newline) and byte_size their length, and the PUT to upload.url with upload.headers happens outside this API. signed_id is usable only after that PUT.

v4_blobs_get_upload_url

ChatGPT
Re-sign the upload URL for a blob still awaiting its bytes Requires the blobs:modify scope.

v4_chat_threads_archive

ChatGPT
Archive a chat thread Requires the chat_threads:modify scope.

v4_chat_threads_assign

ChatGPT
Assign a chat thread to a firm member Requires the chat_threads:modify scope. How to call it: assignee_type and assignee_id name the firm member: Employee with an id from v4_employees_list (search by name), Owner with v4_owner_show's id, and v4_me_show's actor_type and actor_id for "assign to me". Ask the user only when the search finds nobody or several people, never guess an id.

v4_chat_threads_create

ChatGPT
Start a chat thread with a client Requires the chat_threads:modify scope. How to call it: Look for an open thread first (v4_chat_threads_list filter[client_id], filter[archived]=false): answering in one is v4_chat_threads_send_message. A new thread's message is its first message and the client reads it in the portal like any other, so show the user the exact text before confirming.

v4_chat_threads_list

ChatGPT
List chat threads Requires the chat_threads:read scope.

v4_chat_threads_send_message

ChatGPT
Post a message into a chat thread Requires the chat_threads:destructive scope.

v4_chat_threads_unarchive

ChatGPT
Unarchive a chat thread Requires the chat_threads:modify scope.

v4_chat_threads_unassign

ChatGPT
Clear the assignee of a chat thread Requires the chat_threads:modify scope.

v4_client_assignments_get

ChatGPT
Read one client assignment Requires the client_assignments:read scope.

v4_client_assignments_list

ChatGPT
List client assignments Requires the client_assignments:read scope.

v4_client_custom_fields_create

ChatGPT
Create a client custom field Requires the client_custom_fields:modify scope.

v4_client_custom_fields_list

ChatGPT
List client custom fields Requires the client_custom_fields:read scope.

v4_client_notes_create

ChatGPT
Create a note Requires the client_notes:modify scope.

v4_client_notes_delete

ChatGPT
Archive a note Requires the client_notes:destructive scope. How to call it: Success comes back as {"ok":true,"status":204} and nothing else: the archived note is not returned. Read it first if the answer should say what was archived.

v4_client_notes_list

ChatGPT
List client notes Requires the client_notes:read scope.

v4_client_notes_update

ChatGPT
Update a note Requires the client_notes:modify scope.

v4_clients_assign_tag

ChatGPT
Assign a tag to a client Requires the clients:modify scope. How to call it: Both ids must exist: the client from v4_clients_list search, the tag from v4_tags_list search. A tag that does not exist yet is created first with v4_tags_create, which needs a color value from v4_tags_colors.

v4_clients_create

ChatGPT
Create a client account (individual, company or other) account_name is required and unique in the firm, case-insensitively, so a repeat is refused; account_type is individual, company or other, and other when left out. tags are names of tags that already exist in the firm (v4_tags_create makes a new one) and tag_ids their ids. This creates the client record only: no contact, portal invite or message - the people behind the client are added with v4_contacts_create. Requires the clients:modify scope. How to call it: Search v4_clients_list for the name first: account_name is unique per firm, case-insensitively, and a repeat is refused. Send account_type (individual, company or other); left out, the client is created as other. tags by name must already exist - the whole create is refused with "Can't find tag with given name" otherwise, whatever the field says - so create a missing tag with v4_tags_create first; tag_ids are not checked. The people behind the client come next: v4_contacts_create with client_ids.

v4_clients_get

ChatGPT
Show a client Requires the clients:read scope. How to call it: custom_fields holds one {id, value, actor_type, actor_id} per filled-in field: id is a field of v4_client_custom_fields_list (name, kind), value a string, actor_* the person of a user-kind field. Values only: fields=["id","custom_fields"]. Read-only.

v4_clients_list

ChatGPT
List clients Requires the clients:read scope. How to call it: search: account_name, company_name, code. filter[tag_ids][in][] any tag, [all][] every one; the person responsible is filter[assignee_type] with filter[assignee_id], only together. Nothing filters clients by contact (v4_contact_links_list does). filter[current_sign_in_at] is the last portal sign-in: [null]=true never, [lt]=<date> not since. custom_fields holds one {id, value, actor_type, actor_id} per filled-in field: id is a field of v4_client_custom_fields_list (name, kind), value a string, actor_* the person of a user-kind field. Values only: fields=["id","custom_fields"]. Read-only.

v4_clients_unassign_tag

ChatGPT
Remove a tag from a client Requires the clients:modify scope.

v4_clients_update

ChatGPT
Update a client Requires the clients:modify scope. How to call it: tags and tag_ids here REPLACE the client's whole tag set, and an empty list clears it. To add or take off one tag, use v4_clients_assign_tag or v4_clients_unassign_tag instead. Send only the fields to change.

v4_contact_custom_fields_create

ChatGPT
Create a contact custom field Requires the contact_custom_fields:modify scope.

v4_contact_custom_fields_list

ChatGPT
List contact custom fields Requires the contact_custom_fields:read scope.

v4_contacts_create

ChatGPT
Create a contact Requires the contacts:modify scope. How to call it: A contact belongs to a client through client_ids; company_name is card text and links nothing. Find the client with v4_clients_list search; a company or household that is not a client yet is made with v4_clients_create first and its id passed in client_ids - offer that if you must ask, never company_name as the link. Later: v4_contact_links_create adds an account, v4_contact_links_delete removes one. phone_number is stored digits only: report the value the response returns, not the one you sent.

v4_contacts_get

ChatGPT
Show a contact Requires the contacts:read scope. How to call it: custom_fields holds one {id, value, actor_type, actor_id} per filled-in field: id is a field of v4_contact_custom_fields_list (name, kind), value a string, actor_* the person of a user-kind field. Values only: fields=["id","custom_fields"]. Read-only.

v4_contacts_list

ChatGPT
List contacts Requires the contacts:read scope. How to call it: filter[client_id][eq] lists the contacts linked to one client; the record itself carries no links - a link's role and the accounts of one contact are on v4_contact_links_list (filter[contact_id][eq]). search finds a person, not their accounts. custom_fields holds one {id, value, actor_type, actor_id} per filled-in field: id is a field of v4_contact_custom_fields_list (name, kind), value a string, actor_* the person of a user-kind field. Values only: fields=["id","custom_fields"]. Read-only.

v4_contacts_update

ChatGPT
Update a contact Requires the contacts:modify scope. How to call it: client_ids REPLACES every client the contact is linked to. To add or remove one account use v4_contact_links_create or v4_contact_links_delete instead; the current links are v4_contact_links_list filter[contact_id][eq]. Send client_ids only with the complete list. Send only the fields to change. phone_number is stored digits only: report the value the response returns, not the one you sent.

v4_directories_create

ChatGPT
Create a client folder Requires the directories:modify scope. How to call it: parent_id is the folder to nest under. A top-level folder goes under the client's tree root, the first id of any folder's path in v4_directories_list filter[client_id]; that root is never listed itself. Names are unique among siblings.

v4_directories_list

ChatGPT
List client folders Requires the directories:read scope.

v4_directories_move

ChatGPT
Move a folder into another folder Requires the directories:modify scope.

v4_directories_update

ChatGPT
Update a client folder Requires the directories:destructive scope. How to call it: Sharing a folder with the client is client_access_right read or read_write on the client's top-level folder (a path of two ids), and it shares everything inside. An inner folder cannot be shared on its own: say so, and offer its top-level folder or a move under a shared one with v4_directories_move.

v4_document_checklist_items_list

ChatGPT
List document checklist items Requires the document_checklist_items:read scope.

v4_document_checklists_get

ChatGPT
Show a document checklist Requires the document_checklists:read scope.

v4_document_checklists_list

ChatGPT
List document checklists Requires the document_checklists:read scope.

v4_documents_create

ChatGPT
Upload a document Requires the documents:destructive scope. How to call it: Three steps: v4_blobs_create, PUT the bytes to upload.url with upload.headers, then this call with the blob's signed_id as blob_signed_id. directory_id is a folder from v4_directories_list filter[client_id], never the tree root (the first id of a path). The client sees the file, and any email about it, only if the folder's top-level folder gives them access (client_access_right read or read_write).

v4_documents_delete

ChatGPT
Move a document to the trash Requires the documents:destructive scope.

v4_documents_delete_forever

ChatGPT
Permanently delete a trashed document Requires the documents:destructive scope.

v4_documents_get

ChatGPT
Show a document Requires the documents:read scope.

v4_documents_get_signature_request

ChatGPT
Show a document signature request Requires the documents:read scope.

v4_documents_list

ChatGPT
List documents Requires the documents:read scope. How to call it: filter[signature_states] takes in only (the labels overlap; eq is a 400): filter[signature_states][in][]= pending, partially_signed, signed, opted_out, kba_failed, kba_pending, created or voided. pending includes a partly signed request.

v4_documents_move

ChatGPT
Move a document into a folder Requires the documents:modify scope.

v4_documents_notify_client

ChatGPT
Notify the client about a document Requires the documents:destructive scope.

v4_documents_restore

ChatGPT
Restore a trashed document Requires the documents:modify scope.

v4_documents_update

ChatGPT
Update a document Requires the documents:destructive scope. How to call it: To ask the client to approve a document already uploaded, set need_approval true; to tell them about it with no approval, v4_documents_notify_client instead. Send only the fields to change.

v4_email_templates_get

ChatGPT
Read one email template Requires the email_templates:read scope. How to call it: from_type and from_id are the sender as a firm-member pair (Owner or Employee), not a user id. To send as that sender, v4_mailbox_messages_create's from_user_id takes their user_id: v4_firm_members_list with type=from_type and ids=from_id.

v4_email_templates_list

ChatGPT
List email templates Requires the email_templates:read scope.

v4_employees_get

ChatGPT
Read one employee Requires the employees:read scope.

v4_employees_list

ChatGPT
List the employee roster Requires the employees:read scope. How to call it: Any member of the firm may read the roster: search by name or email turns a colleague into an id. An employee's id is the actor_id (or assignee_id) to pair with Employee. filter[client_id] narrows it to the active employees who can see that client. The Owner is not on this roster: v4_owner_show, which every member may read.

v4_firm_members_list

ChatGPT
Resolve firm members Requires the firm_members:read scope. How to call it: Resolves a person pair you already hold into a name: type (Owner or Employee - the record's assignee_type, creator_type, actor_type) with ids of that type, one type per call; either half alone is a 400. A bare user id goes in user_ids instead. It does not browse or search: for a name, use v4_employees_list.

v4_job_assignments_create

ChatGPT
Assign a team member to a job One person per call, as the actor_type and actor_id pair. The job's other assignees stay; someone already on the job answers their existing row. Requires the job_assignments:modify scope. How to call it: actor_type and actor_id name the firm member: Employee with an id from v4_employees_list (search by name), Owner with v4_owner_show's id, and v4_me_show's actor_type and actor_id for "me", never its user_id. One person per call; the other assignees stay, and someone already assigned answers their existing row.

v4_job_assignments_delete

ChatGPT
Remove one assignee from a job - pass the assignment row id The id is the row's from v4_job_assignments_list, never the person's actor_id. The job and its other assignees stay. Requires the job_assignments:modify scope. How to call it: The id is the assignment ROW's id, from the matching list (v4_job_assignments_list, v4_task_assignments_list or v4_job_recurrence_assignments_list) filtered by the record and the person's pair - never the person's actor_id. Only that one person is removed.

v4_job_assignments_list

ChatGPT
List job assignments Requires the job_assignments:read scope. How to call it: Who is on a job: filter[job_id] (filter[job_id][in] for a page of jobs), then resolve the actors with v4_firm_members_list: type (the row's actor_type) and ids, one type per call. What a person works on: filter[actor_type] and filter[actor_id] together - an id alone is a 400. Assigning is v4_job_assignments_create; unassigning is v4_job_assignments_delete with the id of the row read here.

v4_job_client_statuses_create

ChatGPT
Create a client status Requires the job_client_statuses:modify scope.

v4_job_client_statuses_list

ChatGPT
List client statuses Requires the job_client_statuses:read scope.

v4_job_client_statuses_update

ChatGPT
Update a client status Requires the job_client_statuses:modify scope.

v4_job_recurrence_assignments_create

ChatGPT
Assign a team member to the future jobs of a recurring job rule One person per call, as the actor_type and actor_id pair. Only jobs the rule creates from now on are affected; someone already on the rule answers their existing row. Requires the job_recurrence_assignments:modify scope. How to call it: actor_type and actor_id name the firm member: Employee with an id from v4_employees_list (search by name), Owner with v4_owner_show's id, and v4_me_show's actor_type and actor_id for "me", never its user_id. One person per call; the other assignees stay, and someone already assigned answers their existing row. Only the jobs the rule launches from now on are affected.

v4_job_recurrence_assignments_delete

ChatGPT
Remove one assignee from a recurring job rule - pass the assignment row id The id is the row's from v4_job_recurrence_assignments_list, never the person's actor_id. Jobs the rule already created keep their assignees. Requires the job_recurrence_assignments:modify scope. How to call it: The id is the assignment ROW's id, from the matching list (v4_job_assignments_list, v4_task_assignments_list or v4_job_recurrence_assignments_list) filtered by the record and the person's pair - never the person's actor_id. Only that one person is removed.

v4_job_recurrence_assignments_list

ChatGPT
List who the jobs of a recurring job rule go to Filter by job_recurrence_id or by the actor_type and actor_id pair together. The jobs a rule already created have their own assignees, in v4_job_assignments_list. Requires the job_recurrence_assignments:read scope. How to call it: Who the jobs of a recurring job rule go to: filter[job_recurrence_id] (rules from v4_job_recurrences_list). These are the rule's people, not those of the jobs it already launched (v4_job_assignments_list). The row's id is what v4_job_recurrence_assignments_delete takes.

v4_job_recurrences_list

ChatGPT
List job recurrence rules Requires the job_recurrences:read scope.

v4_job_statuses_list

ChatGPT
List job statuses Requires the job_statuses:read scope.

v4_jobs_create

ChatGPT
Create a job for a client in a pipeline client_id and pipeline_id are required; pipeline_stage_id is a stage of that pipeline, its first when left out. The call creates the job and nothing else: the stage's automations - workflow rules the firm set up on that stage in TaxDome - are skipped unless the request lists them by id under automations with perform: true, which only the user decides. Requires the jobs:modify scope. How to call it: client_id (v4_clients_list) and pipeline_id (v4_pipelines_list) are required; pipeline_stage_id is a stage of THAT pipeline from v4_pipeline_stages_list filter[pipeline_id], the first stage when left out. With job_template_id only name and time_budget may be sent beside it. Leave automations out: the call then creates the job and nothing else. List an automation there only when the user named that automation and asked for it to run.

v4_jobs_get

ChatGPT
Show a job Requires the jobs:read scope.

v4_jobs_list

ChatGPT
List jobs Requires the jobs:read scope. How to call it: There is no filter by name: find the client with v4_clients_list, then filter[client_id] and read name, pipeline_stage_id and due_date off each job. Someone's jobs are filter[assignee_type] with filter[assignee_id] (both halves); open ones filter[completed_at][null]=true; overdue filter[due_date][lt] today. Who is on a job is v4_job_assignments_list. count=true on the first page answers "how many".

v4_jobs_list_unfinished_requirements

ChatGPT
Read what still blocks a job Requires the jobs:read scope.

v4_jobs_move

ChatGPT
Move a job to another stage of its pipeline stage_id is a stage of the job's own pipeline. When the new stage has automations - workflow rules the firm set up on that stage in TaxDome - or the job has unfinished requirements, the call moves nothing and answers 422 need_confirmation listing them. The job moves only when the same request is repeated with the listed items under confirmations, which only the user decides. Requires the jobs:modify scope. How to call it: stage_id is a stage from v4_pipeline_stages_list. A job does not carry its pipeline: look up its pipeline_stage_id (v4_pipeline_stages_list ids=) for pipeline_id, then list that pipeline's stages with filter[pipeline_id] and match the title the user said; a word that is no stage may be a status (v4_jobs_update_status). A 422 need_confirmation means the job did not move; it lists the stage's automations and the unfinished requirements. Show them to the user and repeat with move.confirmations only for the items they approve, never on your own.

v4_jobs_update

ChatGPT
Edit a job's name, description, priority, dates or time budget Status is v4_jobs_update_status, the stage v4_jobs_move, people v4_job_assignments_create and v4_job_assignments_delete: any of them in this body is a 400. Requires the jobs:modify scope. How to call it: Send only the fields to change. Status is v4_jobs_update_status, the stage v4_jobs_move, people v4_job_assignments_create and v4_job_assignments_delete; any of them in this body is a 400. time_budget is minutes and needs the edit_time_budget right.

v4_jobs_update_status

ChatGPT
Change a job's status (active, on hold, completed or archived) pipeline_job_status_id is a status of the job's own pipeline. When the change would run the stage's automations - workflow rules the firm set up on that stage in TaxDome - or leave requirements unfinished, the call changes nothing and answers 422 need_confirmation listing them. The status changes only when the same request is repeated with the listed items under confirmations, which only the user decides. Requires the jobs:modify scope. How to call it: pipeline_job_status_id must be a status of the job's own pipeline: get the pipeline through the job's stage (v4_pipeline_stages_list ids=pipeline_stage_id), then v4_job_statuses_list filter[pipeline_id]. Match on kind (active, on_hold, completed, archived), not on name - system names come back in the platform's language; a pipeline may have no completed status at all. A 422 need_confirmation means the status did not change; it lists the unfinished requirements and the automations. Show them to the user and repeat with status.confirmations only for the items they approve, never on your own.

v4_mailbox_messages_create

ChatGPT
Send an email to a client Requires the mailbox_messages:destructive scope. How to call it: client_id is required (v4_clients_list). Without contact_id and emails the mail goes to the client's notification addresses. To write to one person send both: contact_id (a contact of that client) and emails - emails decide where it goes and are not checked against the contact. from_user_id is a USER id (v4_firm_members_list), the caller by default. Attachments are file_blob_ids from v4_blobs_create after the PUT; a document already in TaxDome cannot be attached.

v4_mailbox_threads_assign

ChatGPT
Assign a mailbox thread to a firm member Requires the mailbox_threads:modify scope. How to call it: assignee_type and assignee_id name the firm member: Employee with an id from v4_employees_list (search by name), Owner with v4_owner_show's id, and v4_me_show's actor_type and actor_id for "assign to me". Ask the user only when the search finds nobody or several people, never guess an id.

v4_mailbox_threads_create_internal_comment

ChatGPT
Add an internal comment to a mailbox thread Requires the mailbox_threads:modify scope.

v4_mailbox_threads_delete_internal_comment

ChatGPT
Delete an internal comment Requires the mailbox_threads:destructive scope.

v4_mailbox_threads_get

ChatGPT
Show a mailbox thread Requires the mailbox_threads:read scope. How to call it: A thread is a preview: subject and snippet (the provider's short preview of the latest message). No message body is served; never present the snippet as what the email said.

v4_mailbox_threads_list

ChatGPT
List mailbox threads Requires the mailbox_threads:read scope. How to call it: user_id is the mailbox OWNER (a USER id: v4_firm_members_list user_ids= names them); assignee_type and assignee_id are the colleague the thread is assigned to, who need not own the mailbox. Nothing filters by owner: for one person's mailbox page with fields=user_id and keep their rows, and say you narrowed it. A thread is a preview: subject and snippet (the provider's short preview of the latest message). No message body is served; never present the snippet as what the email said.

v4_mailbox_threads_unassign

ChatGPT
Clear the assignee of a mailbox thread Requires the mailbox_threads:modify scope.

v4_mailbox_threads_update_internal_comment

ChatGPT
Edit an internal comment Requires the mailbox_threads:modify scope.

v4_me_show

ChatGPT
Who is calling Requires the me:read scope. How to call it: For "me" as an assignee or a filter, ask for fields actor_id and actor_type: that pair is the caller as a firm member (Owner or Employee). user_id is the login account's id and is never an actor_id; a pair built from it names nobody.

v4_message_templates_get

ChatGPT
Read one chat message template Requires the message_templates:read scope.

v4_message_templates_list

ChatGPT
List chat message templates Requires the message_templates:read scope.

v4_organizers_get

ChatGPT
Show an organizer Requires the organizers:read scope.

v4_organizers_list

ChatGPT
List organizers Requires the organizers:read scope.

v4_owner_show

ChatGPT
Read the firm owner Requires the owner:read scope. How to call it: The firm owner as a firm member: id is the id records carry with type Owner (assignee_type=Owner, actor_type=Owner). Takes no arguments but fields. Every member may read it, unlike v4_employees_list, which does not list the Owner.

v4_payments_get

ChatGPT
Show a payment Requires the payments:read scope.

v4_payments_list

ChatGPT
List payments Requires the payments:read scope.

v4_pipeline_stages_list

ChatGPT
List pipeline stages Requires the pipeline_stages:read scope. How to call it: Stages come back newest first, not in board order, and order is not sortable: list a pipeline's stages with filter[pipeline_id] and sort them by order yourself before showing them. ids= the job's pipeline_stage_id gives its pipeline_id.

v4_pipelines_clone

ChatGPT
Clone a pipeline Requires the pipelines:modify scope. How to call it: Nothing here edits or deletes a pipeline or its stages afterwards; a wrong title or stage list is fixed by hand in TaxDome. Read the title and every stage back to the user before confirming.

v4_pipelines_create

ChatGPT
Create a pipeline Requires the pipelines:modify scope. How to call it: Nothing here edits or deletes a pipeline or its stages afterwards; a wrong title or stage list is fixed by hand in TaxDome. Read the title and every stage back to the user before confirming.

v4_pipelines_get

ChatGPT
Show a pipeline Requires the pipelines:read scope.

v4_pipelines_list

ChatGPT
List pipelines Requires the pipelines:read scope.

v4_proposals_get

ChatGPT
Read one proposal Requires the proposals:read scope.

v4_proposals_list

ChatGPT
List proposals Requires the proposals:read scope.

v4_proposals_list_line_items

ChatGPT
List the services, quantities and prices a proposal sells Returned by id, not in display order: sort by order. package_id says which package a packaged line belongs to; a discount line has a negative rate. Requires the proposals:read scope. How to call it: The proposal id comes from v4_proposals_list (filter[client_id]). Lines come back by id, not in display order: sort by order. package_id groups a packaged proposal's lines (v4_proposals_list_packages says which package was selected); a discount line has a negative rate, and amounts are pre-tax and do not sum to the package total.

v4_proposals_list_packages

ChatGPT
List a proposal's packages Requires the proposals:read scope.

v4_sms_templates_get

ChatGPT
Read one SMS template Requires the sms_templates:read scope.

v4_sms_templates_list

ChatGPT
List SMS templates Requires the sms_templates:read scope.

v4_sms_threads_list

ChatGPT
List the firm's SMS conversations with clients One thread per phone number (value), with the account_ids and contact_ids it belongs to, its assignee, unread count and the time of the last message. It returns the threads, not the text of their messages. Filters are assignee and created or updated time; there is no filter by client. Requires the sms_threads:read scope. How to call it: There is no filter by client and nothing here starts a new SMS thread. A thread carries account_ids and contact_ids: page with fields=value,account_ids,contact_ids and keep the ones that hold the client's id.

v4_sms_threads_resend_message

ChatGPT
Resend a failed SMS Requires the sms_threads:destructive scope.

v4_sms_threads_send_message

ChatGPT
Send an SMS Requires the sms_threads:destructive scope.

v4_tags_colors

ChatGPT
The tag colour palette. Every value tag.color accepts, with the name and hex each one renders as. value is what the API takes; name, family and hex are for choosing — filter by family to answer "make it green". Answered by the gateway: the origin validates against these values and publishes no name or swatch for them.

v4_tags_create

ChatGPT
Create a tag Requires the tags:modify scope. How to call it: Search v4_tags_list for the name first: there is no merge and no delete, and a name is unique only per color, so the same name in another color is a second tag. color is required whatever the schema says, and it is a value from v4_tags_colors, never a hex code.

v4_tags_get

ChatGPT
Show a tag Requires the tags:read scope.

v4_tags_list

ChatGPT
List tags Requires the tags:read scope.

v4_tags_update

ChatGPT
Update a tag Requires the tags:modify scope.

v4_task_assignments_create

ChatGPT
Assign a team member to a task (they are notified) One person per call, as the actor_type and actor_id pair. The task's other assignees stay; someone already on the task answers their existing row. The person gets the task-assigned notification. Requires the task_assignments:modify scope. How to call it: actor_type and actor_id name the firm member: Employee with an id from v4_employees_list (search by name), Owner with v4_owner_show's id, and v4_me_show's actor_type and actor_id for "me", never its user_id. One person per call; the other assignees stay, and someone already assigned answers their existing row. On a series' template task (v4_tasks_get is_template) it reaches every task the series creates from now on; on an earlier task, that task alone. Say which.

v4_task_assignments_delete

ChatGPT
Remove one assignee from a task - pass the assignment row id The id is the row's from v4_task_assignments_list, never the person's actor_id. The task and its other assignees stay. Requires the task_assignments:modify scope. How to call it: The id is the assignment ROW's id, from the matching list (v4_job_assignments_list, v4_task_assignments_list or v4_job_recurrence_assignments_list) filtered by the record and the person's pair - never the person's actor_id. Only that one person is removed. On a series' template task (v4_tasks_get is_template) it reaches every task the series creates from now on; on an earlier task, that task alone. Say which.

v4_task_assignments_list

ChatGPT
List who is assigned to which task Filter by task_id (in for a page of tasks) or by the actor_type and actor_id pair together. Requires the task_assignments:read scope. How to call it: Who is on a task: filter[task_id] (filter[task_id][in] for a page of tasks), then names through v4_firm_members_list type and ids (one type per call). What a person is on: filter[actor_type] and filter[actor_id] together. The row's id is what v4_task_assignments_delete takes.

v4_tasks_add_checklist_item

ChatGPT
Add an item to the end of a task's checklist The other items stay as they are. A text already on the checklist is a 422: tick that item with v4_tasks_update_checklist_item instead. Requires the tasks:modify scope.

v4_tasks_assign_tag

ChatGPT
Assign a tag to a task (its other tags stay) One tag per call, by its id from v4_tags_list; a tag already on the task changes nothing. An id that names no tag is a 404 and nothing is written. Requires the tasks:modify scope. How to call it: Both ids must exist: the task from v4_tasks_list, the tag from v4_tags_list search. A tag that does not exist yet is created first with v4_tags_create.

v4_tasks_create

ChatGPT
Create a task Requires the tasks:modify scope. How to call it: status is required (no_status when the user named none). client_id comes from v4_clients_list, pipeline_stage_client_id is a job id from v4_jobs_list. assignees are {actor_type, actor_id} pairs: Employee with an id from v4_employees_list, Owner with the Owner's id, and v4_me_show for the caller (later: v4_task_assignments_create). due_date and start_date are YYYY-MM-DD in the firm's timezone. A client, job or person the user named but you could not find is a question for the user, not a guess.

v4_tasks_create_note

ChatGPT
Create a task note Requires the tasks:modify scope.

v4_tasks_delete

ChatGPT
Delete a task Requires the tasks:destructive scope.

v4_tasks_delete_note

ChatGPT
Delete a task note Requires the tasks:destructive scope.

v4_tasks_get

ChatGPT
Read a task Requires the tasks:read scope.

v4_tasks_list

ChatGPT
List tasks Requires the tasks:read scope. How to call it: "My" tasks are filter[assignee_type] and filter[assignee_id] with v4_me_show's actor pair (both halves, one alone is a 400). Open work is filter[status][in] with the open statuses, not completed_at (a reopened task keeps it); overdue adds filter[due_date][lt] today from v4_me_show's now. A task record carries no assignees: who is on a task is v4_task_assignments_list filter[task_id]. count=true on the first page answers "how many".

v4_tasks_list_notes

ChatGPT
List task notes Requires the tasks:read scope.

v4_tasks_remove_checklist_item

ChatGPT
Remove one item from a task's checklist position is the item's number in the task's checklist, from 1; item is its current text, which must still be at that position - otherwise a 409 shows the list as it is now and nothing is removed. The items after it move up one place. Requires the tasks:modify scope. How to call it: position is the item's number in the task's checklist from v4_tasks_get, counting from 1, and item is its current text, exactly as read. A 409 means the list changed: read the task again and use the position and text it shows now.

v4_tasks_unassign_tag

ChatGPT
Remove a tag from a task (the tag itself stays) One tag per call; the task's other tags stay, and a tag the task does not have changes nothing. The task is not deleted: assign the tag again to undo. Requires the tasks:modify scope.

v4_tasks_update

ChatGPT
Update a task Assignees are not changed here (a 400): v4_task_assignments_create and v4_task_assignments_delete. tag_ids and checklist here REPLACE the whole list, and a tag or item left out is gone: to put on or take off one tag use v4_tasks_assign_tag and v4_tasks_unassign_tag, to change one checklist item v4_tasks_add_checklist_item, v4_tasks_update_checklist_item and v4_tasks_remove_checklist_item. Requires the tasks:modify scope. How to call it: Send only the fields to change. checklist and tag_ids each REPLACE the whole list; for one tag use v4_tasks_assign_tag / v4_tasks_unassign_tag, for one checklist item v4_tasks_add_checklist_item, v4_tasks_update_checklist_item or v4_tasks_remove_checklist_item. Completing a task is status completed. schedule null stops the repeat for the whole series. assignees are a 400 here: v4_task_assignments_create and v4_task_assignments_delete.

v4_tasks_update_checklist_item

ChatGPT
Tick, untick or rename one item of a task's checklist position is the item's number in the task's checklist, from 1; item is its current text, which must still be at that position - if the list changed since you read it the answer is a 409 showing the list as it is now, and nothing is changed. Send checked, rename or both. Requires the tasks:modify scope. How to call it: position is the item's number in the task's checklist from v4_tasks_get, counting from 1, and item is its current text, exactly as read. A 409 means the list changed: read the task again and use the position and text it shows now.

v4_tasks_update_note

ChatGPT
Update a task note Requires the tasks:modify scope.

v4_tax_returns_get

ChatGPT
Show a tax return Requires the tax_returns:read scope. How to call it: preparation_state is the return's delivery to the client: created (not sent), sent_to_client (waiting on the client), approved (the client approved it, approved_at), rejected. It is not an e-signature status - the record carries no signer or signature field - so never report it as signed or awaiting signature.

v4_tax_returns_get_intro

ChatGPT
Read the intro of a tax return Requires the tax_returns:read scope.

v4_tax_returns_list

ChatGPT
List tax returns Requires the tax_returns:read scope. How to call it: preparation_state is the return's delivery to the client: created (not sent), sent_to_client (waiting on the client), approved (the client approved it, approved_at), rejected. It is not an e-signature status - the record carries no signer or signature field - so never report it as signed or awaiting signature.

v4_tax_returns_list_categories

ChatGPT
List page categories of a tax return Requires the tax_returns:read scope.

v4_tax_returns_lock_document

ChatGPT
Lock the tax return document behind a bill Requires the tax_returns:modify scope.

v4_tax_returns_unlock_document

ChatGPT
Unlock the tax return document Requires the tax_returns:destructive scope.

v4_tax_returns_update_intro

ChatGPT
Write the intro of a tax return Requires the tax_returns:modify scope.

v4_team_channels_create

ChatGPT
Create a team chat channel Requires the team_channels:modify scope.

v4_team_channels_create_message

ChatGPT
Create a team channel message Requires the team_channels:modify scope.

v4_team_channels_get

ChatGPT
Show a team chat channel Requires the team_channels:read scope.

v4_team_channels_get_message

ChatGPT
Show a team channel message Requires the team_channels:read scope.

v4_team_channels_list

ChatGPT
List team chat channels Requires the team_channels:read scope.

v4_team_channels_list_messages

ChatGPT
List team channel messages Requires the team_channels:read scope.

v4_time_entries_finish

ChatGPT
Stop a timer for good Requires the time_entries:modify scope. How to call it: The id is a time entry's. For "my timer", v4_me_show gives actor_type and actor_id; then v4_time_entries_list with filter[assignee_type], filter[assignee_id] and filter[state] (active or paused). Nothing here starts a timer or logs time.

v4_time_entries_list

ChatGPT
List tracked time entries Requires the time_entries:read scope. How to call it: The assignee filter is the pair filter[assignee_type] and filter[assignee_id], never one alone; v4_me_show gives the caller's pair. duration is in seconds. invoice_status and rate come back null to a user without the billing rights, so null does not mean unbilled. count=true on the first page answers "how many".

v4_time_entries_pause

ChatGPT
Pause a running timer Requires the time_entries:modify scope. How to call it: The id is a time entry's. For "my timer", v4_me_show gives actor_type and actor_id; then v4_time_entries_list with filter[assignee_type], filter[assignee_id] and filter[state] (active or paused). Nothing here starts a timer or logs time.

v4_time_entries_resume

ChatGPT
Resume a paused timer Requires the time_entries:modify scope. How to call it: The id is a time entry's. For "my timer", v4_me_show gives actor_type and actor_id; then v4_time_entries_list with filter[assignee_type], filter[assignee_id] and filter[state] (active or paused). Nothing here starts a timer or logs time.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

Similar Apps