AgosSign inStart free

Connect your own LLM client.

Your agent signs in as you and works in the same records you do.

What an agent can and cannot do

Connect in 3 steps

  1. Copy the server URL.
  2. Add it to your LLM client as a remote MCP server.
  3. Sign in as yourself and tick the apps your agent can use.
https://mcp.agos.symph.co/mcp

6 examples, 1 per app

Tools

200 tools, read from the server on every build. Inputs marked ? are optional.

Agos Docs 45 tools
spring.ask.done
Writes

Mark a question from spring.ask.queue answered once its page holds your answer. Only your own person's questions. Writes, and the result carries event_id for undo.

Inputs: page_id
Returns: The changed record, with event_id for undo.
spring.ask.queue

Questions your person typed into the Docs search bar for you, oldest first. Each is a private page titled with the question. Answer each one: find what Agos Docs holds with spring.search and spring.page.get, write the answer into that page with spring.page.update (replace_markdown), linking the pages you used as @[Title](page_id) mentions and saying plainly when Agos Docs has nothing on it, then call spring.ask.done with the page_id. Returns asks and how many are waiting in all. Read only.

Inputs: limit?
Returns: Returns asks and how many are waiting in all.
spring.comment.create
Writes

Comment on a page, on 1 block of it (block ids from spring.page.get with_block_ids), or reply in a thread. Writes, and the result carries event_id for undo.

Inputs: page_id, text, block_id?, thread_id?
Returns: The changed record, with event_id for undo.
spring.comment.list

Comment threads on a page or row, with the quoted text, messages and authors. Read only.

Inputs: page_id, state?
Returns: The matching records.
spring.comment.resolve
Writes

Resolve a comment thread, or reopen it with resolved false. Writes, and the result carries event_id for undo.

Inputs: thread_id, resolved?
Returns: The changed record, with event_id for undo.
spring.database.create
Writes

Create a database in a space or page with a Name field plus the fields given (select, multi_select and status take options). Returns the database with field ids and its table view. With source "linked", linked_type "task" or "request" and linked_scope a project id, the rows are that project's live records: nothing is copied, cell writes go to the source record under its app's rules, rows cannot be deleted, and row ids are core record ids for the owning app's tools. Writes, and the result carries event_id for undo.

Inputs: parent_id, name?, fields?, source?, linked_type?, linked_scope?
Returns: Returns the database with field ids and its table view.
spring.database.export

Export a view (its filter, sorts and visible fields) or a whole database as CSV or JSON. Returns a signed url valid for 15 minutes. Read only.

Inputs: view_id?, database_id?, format
Returns: Returns a signed url valid for 15 minutes.
spring.database.get

A database: its fields (id, name, type, options), source, row count and views. Read only.

Inputs: database_id
Returns: The matching records.
spring.database.import_csv
Writes

Import CSV rows. With preview true (or no mapping) nothing is written: you get the first 20 rows, a guessed type per column and which existing field each column matches. Then send mapping: each column to field_id, a new field {name, type}, or skip. Into database_id, or a new database under parent_id. 1 undo removes the import. Writes, and the result carries event_id for undo.

Inputs: csv, database_id?, parent_id?, name?, preview, mapping?
Returns: The changed record, with event_id for undo.
spring.database.update_schema
Writes

Change fields: add, rename, delete (undo brings the values back), restore, change_type, set format, and add, rename or delete options. A relation takes target {database_id} or {type} (a record type from another app), single for 1 item, and two_way to add the matching field on the other database. A rollup takes rollup {relation: field id, field: field id of the related records or "name", calc: count, count_unique, count_empty, sum, average, min, max, earliest, latest, range, percent_checked or show_all}. A formula takes expression, with fields written [Name]; set_formula changes it. Check one first with spring.formula.check. A type change or option delete that clears values returns conflict with data.cleared_values until confirm is true. Writes, and the result carries event_id for undo.

Inputs: database_id, changes
Returns: The changed record, with event_id for undo.
spring.formula.check

Check a formula against a database before saving it. Fields are written [Name]. Returns ok and result_type, or ok false with the error message and its position (0-based). Send field_id when changing an existing formula so loops through it are caught. 68 functions: if, ifs, empty, coalesce, and, or, not; abs, round, ceil, floor, min, max, sum, mean, median, sqrt, pow, mod, sign, toNumber; length, lower, upper, trim, contains, startsWith, endsWith, replace, substring, split, join, format, repeat, toText; now, today, year, month, week, day, hour, minute, dateAdd, dateSubtract, dateBetween, formatDate, parseDate, startOf, endOf; first, last, at, slice, sort, reverse, unique, includes, filter, map, some, every, count, flat (filter, map, some, every and count read each item as current); name, email, id; let(name, value, expression). Operators: + - * / % ^, == != > >= < <=, and or not, & joins text. Read only.

Inputs: database_id, expression, field_id?
Returns: Returns ok and result_type, or ok false with the error message and its position (0-based).
spring.formula.evaluate

Work out a formula for 1 row without saving it. Returns the value (dates as ISO text, people and records as id with name), or an error for that row. Read only.

Inputs: database_id, expression, row_id
Returns: Returns the value (dates as ISO text, people and records as id with name), or an error for that row.
spring.import.status

Notion and Coda imports (SPR-042, SPR-043): status, the totals of spaces, pages, databases, rows, views, comments and files, and what the run created, updated and could not import. Without import_id, the 10 latest. Starting, moving to live and rolling back an import are done by an admin in the browser. Owners and admins only. Read only.

Inputs: import_id?
Returns: The matching records.
spring.page.create
Writes

Create a page in a space or under a page, with an optional Markdown body, or from a page template (template_id from spring.template.list) with today filled in for its date placeholders. Blocks beyond Markdown: :::callout {icon="bulb"} ... :::, :::toggle {title="..."} ... :::, :::columns holding 2 to 4 :::column ... ::: blocks, ::media{kind="image|video|audio|file" url="https://..." alt="..." caption="..."}, ::bookmark{url="..."}, ::embed{url="..."} (YouTube, Vimeo, Loom, Figma, Google Docs, Sheets and Slides, Miro, CodePen), ::toc, ::breadcrumb, ::record{ref="tsk_..."}, ::page{ref="pag_..."}, ::database{id="dbs_..."}, and @[Label](record_id) for a mention. An agent's page shows Drafted by the person's agent and is never verified at creation. Writes, and the result carries event_id for undo.

Inputs: parent_id, title, markdown?, icon?, template_id?
Returns: The changed record, with event_id for undo.
spring.page.delete
Writes

Move a page and its child pages to the trash. spring.page.restore brings them back for 30 days. Writes, and the result carries event_id for undo.

Inputs: page_id
Returns: The changed record, with event_id for undo.
spring.page.flag_outdated
Writes

Tell the page owner a page looks out of date, with a note of up to 280 characters. Writes, and the result carries event_id for undo.

Inputs: page_id, note
Returns: The changed record, with event_id for undo.
spring.page.get

A page: meta, body_markdown, links out and in, and the open suggestion count. with_block_ids puts <!-- block:id --> before each block, for block_edits. Read only.

