v4_account_role_assignments_get
ChatGPTRead one account role assignment Requires the
account_role_assignments:read scope.By TaxDome
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.
account_role_assignments:read scope.account_role_assignments:read scope.account_roles:read scope.account_roles:read scope.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.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.bills:read scope.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.blobs:modify scope.chat_threads:modify scope.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.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.chat_threads:read scope.chat_threads:destructive scope.chat_threads:modify scope.chat_threads:modify scope.client_assignments:read scope.client_assignments:read scope.client_custom_fields:modify scope.client_custom_fields:read scope.client_notes:modify scope.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.client_notes:read scope.client_notes:modify scope.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.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.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.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.clients:modify scope.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.contact_custom_fields:modify scope.contact_custom_fields:read scope.contact_links:modify scope.contact_links:destructive scope.contact_links:read scope.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.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.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.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.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.directories:read scope.directories:modify scope.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.document_checklist_items:read scope.document_checklists:read scope.document_checklists:read scope.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).documents:destructive scope.documents:destructive scope.documents:read scope.documents:read scope.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.documents:modify scope.documents:destructive scope.documents:modify scope.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.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.email_templates:read scope.employees:read scope.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.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.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.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.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.job_client_statuses:modify scope.job_client_statuses:read scope.job_client_statuses:modify scope.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.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.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.job_recurrences:read scope.job_statuses:read scope.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.jobs:modify scope. How to call it: trigger_kind automoved (the default) makes the record a requirement of the job; the job moves to the next stage by itself only when its stage has automove_jobs true (v4_pipeline_stages_list), its status is active or completed, and v4_jobs_list_unfinished_requirements is empty. With automove_jobs false a link moves nothing. autoactivated returns an on-hold job to active once its autoactivated links are complete.jobs:read scope.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".jobs:read scope.jobs:read scope.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.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.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.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.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.mailbox_threads:modify scope.mailbox_threads:destructive scope.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.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.mailbox_threads:modify scope.mailbox_threads:modify scope.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.message_templates:read scope.message_templates:read scope.organizers:read scope.organizers:read scope.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.payments:read scope.payments:read scope.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.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.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.pipelines:read scope.pipelines:read scope.proposals:read scope.proposals:read scope.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.proposals:read scope.sms_templates:read scope.sms_templates:read scope.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.sms_threads:destructive scope.sms_threads:destructive scope.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.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.tags:read scope.tags:read scope.tags:modify scope.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.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.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.tasks:modify scope.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.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.tasks:modify scope.tasks:destructive scope.tasks:destructive scope.tasks:read scope.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".tasks:read scope.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.tasks:modify scope.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.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.tasks:modify scope.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.tax_returns:read scope.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.tax_returns:read scope.tax_returns:modify scope.tax_returns:destructive scope.tax_returns:modify scope.team_channels:modify scope.team_channels:modify scope.team_channels:read scope.team_channels:read scope.team_channels:read scope.team_channels:read scope.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.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".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.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.Click any prompt to copy it.