Inputs: page_id, with_block_ids?, version_id?
Returns: The matching records.
spring.page.history

Saved versions of a page, newest first, with time, authors and name. Read only.

Inputs: page_id
Returns: The matching records.
spring.page.list

The pages under a space or page as a tree, up to 3 levels, with id, title, icon and child count. Read only.

Inputs: parent_id, depth?
Returns: The matching records.
spring.page.move
Writes

Move a page into a space or under another page. Its child pages move with it. Writes, and the result carries event_id for undo.

Inputs: page_id, parent_id
Returns: The changed record, with event_id for undo.
spring.page.request_verification
Writes

Ask the page owner to verify a page, with the checklist of what you checked ticked. Returns the gate id; only a person can confirm. Writes, and the result carries event_id for undo.

Inputs: page_id, checklist, note?
Returns: Returns the gate id; only a person can confirm.
spring.page.restore
Writes

Bring a page back from the trash with the child pages trashed with it. Writes, and the result carries event_id for undo.

Inputs: page_id
Returns: The changed record, with event_id for undo.
spring.page.restore_version
Writes

Bring a page, or 1 block, back to a saved version. From an agent it arrives as suggestions unless the space is set to Direct. Writes, and the result carries event_id for undo.

Inputs: page_id, version_id, block_id?
Returns: The changed record, with event_id for undo.
spring.page.update
Writes

Change a page body with 1 of replace_markdown, append_markdown, or block_edits (block ids from spring.page.get with_block_ids). From an agent it arrives as suggestions a person accepts, unless the space is set to Direct. Returns mode suggested or applied. Blocks beyond Markdown: :::callout {icon="bulb"} ... :::, :::toggle {title="..."} ... :::, :::columns holding 2 to 4 :::column ... ::: blocks, ::media{kind="image|video|audio|file" url="https://..." alt="..." caption="..."}, ::bookmark{url="..."}, ::embed{url="..."} (YouTube, Vimeo, Loom, Figma, Google Docs, Sheets and Slides, Miro, CodePen), ::toc, ::breadcrumb, ::record{ref="tsk_..."}, ::page{ref="pag_..."}, ::database{id="dbs_..."}, and @[Label](record_id) for a mention. Writes, and the result carries event_id for undo.

Inputs: page_id, replace_markdown?, append_markdown?, block_edits?
Returns: Returns mode suggested or applied.
spring.page.update_meta
Writes

Change page meta: title, icon (an emoji or a line icon name), description, slug, lock, and for public sites meta_title, meta_description, noindex and not_on_site. A new owner_id must be an active member and needs the current owner or a space admin, else needs_owner_or_admin. Send version to fail with conflict if someone changed it since you read it. Writes, and the result carries event_id for undo.

Inputs: page_id, title?, icon?, description?, owner_id?, slug?, locked?, meta_title?, meta_description?, noindex?, not_on_site?, version?
Returns: The changed record, with event_id for undo.
spring.page.verify
Writes

Mark a page verified for 30, 90, 180 or 365 days (90 by default). A human approval: an agent gets human_only and should use spring.page.request_verification. Writes, and the result carries event_id for undo.

Inputs: page_id, days?
Returns: The changed record, with event_id for undo.
spring.review.list

Pages that need review, for an owner (default: you) or a whole space for its admins, each with a reason: expired, expiring, flagged, unverified_read or owner_left. Read only.

Inputs: owner_id?, space_id?
Returns: The matching records.
spring.row.create
Writes

Add up to 100 rows. Each row is values keyed by field id or field name; selects take option names, relations take lists of record ids. With a view's filter, rows take its single values. A database holds 50,000 rows at most (limit_reached). template_id starts each row from a row template; values given win. Writes, and the result carries event_id for undo.

Inputs: database_id, rows, filter?, template_id?
Returns: The changed record, with event_id for undo.
spring.row.delete
Writes

Move up to 100 rows to the trash, as 1 batch. Returns deleted_at and restore_until. Writes, and the result carries event_id for undo.

Inputs: row_ids
Returns: Returns deleted_at and restore_until.
spring.row.get

A row: its values by field id and name, and its body as Markdown. Read only.

Inputs: row_id
Returns: The matching records.
spring.row.query

Rows of a database, or of a saved view with its filter and sorts, with values keyed by field id, plus total and next_cursor. A filter is {field, op, value} or {and: [...]} or {or: [...]}, 3 levels deep; selects and people take ids, and "me" and "today" work. Read only.

Inputs: database_id?, view_id?, filter?, sorts?, limit?, cursor?
Returns: The matching records.
spring.row.update
Writes

Change up to 100 rows. Values are keyed by field id or name; null clears a value. 1 batch for undo. For a linked database send database_id; source fields change the source record and local fields stay in Agos Docs. Writes, and the result carries event_id for undo.

Inputs: rows, database_id?
Returns: The changed record, with event_id for undo.
spring.search

Search Docs pages and rows the person can read. Narrow to a space, a type, or verified pages only. Read only.

Inputs: query, space_id?, type?, verified_only?, limit?
Returns: The matching records.
spring.site.analytics

Views per published page between 2 days, counted with no cookies. Read only.

Inputs: space_id, from, to
Returns: The matching records.
spring.site.get

A space site: its name, address, mode (public, unlisted, password or members), look and when it was last published. Null when the space is not a site. Read only.

Inputs: space_id
Returns: The matching records.
spring.site.publish
Writes

Ask for the site to be published. From an agent this never publishes by itself: it opens a publish request that a workspace admin approves, then the pages go out. Writes, and the result carries event_id for undo.

Inputs: space_id
Returns: The changed record, with event_id for undo.
spring.site.status

What Publish would do: each page with its address and state (new, changed, published, held for Not on site, or blocked because it is shared with fewer people than the space), and the pending count. Read only.

Inputs: space_id
Returns: The matching records.
spring.space.create
Writes

Create a space at the top or inside a space (5 levels at most). Private spaces are shared by hand. Writes, and the result carries event_id for undo.

Inputs: name, parent_id?, visibility?
Returns: The changed record, with event_id for undo.
spring.space.list

Spaces under a space, or the top spaces, with the person's role in each. Read only.

Inputs: parent_id?
Returns: The matching records.
spring.suggestion.list

Open suggestions on a page with author, block id, old text and new text. Read only.

Inputs: page_id
Returns: The matching records.
spring.suggestion.resolve
Writes

Accept or reject a person's suggestion. An agent's suggestion is accepted only by a person in the browser, so accepting one returns human_only. Writes, and the result carries event_id for undo.

Inputs: suggestion_id, action
Returns: The changed record, with event_id for undo.
spring.template.list

Templates for a space (its page templates plus the workspace ones) or a database (its row templates, with the default marked). Without scope_id, the workspace templates. Read only.

Inputs: scope_id?
Returns: The matching records.
spring.view.create
Writes

Add a view to a database: table, board, gallery, list, calendar or timeline, with optional filter, sorts, group and hidden fields. Everyone who can see the database sees it. Writes, and the result carries event_id for undo.

Inputs: database_id, name?, layout?, filters?, sorts?, group_by?, hidden_fields?, layout_options?
Returns: The changed record, with event_id for undo.
spring.view.list

The views of a database with their layout, filter, sorts, group, hidden fields and field order. Read only.

Inputs: database_id
Returns: The matching records.
spring.view.update
Writes

Change a view for everyone: layout, filter, sorts, group, hidden fields or layout options. Needs edit rights on the database. Writes, and the result carries event_id for undo.

Inputs: view_id, name?, layout?, filters?, sorts?, group_by?, hidden_fields?, layout_options?
Returns: The changed record, with event_id for undo.
Agos Projects 50 tools
channel.map.get

The project's map: steps (epics) left to right, slices (releases) top to bottom with their outcome and target date, and every card with its step, slice, status, owner and how clear it is to the team (lowest mark of 1 to 3, how many marked, and glow when it needs a conversation). Cards that glow need people to talk before work starts. Read only.

Inputs: project_id
Returns: The matching records.
channel.map.place
Writes

Move a card on the map: to a step (epic_id, null for no step), a slice (release_id, null for Later), and before another card (KEY-n or id, or leave it out for the end of the cell). Leaving epic_id or release_id out keeps the current one. One undo puts it back. Writes, and the result carries event_id for undo.

Inputs: task, epic_id?, release_id?, before?
Returns: The changed record, with event_id for undo.
channel.milestone.upsert
Writes

Add a milestone to a project, or change one with milestone_id. A billing milestone closes a billing unit; client_visible shows it on the client portal. Tasks join it through their milestone field. Writes, and the result carries event_id for undo.

Inputs: project_id, milestone_id?, name?, due_date?, state?, billing?, client_visible?
Returns: The changed record, with event_id for undo.
channel.my_work.get

The person's open tasks across projects (owner or assignee), in sections Overdue, Today, This week, Later and No date. count is Overdue plus Today. Read only.

Inputs: none
Returns: The matching records.
channel.my_work.plan
Writes

Put a task in the person's Today or This week without changing its due date; null clears the plan. Writes, and the result carries event_id for undo.

Inputs: task, to
Returns: The changed record, with event_id for undo.
channel.project.create
Writes

Create a project with a 2 to 6 letter key (task ids become KEY-1), a template (simple, software, requests, or a saved template id from channel.template.list) and an Agos Docs space for its docs. With deal_id, a won deal becomes the project: its company is the client, its owner the lead, and 1 undo removes it all. Writes, and the result carries event_id for undo.

Inputs: name, key, lead?, client_id?, deal_id?, template?, starts?, due?
Returns: The changed record, with event_id for undo.
channel.project.dates
Writes

Move a project's start or due date, as dragging its roadmap bar does. For the project lead and admins. Writes, and the result carries event_id for undo.

Inputs: project_id, starts?, due?
Returns: The changed record, with event_id for undo.
channel.project.health_override
Writes

The project lead sets health by hand with a note for 7 days, or clears it with level null. Writes, and the result carries event_id for undo.

Inputs: project_id, level, note?
Returns: The changed record, with event_id for undo.
channel.project.overview

A project in 1 call: health (On track, At risk or Off track) with its 5 signals and any override by the lead, shipped, blocked, people, hours, and what the client is waiting on and what we wait on. status_text is a client-safe update with no hours and only client-visible tasks. Read only.

Inputs: project_id, window?
Returns: The matching records.
channel.release.list

The project's releases (slices on the map) by target date, with state, outcome and version. Read only.

Inputs: project_id
Returns: The matching records.
channel.release.upsert
Writes

Add a release (a slice on the map) to a project, or change one with release_id. outcome says in a line what people can do once it ships. tasks (KEY-n or ids) replace the set of tasks in it. state released sets the released date to today and puts it on the Shipped card. notes can be written or pre-filled from the tasks. Writes, and the result carries event_id for undo.

Inputs: project_id, release_id?, name?, version?, target_date?, state?, notes?, outcome?, tasks?
Returns: The changed record, with event_id for undo.
channel.request.convert
Writes

Turn a request into a task in its project, client visible and linked back. The request moves to Accepted. Call again for more tasks. Writes, and the result carries event_id for undo.

Inputs: request_id, title?, description?, fields?
Returns: The changed record, with event_id for undo.
channel.request.create
Writes

File a client request in a project. It starts New with a first response and a resolution timer, counted in the project business hours. Returns the REQ-n id. Writes, and the result carries event_id for undo.

Inputs: project_id, title, description?, kind?, urgency?
Returns: Returns the REQ-n id.
channel.request.get

A request with its thread, tasks, and both timers with state (running, paused, warning, met or breached), due_at and remaining_minutes in business minutes. Read only.

Inputs: request_id
Returns: The matching records.
channel.request.list

The request queue of a project, or of every project you can see: New, Open, Waiting on client or Closed. Breached and warning timers come first, then urgency and age. Read only.

Inputs: project_id?, tab?
Returns: The matching records.
channel.request.reply
Writes

Reply on a request. A public reply shows in the client portal and meets the first response timer; internal true writes a note the client never sees. Writes, and the result carries event_id for undo.

Inputs: request_id, body, internal
Returns: The changed record, with event_id for undo.
channel.request.summary

Timer results for a project over the last 30 days: the share of requests that met each target, the median first response in business minutes, and open breaches. Read only.

Inputs: project_id
Returns: The matching records.
channel.request.update
Writes

Move a request or change its urgency. waiting_on_client pauses the resolution timer; declined needs a reason the client sees; a new urgency recalculates both targets from the start. Writes, and the result carries event_id for undo.

Inputs: request_id, status?, reason?, urgency?
Returns: The changed record, with event_id for undo.
channel.roadmap.get

Every project you can see with start and due dates, health, client, lead, milestones, releases and epics. Filter by client id ("internal" for none), lead, status or health. Read only.

Inputs: client?, lead?, state?, health?
Returns: The matching records.
channel.sprint.add_tasks
Writes

Put tasks (KEY-n or ids) in a sprint, or back in the backlog with sprint_id null. 1 batch for undo. Writes, and the result carries event_id for undo.

Inputs: sprint_id, tasks
Returns: The changed record, with event_id for undo.
channel.sprint.close
Writes

Complete the active sprint. Unfinished tasks move to carry_to: a future sprint id, "new" for a new sprint, or "backlog". The sprint becomes read only and gets its report. Writes, and the result carries event_id for undo.

Inputs: sprint_id, carry_to
Returns: The changed record, with event_id for undo.
channel.sprint.create
Writes

Add a future sprint. Its number and dates follow the last sprint and the project's sprint length unless given. Writes, and the result carries event_id for undo.

Inputs: project_id, name?, goal?, starts?, ends?
Returns: The changed record, with event_id for undo.
channel.sprint.days_off
Writes

Days a person is away during a sprint, which lowers their capacity. Agos People's leave replaces this once Agos People is installed. Writes, and the result carries event_id for undo.

Inputs: sprint_id, person_id, days
Returns: The changed record, with event_id for undo.
channel.sprint.list

The backlog: the active and future sprints with task count, estimate hours against capacity and each person's load, then the ranked tasks in no sprint. Read only.

Inputs: project_id
Returns: The matching records.
channel.sprint.report

A completed sprint: committed, completed, added and carried-over tasks with counts, the burndown by working day, median cycle time, and velocity over the last 6 sprints. Read only.

Inputs: sprint_id
Returns: The matching records.
channel.sprint.start
Writes

Start a future sprint. A project has 1 active sprint; the tasks in it now are what it committed to. Writes, and the result carries event_id for undo.

Inputs: sprint_id, name?, goal?, starts?, ends?
Returns: The changed record, with event_id for undo.
channel.task.attach_evidence
Writes

Attach proof to a task: a Test run (passed and failed counts), Screenshot, Pull request (url), Deploy (url), File (file_id) or Link (url). It shows in the Evidence section of the task. Writes, and the result carries event_id for undo.

Inputs: task, kind, title?, url?, passed?, failed?, file_id?, note?
Returns: The changed record, with event_id for undo.
channel.task.bulk_update
Writes

Set status, owner, priority, labels or sprint on many tasks at once. It is 1 batch: undo with batch_id reverses all of it, and a move rule failing on any task saves nothing. Writes, and the result carries event_id for undo.

Inputs: ids, status?, owner?, priority?, labels?, sprint?
Returns: The changed record, with event_id for undo.
channel.task.claim
Writes

Claim a task to work on it. The task moves to the first Started status and your square avatar joins its card. The claim lasts 60 minutes and each progress call renews it. A task held by another agent is refused with its name. Writes, and the result carries event_id for undo.

Inputs: task
Returns: The changed record, with event_id for undo.
channel.task.create
Writes

Create a task in a project, or a subtask under a task (epic, task, subtask is the deepest). Returns the KEY-n id. Writes, and the result carries event_id for undo.

Inputs: project_id?, parent_id?, title, status?, fields?, assignees?
Returns: Returns the KEY-n id.
channel.task.get

A task by KEY-n (like KAL-142) or id: all fields, its parent or epic, subtasks with progress, links and open blockers. Read only.

Inputs: task
Returns: The matching records.
channel.task.handoff
Writes

Hand a claimed task back with a summary and a checklist of what you did. The claim ends, the task moves to the review status, and your person gets an inbox row. Returns review_required; only a person can then move it to Done. Writes, and the result carries event_id for undo.

Inputs: task, summary, checklist?
Returns: Returns review_required; only a person can then move it to Done.
channel.task.link
Writes

Link 2 tasks (KEY-n or ids): blocks, blocked_by, relates_to or duplicates. A loop of blocks is refused. Returns both tasks' links. Writes, and the result carries event_id for undo.

Inputs: task, other, kind
Returns: Returns both tasks' links.
channel.task.move
Writes

Move a task to a status of its project's workflow. A move rule can block it: the error then carries data.blocked_by with the rule, the target and what is missing. Writes, and the result carries event_id for undo.

Inputs: id, status
Returns: The changed record, with event_id for undo.
channel.task.progress
Writes

Say what you are doing on a claimed task, in up to 280 characters, with an optional percent. The card shows the note. Notes sent within 10 s of the last one replace it. Writes, and the result carries event_id for undo.

Inputs: task, note, percent?
Returns: The changed record, with event_id for undo.
channel.task.reassign
Writes

Give a task to another person, as dragging it on Workload does. They become owner and an assignee. Writes, and the result carries event_id for undo.

Inputs: task, person_id
Returns: The changed record, with event_id for undo.
channel.task.release
Writes

End a claim without handing back, for example when you cannot finish. Your person or a project admin can also release it. Writes, and the result carries event_id for undo.

Inputs: task
Returns: The changed record, with event_id for undo.
channel.task.search

Tasks of a project at any depth, filtered by text, status keys, owners, priority, type or labels. assignee "me" (or a person id) keeps tasks owned by or assigned to that person, and status_category keeps not_started, started, done or cancelled. Each has display_id like KAL-142. Read only.

Inputs: project_id, q?, status?, owner?, priority?, kind?, labels?, assignee?, status_category?, limit?
Returns: The matching records.
channel.task.update
Writes

Change a task: title, fields, status, or parent (an epic or task in the same project, KEY-n or id). done true ticks it into the project's first Done status, false back to the first Not started. Nesting stops at epic, task, subtask. start_date and due_date move it on the timeline; when the project moves dependent tasks, moved lists every task whose dates changed. Writes, and the result carries event_id for undo.

Inputs: task, title?, status?, parent?, done?, fields?, version?, start_date?, due_date?
Returns: The changed record, with event_id for undo.
channel.template.list

Project templates: the 3 built-in workflows and the saved templates, with how many starter tasks each holds. Read only.

Inputs: none
Returns: The matching records.
channel.template.save
Writes

Save a project's workflow, move rules, settings, task tree and milestones as a template. People, hours, clients and dates stay out; dates become days from the start. Writes, and the result carries event_id for undo.

Inputs: project_id, name, description?
Returns: The changed record, with event_id for undo.
channel.time.list

Time entries: on 1 task with its total, or a feed by project, person, dates and updated_since (deleted entries come back with deleted true). Agos Finance and Agos People read this. Read only.

Inputs: task?, project_id?, person_id?, from?, to?, updated_since?, limit?
Returns: The matching records.
channel.time.log
Writes

Log time for the person (never for the agent itself). duration takes '1h 30m', '1.5' (hours) or '90m', or a number of minutes. A task is optional; a project is required without one. Writes, and the result carries event_id for undo.

Inputs: task?, project_id?, duration, date?, note?, billable?
Returns: The changed record, with event_id for undo.
channel.time.start
Writes

Start the person's timer on a task (KEY-n or id). 1 timer per person: a running one stops and is logged first. Writes, and the result carries event_id for undo.

Inputs: task
Returns: The changed record, with event_id for undo.
channel.time.stop
Writes

Stop the running timer and log its time, rounded to the minute. Past 10 hours it returns conflict until confirm_minutes is sent. Writes, and the result carries event_id for undo.

Inputs: confirm_minutes?
Returns: The changed record, with event_id for undo.
channel.time.timer

The person's running timer, if any, with the task and elapsed minutes. Read only.

Inputs: none
Returns: The matching records.
channel.view.save
Writes

Save the project's list as a named view, private or shared with the project. Writes, and the result carries event_id for undo.

Inputs: project, name, shared, filters?, sort?, group?, columns?
Returns: The changed record, with event_id for undo.
channel.workflow.get

A project's statuses in order with their categories, and its move rules. Read only.

Inputs: project_id
Returns: The matching records.
channel.workflow.update
Writes

Replace a project's statuses. Keep 1 Not started and 1 Done. Removing a status that holds tasks needs move_to: {removed_key: target_key}. Writes, and the result carries event_id for undo.

Inputs: project_id, statuses, move_to?, move_rules?
Returns: The changed record, with event_id for undo.
channel.workload.get

People by week: hours assigned from open task estimates spread over working days, against capacity less leave and holidays, with pct and the tasks behind each cell. Tasks with no due date or estimate are listed as unscheduled. Read only.

Inputs: from?, weeks?, project_id?, team_id?
Returns: The matching records.
Agos CRM 75 tools
harbor.activity.list

Activities on a deal, or about a contact or company, newest first: kind, subject, body, when, minutes, outcome and who logged it. Read only.

Inputs: record_id, limit?
Returns: The matching records.
harbor.activity.log
Writes

Log a call, meeting, note or email on a deal, contacts or a company. duration is minutes. Logging on a deal resets its rot clock. private: true keeps it to you. Writes, and the result carries event_id for undo.

Inputs: kind, deal_id?, contact_ids?, company_id?, subject?, body?, started_at?, duration?, outcome?, direction?, private?
Returns: The changed record, with event_id for undo.
harbor.booking.create
Writes

Book a slot for someone: makes the meeting on their open deal, a contact if the email is new, the event on the host calendar, and mails them a confirmation. start is a slot start from harbor.booking.slots. An agent gets needs_person, since this mails someone outside; share the page link instead. Writes, and the result carries event_id for undo.

Inputs: page_id, start, name, email, answers?
Returns: The changed record, with event_id for undo.
harbor.booking.list

Booking pages with their public address (/b/<slug>), hosts, length, whether they are live, and how many meetings each booked. Read only.

Inputs: none
Returns: The matching records.
harbor.booking.slots

Free slots on a booking page between 2 days (YYYY-MM-DD, in the page time zone), as start and end instants in UTC. Slots honour working hours, buffers, minimum notice, the booking window and the hosts' calendars. Read only.

Inputs: page_id, from?, to?
Returns: The matching records.
harbor.campaign.build
Writes

Put the audience on a draft campaign: each new person gets their owner (the contact's, else the company's, else whoever knows them) and a case study; people no longer in the audience come off. Returns who was left out and why (no email, unsubscribed, bounced, in another running sequence). Writes, and the result carries event_id for undo.

Inputs: campaign_id
Returns: Returns who was left out and why (no email, unsubscribed, bounced, in another running sequence).
harbor.campaign.create
Writes

Make a draft campaign: who it goes to (company status such as Former client, optional industries, or a list of contacts), which sequence sends, and whether each person gets the case study that best matches their company (match) or 1 for everyone (fixed). Nothing sends until a person approves it. Writes, and the result carries event_id for undo.

Inputs: name, description?, sequence_id, audience, case_rule?, case_study_id?
Returns: The changed record, with event_id for undo.
harbor.campaign.get

1 campaign in full: its sequence steps, approval, counts, every person on it (company, owner, case study, personal line and who wrote it, step, sent, opened, case study reads, replied, what it waits on), the send log, and what blocks approval while it is a draft. Merge fields the steps can use: {{enrolment.personal_line}}, {{case_study.title}}, {{case_study.client}}, {{case_study.link}}, {{case_study.result}}, and {{case_study.card}} (the case study as a card: logo, picture, result line and the tracked link, on its own line). Read only.

Inputs: campaign_id
Returns: The matching records.
harbor.campaign.list

Campaigns with their state (draft, waiting for approval, sending, paused, done) and how many people are on each, reached, read a case study and replied. Read only.

Inputs: none
Returns: The matching records.
harbor.campaign.request_approval
Writes

Freeze a ready draft campaign and ask for its approval. Refused with the list of what is missing (personal lines, case studies, a sequence that is off, mailboxes not connected). Only a person approves, in Agos CRM; the approval starts the sends. Writes, and the result carries event_id for undo.

Inputs: campaign_id
Returns: The changed record, with event_id for undo.
harbor.campaign.set_case_study
Writes

Change which case study 1 person on a draft campaign gets. Writes, and the result carries event_id for undo.

Inputs: enrolment_id, case_study_id
Returns: The changed record, with event_id for undo.
harbor.campaign.set_line
Writes

Write the personal line for 1 person on a draft campaign, filled into {{enrolment.personal_line}}. 1 or 2 sentences that only make sense for them, from what we did together or what they wrote. Empty clears it. Marked as agent work and shown to the approver. Writes, and the result carries event_id for undo.

Inputs: enrolment_id, line
Returns: The changed record, with event_id for undo.
harbor.campaign.update
Writes

Change a draft campaign. Build it again after changing the audience. Writes, and the result carries event_id for undo.

Inputs: campaign_id, name?, description?, sequence_id?, audience?, case_rule?, case_study_id?
Returns: The changed record, with event_id for undo.
harbor.case_study.link_for

The tracked link to 1 case study for 1 contact. Put it in an email; when they read it for 5 seconds or more, the read shows on the contact with time and scroll depth and adds to their score. Read only.

Inputs: case_study_id, contact_id
Returns: The matching records.
harbor.case_study.list

Published case studies: title, client, industry, services, challenge, solution, impact and the page on the website. Read only.

Inputs: none
Returns: The matching records.
harbor.case_study.match

Case studies to send a contact or company, best first, with the reasons: same industry, a close industry, then the same kind of work we did for them. Their own case study is left out. industry is the one the match used, from the company or its own case study. Read only.

Inputs: record_id, limit?
Returns: The matching records.
harbor.company.create
Writes

Create a company. A company with the same registrable domain (kalaw.com.ph from www.shop.kalaw.com.ph) is returned instead, with existing: true. Writes, and the result carries event_id for undo.

Inputs: name, domain?, industry?, fields?
Returns: The changed record, with event_id for undo.
harbor.contact.create
Writes

Create a contact (a person outside the workspace). A contact with the same email, in any case, is returned instead, with existing: true. The email domain links the contact to a known company. Writes, and the result carries event_id for undo.

Inputs: name, email?, phone?, job_title?, company_id?, fields?
Returns: The changed record, with event_id for undo.
harbor.contact.get

A contact with its company, deals, score and score_reasons (the rules that produced the score), and consent log. Read only.

Inputs: contact_id
Returns: The matching records.
harbor.crew.queue

What is waiting for a sales agent: contacts added in the last 14 days with no research note, campaign members in draft campaigns with no personal line, senders nobody has sorted, and open reviews. latest is the newest time in the list. Read only.

Inputs: days?
Returns: The matching records.
harbor.deal.convert_to_project
Writes

Turn a won deal into a project: the company as client, the signed quote total as budget, 1 billing phase per line item, the signed PDF, a brief page, and the contacts in invite as portal guests. A deal converts once; calling again returns its project. Writes, and the result carries event_id for undo.

Inputs: deal_id, key, name?, template?, lead?, starts?, invite?
Returns: The changed record, with event_id for undo.
harbor.deal.create
Writes

Create a deal with its company and contact in 1 call. Pass company or contact inline to make them, or their ids. A company that shares the domain, or a contact that shares the email, is reused, never duplicated. Amount is in major units, such as 180000 for PHP 180,000. Returns all 3 ids. A first stage that needs a company refuses a deal without one. Writes, and the result carries event_id for undo.

Inputs: name, company_id?, company?, contact_id?, contact?, amount?, currency?, close_date?, pipeline_id?, stage?, owner?, fields?
Returns: Returns all 3 ids.
harbor.deal.gap
Writes

Write the gap on a deal: where the client is now (current_state), where they want to be (future_state), and the problems between, each with what it costs the client a year in major units, such as 600000 for PHP 600,000, and an optional root cause. Proposal sent needs a current state and at least 1 problem. Your problems show as yours until someone edits them. Returns the gap with the yearly total and payback months. Writes, and the result carries event_id for undo.

Inputs: deal_id, current_state?, future_state?, add_problems?, update_problems?, remove_problems?
Returns: Returns the gap with the yearly total and payback months.
harbor.deal.get

A deal with its fields, stage, company, contacts with their roles, the gap (current state, future state, problems with yearly cost in minor units and who wrote each, yearly total and payback months), and the stages of its pipeline with what each needs. Read only.

Inputs: deal_id
Returns: The matching records.
harbor.deal.list

Deals as the pipeline board shows them for the same filters: stage, amount in minor units, company, next step, owner, last activity, the rotting pill and the gap (current state, future state, problems with yearly cost, yearly total and payback months), plus per-stage counts and totals and the number block. owner takes a person id or "me"; rotting: true lists only deals past their stage rot days; no_gap: true lists deals with no problem yet. Biggest deals come first, as on the screens (amounts compare inside 1 currency, no amount last); sort: "board" keeps the board's own order, "gap" puts the biggest yearly gap first. Read only.

Inputs: pipeline_id?, owner?, team?, close_from?, close_to?, amount_min?, amount_max?, rotting?, q?, stages?, limit?, no_gap?, sort?
Returns: The matching records.
harbor.deal.move
Writes

Move a deal to a stage. When the stage needs fields the deal lacks, the call fails with data.missing_fields (keys such as amount, close_date, contact, signer, quote_sent); send them in fields and call again. company, contact and signer come from links and roles, not fields. Writes, and the result carries event_id for undo.

Inputs: deal_id, stage, fields?
Returns: The changed record, with event_id for undo.
harbor.deal.set_contact
Writes

Add a contact to a deal, with a role (signer, champion, user or blocker) or none. The Negotiation stage needs a signer. Writes, and the result carries event_id for undo.

Inputs: deal_id, contact_id, role?
Returns: The changed record, with event_id for undo.
harbor.duplicates.list

Likely duplicate contacts and companies from the nightly check, each pair with its rule: phone (same number), name_company (same name at the same company) or company_name (same name without Inc, Corp and the like). refresh: true runs the check now. Read only.

Inputs: refresh?
Returns: The matching records.
harbor.email.draft
Writes

Draft an email to contacts, linked to a deal. Nothing is sent: the draft waits on the deal with Approve and Edit for your person, who gets 1 notification. Merge fields such as {{contact.first_name}} are filled when they send. Use harbor.template.render first to start from a template. Writes, and the result carries event_id for undo.

Inputs: contact_ids, deal_id?, subject, body, cc?, template_id?
Returns: The changed record, with event_id for undo.
harbor.email.get

An email activity: subject, body, from, to, status (waiting, queued, sent, cancelled, failed), opens and clicks. Opens reported by a mail privacy proxy are counted apart in proxy_opens. Read only.

Inputs: activity_id
Returns: The matching records.
harbor.email.send
Writes

Send an email from your own connected mailbox. It leaves after 10 seconds, so harbor.email.undo can stop it. An agent gets the error needs_person: agents draft with harbor.email.draft and the person sends. A missing merge value fails with data.missing_fields. Writes, and the result carries event_id for undo.

Inputs: contact_ids, deal_id?, subject, body, cc?, template_id?, track?
Returns: The changed record, with event_id for undo.
harbor.email.undo
Writes

Stop an email you sent in the last 10 seconds. After that it has gone. Writes, and the result carries event_id for undo.

Inputs: activity_id
Returns: The changed record, with event_id for undo.
harbor.forecast.get

Forecast against target for a quarter (such as 2026-Q4), per owner: target, closed, commit, best case, pipeline, forecast and gap in minor units, with the deal ids behind each cell. Forecast is won plus commit plus best case times stage probability. Read only.

Inputs: quarter?, pipeline_id?
Returns: The matching records.
harbor.form.submissions

The latest submissions of a lead form: when, the contact, the deal it made, and the values sent. Read only.

Inputs: form_id, limit?
Returns: The matching records.
harbor.insight.queue

The open deals whose facts changed since their last insight, as short digests, steps handed to you first (ask). scope mine (default) is your person's deals, the unowned ones and any they handed you; team is every deal, for a crew that clears the whole pipeline. Read them, then call harbor.insight.write once for the batch, passing each digest's v. For an ask of kind email, also draft it with harbor.email.draft so it waits for the person to send. A digest with flags meets another person's work: a shared contact or company, a contact in someone's sequence, a step with someone else's AI, or a deal your person does not own. Do each flag's do straight away and keep going on the rest; then put the flags' questions to your person one at a time, your recommended answer first, and act on the answer. Never email a flagged contact before your person answers. Returns deals, how many are waiting in all, how many are flagged, and a token estimate. Read only.

Inputs: limit?, scope?
Returns: Returns deals, how many are waiting in all, how many are flagged, and a token estimate.
harbor.insight.write
Writes

Write insights for up to 50 deals in one call: likelihood to close (0 to 100), why in one line, where the deal can improve, and the next step with its kind. Set ask_done once you have drafted a step the person handed you. Each insight shows as yours and anyone can overwrite it. ask_done clears only a step your own person handed you. An item can come back with flags (the deal changed after you read it, or you replaced a likelihood a person set by hand): the write stands; put the question to your person. An item that cannot be written comes back with error and the rest are still written. Writes, and the result carries event_id for undo.

Inputs: items
Returns: The changed record, with event_id for undo.
harbor.lead.assign
Writes

Give a contact an owner: whoever here knows them best, then their company's owner, then whoever took the fewest new leads this week. pool limits the choice to those people. A contact that has an owner keeps them unless keep_owner is false. The new owner is told. Writes, and the result carries event_id for undo.

Inputs: contact_id, pool?, keep_owner?
Returns: The changed record, with event_id for undo.
harbor.mailbox.status

Whether your mailbox is connected, its address, provider, last sync and how many emails it logged, plus which providers this workspace can connect. Never returns tokens. Connecting needs a person in the browser: CRM settings, Mailbox. Read only.

Inputs: none
Returns: The matching records.
harbor.match

Companies and contacts that match a name, domain or email, to check before creating one. Read only.

Inputs: q
Returns: The matching records.
harbor.pipeline.create
Writes

Create a deal pipeline, with the default stages unless stages are given. Every pipeline keeps a won and a lost stage. Writes, and the result carries event_id for undo.

Inputs: name, stages?, currency?
Returns: The changed record, with event_id for undo.
harbor.pipeline.list

Deal pipelines with their stages in order: key, label, probability, kind (open, won, lost), rot days, required fields and gate. Read only.

Inputs: none
Returns: The matching records.
harbor.pipeline.update
Writes

Rename a pipeline or change its stages. Renaming a stage label keeps its deals; removing a stage that holds deals needs moves, from the removed key to the stage they go to. Writes, and the result carries event_id for undo.

Inputs: pipeline_id, name?, stages?, moves?
Returns: The changed record, with event_id for undo.
harbor.product.create
Writes

Add a product to the product list, with a default price in major units. Writes, and the result carries event_id for undo.

Inputs: name, sku?, description?, unit?, price?, currency?
Returns: The changed record, with event_id for undo.
harbor.product.list

Active products with their price for a currency (price book first, then the product price), in minor units. Read only.

Inputs: currency?
Returns: The matching records.
harbor.quote.create
Writes

Make a quote on a deal from a Docs template (template_id) or the default body. Deal and company merge fields fill now; {{quote.line_items}} and {{quote.total}} stay live. Prices are major units. Returns the quote with its number and totals. Writes, and the result carries event_id for undo.

Inputs: deal_id, template_id?, title?, currency?, valid_until?, terms?, lines?
Returns: Returns the quote with its number and totals.
harbor.quote.get

A quote with its status, version, lines, totals, signers and their status, views, and the body with live fields filled, as Markdown. Read only.

Inputs: quote_id
Returns: The matching records.
harbor.quote.request_approval
Writes

Send a draft for approval. Under the rule (by default PHP 1M and 10% discount) it approves at once; above it a core gate opens for the sales lead, who gives the verdict with the gate tools. An agent may pre-fill the checklist. Writes, and the result carries event_id for undo.

Inputs: quote_id
Returns: The changed record, with event_id for undo.
harbor.quote.send
Writes

Email each signer their own signing link. The quote must be approved and its valid-until date not passed. Writes, and the result carries event_id for undo.

Inputs: quote_id
Returns: The changed record, with event_id for undo.
harbor.quote.update
Writes

Change a draft quote: lines replace the list, totals recompute. Editing an approved quote returns it to draft; editing a sent one makes the next version, returned as the record. A quote in approval or signed cannot change. Writes, and the result carries event_id for undo.

Inputs: quote_id, title?, valid_until?, terms?, body_md?, discount_pct?, tax_pct?, require_code?, signers?, lines?
Returns: The changed record, with event_id for undo.
harbor.quote.void
Writes

Void a quote with a reason. Only an admin voids a signed one. Writes, and the result carries event_id for undo.

Inputs: quote_id, reason
Returns: The changed record, with event_id for undo.
harbor.record.merge
Writes

Merge 2 contacts or 2 companies. Links, deals, activities and emails move to the survivor; take_from_merged lists fields where the merged record wins. The old id forwards. Only a person with team scope or wider merges; undo with harbor.record.unmerge within 30 days. Writes, and the result carries event_id for undo.

Inputs: survivor_id, merged_id, take_from_merged?
Returns: The changed record, with event_id for undo.
harbor.record.merge_preview

The fields of 2 contacts or 2 companies side by side, and which differ, before a merge. Read only.

Inputs: a, b
Returns: The matching records.
harbor.record.unmerge
Writes

Undo a merge within 30 days: both records return with their own links. Writes, and the result carries event_id for undo.

Inputs: merged_id
Returns: The changed record, with event_id for undo.
harbor.research.save
Writes

Save what you found about a contact (past work with us, their role, what they care about) as a comment starting "Research:". It takes the contact off the research list. Marked as agent work. Writes, and the result carries event_id for undo.

Inputs: contact_id, note
Returns: The changed record, with event_id for undo.
harbor.review.done
Writes

Close a review. An agent gets needs_person: the person closes their own reviews. Writes, and the result carries event_id for undo.

Inputs: activity_id, note?
Returns: The changed record, with event_id for undo.
harbor.review.list

Open reviews for a person (default yours): the contact and why it needs a look. Read only.

Inputs: person_id?
Returns: The matching records.
harbor.review.request
Writes

Ask a person to look at a contact before anything else happens, such as a reply that does not fit the script. It goes on their Today list under To review and they are told. 1 open review per contact; a second reason joins the first. Writes, and the result carries event_id for undo.

Inputs: contact_id, why, for_person?
Returns: The changed record, with event_id for undo.
harbor.scoring.get

The lead scoring rules (fit rules on contact or company fields, event rules with points that halve every 30 days) and the sales-qualified threshold. Read only.

Inputs: none
Returns: The matching records.
harbor.sequence.enrol
Writes

Enrol contacts in an active sequence; email goes from your own mailbox inside the send window. Contacts who unsubscribed or bounced, have no email, or sit in another sequence are refused and listed in refused with the reason. A contact in 1 active sequence at a time. An agent gets needs_person, since enrolling mails people outside. Writes, and the result carries event_id for undo.

Inputs: sequence_id, contact_ids, deal_id?
Returns: The changed record, with event_id for undo.
harbor.sequence.enrolments

Who is in a sequence: state, current step, when the next step runs, what it waits on (such as the daily limit), how many emails went, and the stop reason (replied, booked, unsubscribed, bounced, deal closed, stopped by hand). Read only.

Inputs: sequence_id
Returns: The matching records.
harbor.sequence.list

Sequences with their steps (automatic email, manual email, call, task, each with a delay in days), send window, state and how many contacts are active in each. Read only.

Inputs: none
Returns: The matching records.
harbor.sequence.stop
Writes

Stop 1 enrolment. Its waiting drafts and to-dos are removed and the stop reason is manual. Writes, and the result carries event_id for undo.

Inputs: enrolment_id
Returns: The changed record, with event_id for undo.
harbor.suggestion.classify
Writes

Sort a suggested sender. lead makes them a contact owned by that mailbox's person and logs their email, which runs the new lead rules (score, owner, reply). not_lead and known leave the suggestion for the person to dismiss, with your verdict and reason shown next to it. Marked as agent work. Writes, and the result carries event_id for undo.

Inputs: mailbox_id, email, kind, why
Returns: The changed record, with event_id for undo.
harbor.suggestion.list

New outside senders in people's mailboxes who are not contacts yet, newest first: sender, subject, date, whose mailbox, and any verdict already given. The message text comes back only for your own person's mailbox; for anyone else's it is null. Read only.

Inputs: limit?
Returns: The matching records.
harbor.target.set
Writes

Set 1 owner target for a quarter in major units, such as 12000000 for PHP 12M. Team and company targets are the sums. Writes, and the result carries event_id for undo.

Inputs: quarter, owner, amount, currency?
Returns: The changed record, with event_id for undo.
harbor.task.create
Writes

Put a to-do about a contact on a person's Today list, by default the contact's owner. due_days counts from today. Writes, and the result carries event_id for undo.

Inputs: contact_id, text, due_days?, for_person?
Returns: The changed record, with event_id for undo.
harbor.template.list

Email templates and snippets you can use, with folder, subject, body and how often each was sent, opened and replied to. Read only.

Inputs: kind?
Returns: The matching records.
harbor.template.render

A template with its merge fields filled for a contact and deal, plus the fields that have no value. A send with a missing field is refused, so fill them or edit the text first. Read only.

Inputs: template_id, contact_id?, deal_id?
Returns: The matching records.
harbor.ticket.apply_macro
Writes

Run a macro on a ticket: priority, assignee and tags change now; the reply text comes back with merge fields filled, with the status to send it with. Nothing is sent; use harbor.ticket.reply. Writes, and the result carries event_id for undo.

Inputs: ticket_id, macro_id
Returns: The changed record, with event_id for undo.
harbor.ticket.create
Writes

Open a ticket for a requester, by contact id or email; an unknown email becomes a contact. It gets the next number, the queue assignee by rule, and SLA clocks from the first matching policy. Writes, and the result carries event_id for undo.

Inputs: subject, body, email?, contact_id?, name?, priority?, queue_id?
Returns: The changed record, with event_id for undo.
harbor.ticket.get

A ticket with its thread: public replies and internal notes in order, each marked public or not, plus requester, company, status and the SLA clock. Read only.

Inputs: ticket_id
Returns: The matching records.
harbor.ticket.list

Support tickets, newest first: number such as T-1042, subject, requester, company, status, priority, assignee and the time-left pill. status active (the default) means not solved. sla at_risk lists tickets with under 25% of their target left; breached lists late ones. assignee takes a person id or "me". Read only.

Inputs: queue_id?, status?, assignee?, sla?, q?, limit?
Returns: The matching records.
harbor.ticket.reply
Writes

Reply on a ticket. public: false adds an internal note the customer never sees. A public reply from an agent waits as a draft for its person (status waiting_for_person). A public reply after someone else answered since last_seen fails with conflict and their reply in data; pass confirm: true to send anyway. Writes, and the result carries event_id for undo.

Inputs: ticket_id, body, public, status?, last_seen?, confirm?
Returns: The changed record, with event_id for undo.
harbor.ticket.update
Writes

Change a ticket. waiting pauses the resolution clock, open resumes it, solved stops it and mails the customer the rating question. A new priority takes that priority's targets. Writes, and the result carries event_id for undo.

Inputs: ticket_id, status?, priority?, assignee?, tags?, queue_id?
Returns: The changed record, with event_id for undo.
harbor.today

Your Today list: drafts waiting for you to send (from your agent or a sequence) and open to-dos such as sequence calls, each with its deal. Read only.

Inputs: none
Returns: The matching records.
Every app 30 tools
automations_list

Automation rules you can see. Rules are built in the browser. Read only.

Inputs: none
Returns: The matching records.
batch
Writes

Up to 100 create, update or link operations under 1 batch_id, so 1 undo reverses them all. Writes, and the result carries event_id for undo.

Inputs: operations
Returns: The changed record, with event_id for undo.
comment
Writes

Comment on a record in Markdown. Mention a person with @[Name](per_...) and a record with #[Title](id). Writes, and the result carries event_id for undo.

Inputs: record_id, body, reply_to?
Returns: The changed record, with event_id for undo.
create
Writes

Create a record of any type. Call types_list for type keys and type_get for fields and states. Writes, and the result carries event_id for undo.

Inputs: type, title, fields?, parent_id?, state?
Returns: The changed record, with event_id for undo.
delete
Writes

Move a record and everything under it to the trash for 30 days. Writes, and the result carries event_id for undo.

Inputs: id
Returns: The changed record, with event_id for undo.
digest

Call this first in every session. What the person you act for owns across every app that is overdue, waiting on them, out of date or stale, plus setup only they can do. Each item names them and carries ask, one short question to put to them, and key for digest_pause. paused lists what they set aside, with their note; do not bring those up. Read only.

Inputs: none
Returns: The matching records.
digest_pause
Writes

When the person says to leave a digest item, pause it with a short note in their words. It stays out of the digest for days (default 7) or until the thing behind it changes. Writes only to their digest, not to any record.

Inputs: key, note, days?
Returns: The changed record, with event_id for undo.
digest_resume
Writes

Bring a paused digest item back before its pause ends. Writes only to their digest, not to any record.

Inputs: key
Returns: The changed record, with event_id for undo.
file_upload
Writes

Start a file upload. Returns a signed URL that lasts 5 minutes; PUT the bytes to it. Writes, and the result carries event_id for undo.

Inputs: name, size, attach_to, mime?
Returns: Returns a signed URL that lasts 5 minutes; PUT the bytes to it.
gate_get

A gate with its rubric, approvers and status. Read only.

Inputs: id
Returns: The matching records.
gate_prefill
Writes

Pre-fill rubric items on a gate. A person gives the verdict in the browser; no tool can. Writes, and the result carries event_id for undo.

Inputs: id, items
Returns: The changed record, with event_id for undo.
gate_request
Writes

Open a gate on a record. Kinds include core.signoff. Writes, and the result carries event_id for undo.

Inputs: kind, subject_id
Returns: The changed record, with event_id for undo.
get

Get 1 record by id, optionally with its links, comments and history. Read only.

Inputs: id, include?
Returns: The matching records.
history

Change history for a record, a person, or a batch. Read only.

Inputs: record_id?, actor?, batch_id?, since?
Returns: The matching records.
import_report

The diff or verify report for 1 import run. Read only.

Inputs: id
Returns: The matching records.
imports_list

Import runs with status and counts. Imports are started in the browser. Read only.

Inputs: none
Returns: The matching records.
inbox_list

Your inbox items. Read only.

Inputs: state?
Returns: The matching records.
inbox_mark
Writes

Mark an inbox item done or snoozed. Writes, and the result carries event_id for undo.

Inputs: id, state
Returns: The changed record, with event_id for undo.
link
Writes

Link 2 records. Kinds: relates, parent, mentions, assignee, owner, member, about, source, blocks, won_from. Writes, and the result carries event_id for undo.

Inputs: from_id, to_id, kind
Returns: The changed record, with event_id for undo.
rules_list

Rules people in this workspace set for agents, nearest first: for a record, its project, space, model or channel, then the whole workspace. Follow them over your own judgment. Read only.

Inputs: app?, record_id?
Returns: The matching records.
search

Search titles, text, doc bodies and comments across all apps. Returns id, type, title, snippet and url per hit. Read only.

Inputs: q, types?, filters?, limit?
Returns: Returns id, type, title, snippet and url per hit.
share
Writes

Share 1 record with a person, a team or the workspace. Agents cannot share by link. Writes, and the result carries event_id for undo.

Inputs: record_id, to, level
Returns: The changed record, with event_id for undo.
type_get

Fields, states and link kinds for 1 type, custom fields included. Read only.

Inputs: key
Returns: The matching records.
types_list

Every record type you can see, with its app. Read only.

Inputs: none
Returns: The matching records.
undo
Writes

Undo 1 change or a whole batch for 30 days. If a field changed again since, returns conflict with both values; call again with pick. Writes, and the result carries event_id for undo.

Inputs: event_id?, batch_id?, pick?
Returns: The changed record, with event_id for undo.
unlink
Writes

Remove a link by its id. Writes, and the result carries event_id for undo.

Inputs: id
Returns: The changed record, with event_id for undo.
update
Writes

Change a record. Send version to fail with conflict if someone changed it since you read it. A field set to null is cleared. Writes, and the result carries event_id for undo.

Inputs: id, title?, fields?, state?, version?
Returns: The changed record, with event_id for undo.
view_run

Rows of a saved view, with a cursor for the next page. Read only.

Inputs: id, cursor?, limit?
Returns: The matching records.
views_list

Saved views you can open, optionally for 1 type. Read only.

Inputs: type?
Returns: The matching records.
whoami

Who you are acting for: the person, workspace, session, app access and granted scopes. Read only.

Inputs: none
Returns: The matching records.