CRM records MCP tools
Use this reference to find a tool and its inputs. Connect an MCP client before calling tools. Tool visibility depends on discovery and permissions.
For actions that send messages, spend credits, delete data, or start execution, review the intended records and confirm the action before proceeding. Obtain IDs from a prior result; do not invent them. A registered tool does not guarantee that its supporting service is available in every organization.
g8_add_to_list
Add contacts to an existing list, by id or by explicit records. Source modes (exactly one required): - contact_ids: list[int] - attach existing CRM contacts (free). - rows: list[dict] - import explicit records into the list (free; no enrichment credits). Accepted fields per row: first_name, last_name, work_email, job_title, company_domain, seniority_level, linkedin_url, city, state, country, personal_emails, direct_phone, mobile_phone, job_department. Searching by filters and merging into an existing list is not supported here in v1 - use g8_create_list(filters=…) to create a new list instead, or call g8_find_contacts and forward the result as
rows. Whenrowsis supplied, call withdry_run=Truefirst to get a ConfirmationPreview, then re-call withdry_run=Falseto execute. Args: list_id: Target list id (from g8_create_list or g8_get_lists). contact_ids: Optional CRM contact ids to attach to the list. rows: Optional list of record dicts to import into the list. dry_run: When True, return a ConfirmationPreview instead of executing.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
list_id | Yes | integer | See the schema below for constraints and defaults. |
contact_ids | No | array / null | See the schema below for constraints and defaults. |
rows | No | array / null | See the schema below for constraints and defaults. |
dry_run | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "list_id": { "title": "List Id", "type": "integer" }, "contact_ids": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Contact Ids" }, "rows": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Rows" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" } }, "required": [ "list_id" ], "title": "g8_add_to_listArguments", "type": "object"}g8_add_to_sequence
Add contacts to an outbound sequence for automated outreach. IMPORTANT: This enrolls real contacts into an active sequence that will send emails/messages. Always confirm with the user before calling this tool. Recommended flow: call with
dry_run=Truefirst to render a confirmation widget, then again withdry_run=Falseafter the user confirms. Use g8_list_sequences to find available sequence IDs. Contacts must exist in your CRM with a contact_id. If they came from prospecting (g8_lookup_person / g8_find_contacts), create them first with g8_create_contact. Args: sequence_id: Sequence ID (from g8_list_sequences) contact_ids: List of contact IDs to enroll list_id: Contact list ID the contacts belong to dry_run: When True, return a confirmation preview instead of executing.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | See the schema below for constraints and defaults. |
contact_ids | Yes | array | See the schema below for constraints and defaults. |
list_id | Yes | integer | See the schema below for constraints and defaults. |
dry_run | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "title": "Sequence Id", "type": "string" }, "contact_ids": { "items": { "type": "integer" }, "title": "Contact Ids", "type": "array" }, "list_id": { "title": "List Id", "type": "integer" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" } }, "required": [ "sequence_id", "contact_ids", "list_id" ], "title": "g8_add_to_sequenceArguments", "type": "object"}g8_analytics_get_campaign_visitors
Read one graph8 analytics report. Uses the current organization and existing API permissions.
reportselects which report to read. Defaults tocampaign-visitors, which is the Campaign Visitors report (click steps, email-link engagement and CTR, top contacts) this tool has always returned. Available reports: Campaign visitors: campaign-visitors Acquisition (where traffic comes from): acquisition/campaigns, acquisition/channels, acquisition/channels/trend, acquisition/referrals, acquisition/search, acquisition/social, acquisition/sources Audience (who the visitors are): audience/behavior, audience/demographics, audience/geo, audience/geo/cities, audience/languages, audience/overview, audience/technology, audience/trend Behavior (what they do on site): behavior/events, behavior/exit-pages, behavior/landing-pages, behavior/page-metrics, behavior/pages Conversions (forms, goals, funnel): conversions/forms, conversions/forms/analysis, conversions/forms/trend, conversions/funnel, conversions/goals, conversions/goals/trend, conversions/rate Dialer (call volume, quality, grading): dialer/grading/search, dialer/leaderboard, dialer/leaderboard/sdr, dialer/performance, dialer/quality, dialer/quality/leaderboard Engagement (depth and time on site): engagement/by-campaign, engagement/by-channel, engagement/by-landing-page, engagement/depth-distribution, engagement/overview, engagement/time-distribution, engagement/trend Marketing (campaigns, content, outbound bridge): marketing/campaigns, marketing/content, marketing/content/by-landing, marketing/outbound-bridge, marketing/outbound-bridge/by-campaign, marketing/outbound-bridge/by-channel, marketing/outbound-bridge/by-landing-page, marketing/outbound-bridge/top-sources, marketing/outbound-bridge/trend, marketing/overview Realtime (live visitors): realtime, realtime/locations, realtime/pages, realtime/sources SDR (rep activity and leaderboards): sdr/ai-agents/summary, sdr/detail, sdr/leaderboard, sdr/summary, sdr/trends Every report is read-only and runs on theanalytics:readscope. Give it a window withdays(rolling),start_date/end_date, ordate_from/date_to, whichever the report accepts; the API applies its own default when none is sent. Arguments a report does not declare are ignored by the API, so send only the ones the report uses.sdr_emailis required forsdr/detailanddialer/leaderboard/sdr, where it is part of the URL.pathis required forbehavior/page-metrics. Everything else is optional. API: GET /analytics/campaign-visitors (and 59 sibling report operations under /analytics; seereport).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
report | No | string | Which analytics report to read. Defaults to campaign-visitors, the report this tool returned before the rest of the /analytics surface was folded in. |
days | No | integer / null | Rolling ‘last N days from today’, 1-365. Ignored when an explicit window is supplied. |
start_date | No | string / null | Window start (inclusive), YYYY-MM-DD. If omitted, derived from days. |
end_date | No | string / null | Window end (inclusive), YYYY-MM-DD. If omitted, today. |
date_from | No | string / null | Anchored window start (YYYY-MM-DD) for the web analytics reports. Send with date_to. |
date_to | No | string / null | Anchored window end (YYYY-MM-DD) for the web analytics reports. Send with date_from. |
limit | No | integer / null | Row cap. The per-report maximum differs (50 to 500); the API rejects an over-large value. |
sort_by | No | string / null | Sort key. The accepted values differ per report; see the report’s API documentation. |
sort_order | No | string / null | Sort order: asc or desc. Defaults to desc. |
granularity | No | string / null | Aggregation period for sdr/trends: day or week. |
period | No | string / null | Time period preset for dialer/leaderboard when no dates are given: today, week or month. |
sdr_email | No | string / null | SDR email address. REQUIRED for sdr/detail and dialer/leaderboard/sdr, where it is part of the URL; an optional filter on the other dialer reports. |
campaign_id | No | string / null | Campaign ID filter for dialer/grading/search. |
path | No | string / null | Exact context_page_path to roll up. REQUIRED for behavior/page-metrics. |
page | No | integer / null | Page number for dialer/grading/search, 1-based. |
page_size | No | integer / null | Results per page for dialer/grading/search, 1-100. |
min_score | No | integer / null | Minimum overall grading score, 0-40, for dialer/grading/search. |
max_score | No | integer / null | Maximum overall grading score, 0-40, for dialer/grading/search. |
include_contacts | No | boolean / null | campaign-visitors only: include the Top contacts table (contact name + email, so PII). Set false to omit it entirely for a privacy-lean response. |
Complete input schema
{ "properties": { "report": { "default": "campaign-visitors", "description": "Which analytics report to read. Defaults to campaign-visitors, the report this tool returned before the rest of the /analytics surface was folded in.", "enum": [ "campaign-visitors", "acquisition/campaigns", "acquisition/channels", "acquisition/channels/trend", "acquisition/referrals", "acquisition/search", "acquisition/social", "acquisition/sources", "audience/behavior", "audience/demographics", "audience/geo", "audience/geo/cities", "audience/languages", "audience/overview", "audience/technology", "audience/trend", "behavior/events", "behavior/exit-pages", "behavior/landing-pages", "behavior/page-metrics", "behavior/pages", "conversions/forms", "conversions/forms/analysis", "conversions/forms/trend", "conversions/funnel", "conversions/goals", "conversions/goals/trend", "conversions/rate", "dialer/grading/search", "dialer/leaderboard", "dialer/leaderboard/sdr", "dialer/performance", "dialer/quality", "dialer/quality/leaderboard", "engagement/by-campaign", "engagement/by-channel", "engagement/by-landing-page", "engagement/depth-distribution", "engagement/overview", "engagement/time-distribution", "engagement/trend", "marketing/campaigns", "marketing/content", "marketing/content/by-landing", "marketing/outbound-bridge", "marketing/outbound-bridge/by-campaign", "marketing/outbound-bridge/by-channel", "marketing/outbound-bridge/by-landing-page", "marketing/outbound-bridge/top-sources", "marketing/outbound-bridge/trend", "marketing/overview", "realtime", "realtime/locations", "realtime/pages", "realtime/sources", "sdr/ai-agents/summary", "sdr/detail", "sdr/leaderboard", "sdr/summary", "sdr/trends" ], "title": "Report", "type": "string" }, "days": { "anyOf": [ { "maximum": 365, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Rolling 'last N days from today', 1-365. Ignored when an explicit window is supplied.", "title": "Days" }, "start_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Window start (inclusive), YYYY-MM-DD. If omitted, derived from `days`.", "title": "Start Date" }, "end_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Window end (inclusive), YYYY-MM-DD. If omitted, today.", "title": "End Date" }, "date_from": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Anchored window start (YYYY-MM-DD) for the web analytics reports. Send with date_to.", "title": "Date From" }, "date_to": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Anchored window end (YYYY-MM-DD) for the web analytics reports. Send with date_from.", "title": "Date To" }, "limit": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Row cap. The per-report maximum differs (50 to 500); the API rejects an over-large value.", "title": "Limit" }, "sort_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Sort key. The accepted values differ per report; see the report's API documentation.", "title": "Sort By" }, "sort_order": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Sort order: asc or desc. Defaults to desc.", "title": "Sort Order" }, "granularity": { "anyOf": [ { "enum": [ "day", "week" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "Aggregation period for sdr/trends: day or week.", "title": "Granularity" }, "period": { "anyOf": [ { "enum": [ "today", "week", "month" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "Time period preset for dialer/leaderboard when no dates are given: today, week or month.", "title": "Period" }, "sdr_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "SDR email address. REQUIRED for sdr/detail and dialer/leaderboard/sdr, where it is part of the URL; an optional filter on the other dialer reports.", "title": "Sdr Email" }, "campaign_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Campaign ID filter for dialer/grading/search.", "title": "Campaign Id" }, "path": { "anyOf": [ { "maxLength": 1000, "minLength": 1, "type": "string" }, { "type": "null" } ], "default": null, "description": "Exact context_page_path to roll up. REQUIRED for behavior/page-metrics.", "title": "Path" }, "page": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Page number for dialer/grading/search, 1-based.", "title": "Page" }, "page_size": { "anyOf": [ { "maximum": 100, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Results per page for dialer/grading/search, 1-100.", "title": "Page Size" }, "min_score": { "anyOf": [ { "maximum": 40, "minimum": 0, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Minimum overall grading score, 0-40, for dialer/grading/search.", "title": "Min Score" }, "max_score": { "anyOf": [ { "maximum": 40, "minimum": 0, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Maximum overall grading score, 0-40, for dialer/grading/search.", "title": "Max Score" }, "include_contacts": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "campaign-visitors only: include the Top contacts table (contact name + email, so PII). Set false to omit it entirely for a privacy-lean response.", "title": "Include Contacts" } }, "title": "g8_analytics_get_campaign_visitorsArguments", "type": "object"}g8_app_apply_manifest
Apply a graph8.app.yaml to an app: publish its objects, store its build config. The objects half goes through the same publish path as g8_app_publish_schema, so it is idempotent on content and the tenant fan-out is failure-isolated. Refused when the manifest’s app.slug names a different app than app_id, because a copied file would otherwise publish one app’s schema into another app’s tenants. A block the manifest omits is left alone rather than cleared, so applying a frontend-only manifest does not erase a stored backend. Args: app_id: The app id to apply this manifest to manifest: The full graph8.app.yaml document as text
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
manifest | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "manifest": { "title": "Manifest", "type": "string" } }, "required": [ "app_id", "manifest" ], "title": "g8_app_apply_manifestArguments", "type": "object"}g8_app_claim_app_domain
Claim App Domain. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /apps/{app_id}/domains
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
body | Yes | #/$defs/ApiClaimDomainRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiClaimDomainRequest": { "additionalProperties": false, "properties": { "hostname": { "description": "The hostname to serve this app on. Normalized server-side: case, a trailing dot and unicode all resolve to one canonical form.", "maxLength": 253, "title": "Hostname", "type": "string" } }, "required": [ "hostname" ], "title": "ApiClaimDomainRequest", "type": "object" } }, "properties": { "app_id": { "title": "App Id", "type": "string" }, "body": { "$ref": "#/$defs/ApiClaimDomainRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "body" ], "title": "g8_app_claim_app_domainArguments", "type": "object"}g8_app_clear_app_limit
Clear App Limit. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /apps/{app_id}/limit
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id" ], "title": "g8_app_clear_app_limitArguments", "type": "object"}g8_app_clear_app_source
Clear App Source. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /apps/{app_id}/source
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id" ], "title": "g8_app_clear_app_sourceArguments", "type": "object"}g8_app_create
Create an app you are building on graph8. An app is software your customers install into their own workspace, acting on their data with their consent. Distinct from your own workspace’s data: an app declares its own objects. Requires your organization to be enabled as an app builder. Until then this answers 403 builder_not_allowlisted. Args: name: Human-readable name, shown to customers installing it slug: Short identifier, unique within your organization (e.g. invoicer)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
name | Yes | string | See the schema below for constraints and defaults. |
slug | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "name": { "title": "Name", "type": "string" }, "slug": { "title": "Slug", "type": "string" } }, "required": [ "name", "slug" ], "title": "g8_app_createArguments", "type": "object"}g8_app_create_app_credential
Create App Credential. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /apps/{app_id}/credentials
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
body | Yes | #/$defs/ApiCreateCredentialRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiCreateCredentialRequest": { "additionalProperties": false, "properties": { "client_org_id": { "description": "The client organization this credential acts for. It must already have a consented installation of the app - a credential is bound to one tenant and cannot be pointed at another later.", "title": "Client Org Id", "type": "string" } }, "required": [ "client_org_id" ], "title": "ApiCreateCredentialRequest", "type": "object" } }, "properties": { "app_id": { "title": "App Id", "type": "string" }, "body": { "$ref": "#/$defs/ApiCreateCredentialRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "body" ], "title": "g8_app_create_app_credentialArguments", "type": "object"}g8_app_delete_app_secret
Delete App Secret. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /apps/{app_id}/secrets/{secret_key}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
secret_key | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "secret_key": { "title": "Secret Key", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "secret_key" ], "title": "g8_app_delete_app_secretArguments", "type": "object"}g8_app_deploy
Start a deployment of this app’s runtime. A deployment begins queued. Promotion is a separate, deliberate step, so a build that passes its checks does not become live by default. Args: app_id: The app to deploy source_ref: REQUIRED. An immutable commit SHA, not a branch name. A branch moves, so a deployment recorded against one cannot answer “what is running right now” a week later - which is the question a rollback has to answer. schema_version_id: Schema version this build expects. Pin it so a rollback restores the matching schema, not merely the matching image.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
source_ref | Yes | string | See the schema below for constraints and defaults. |
schema_version_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "source_ref": { "title": "Source Ref", "type": "string" }, "schema_version_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Schema Version Id" } }, "required": [ "app_id", "source_ref" ], "title": "g8_app_deployArguments", "type": "object"}g8_app_get_active_deployment
Get Active Deployment. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/deployments/active
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_get_active_deploymentArguments", "type": "object"}g8_app_get_app_limit
Get App Limit. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/limit
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_get_app_limitArguments", "type": "object"}g8_app_get_app_logs
Get App Logs. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/logs
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
tail_lines | No | integer / null | Lines per replica, newest last. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "tail_lines": { "anyOf": [ { "maximum": 2000, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Lines per replica, newest last.", "title": "Tail Lines" } }, "required": [ "app_id" ], "title": "g8_app_get_app_logsArguments", "type": "object"}g8_app_get_app_runtime
Get App Runtime. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/runtime
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_get_app_runtimeArguments", "type": "object"}g8_app_get_app_usage
Get App Usage. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/usage
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
period | No | string / null | Calendar month YYYY-MM. Defaults to the current month. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "period": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Calendar month `YYYY-MM`. Defaults to the current month.", "title": "Period" } }, "required": [ "app_id" ], "title": "g8_app_get_app_usageArguments", "type": "object"}g8_app_get_deployment
Get Deployment. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/deployments/{deployment_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
deployment_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "deployment_id": { "title": "Deployment Id", "type": "string" } }, "required": [ "app_id", "deployment_id" ], "title": "g8_app_get_deploymentArguments", "type": "object"}g8_app_get_deployment_logs
Get Deployment Logs. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/deployments/{deployment_id}/logs
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
deployment_id | Yes | string | See the schema below for constraints and defaults. |
tail_lines | No | integer / null | Lines per build step, newest last. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "deployment_id": { "title": "Deployment Id", "type": "string" }, "tail_lines": { "anyOf": [ { "maximum": 2000, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Lines per build step, newest last.", "title": "Tail Lines" } }, "required": [ "app_id", "deployment_id" ], "title": "g8_app_get_deployment_logsArguments", "type": "object"}g8_app_get_installed_app
Get Installed App. Uses the current organization and existing API permissions. API: GET /installed-apps/{app_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_get_installed_appArguments", "type": "object"}g8_app_install
Install an app into a client organization. The install starts unconsented. A tenant receives no object definitions until it consents, which is the security boundary rather than a filter. Args: app_id: The app to install client_org_id: The organization installing it
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
client_org_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "client_org_id": { "title": "Client Org Id", "type": "string" } }, "required": [ "app_id", "client_org_id" ], "title": "g8_app_installArguments", "type": "object"}g8_app_list
List the apps your organization is building, newest first.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_app_listArguments", "type": "object"}g8_app_list_app_credentials
List App Credentials. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/credentials
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_list_app_credentialsArguments", "type": "object"}g8_app_list_app_deployments
List App Deployments. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/deployments
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_list_app_deploymentsArguments", "type": "object"}g8_app_list_app_domains
List App Domains. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/domains
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_list_app_domainsArguments", "type": "object"}g8_app_list_app_installs
List App Installs. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/installs
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_list_app_installsArguments", "type": "object"}g8_app_list_app_secrets
List App Secrets. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/{app_id}/secrets
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_list_app_secretsArguments", "type": "object"}g8_app_list_installed_apps
List Installed Apps. Uses the current organization and existing API permissions. API: GET /installed-apps
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_app_list_installed_appsArguments", "type": "object"}g8_app_list_schema_versions
List this app’s published schema versions, oldest first. Args: app_id: The app id
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_list_schema_versionsArguments", "type": "object"}g8_app_promote
Promote a deployment to live. Separate from deploying on purpose: promotion is what customers see, and it should be a decision rather than a side effect of a build finishing. Args: app_id: The app deployment_id: The deployment to promote (e.g. ddep_…) image_digest: REQUIRED. The built image digest being promoted, from g8_app_status. Recorded so a rollback targets an artifact rather than a rebuild - a rebuild of the same ref is not necessarily the same image.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
deployment_id | Yes | string | See the schema below for constraints and defaults. |
image_digest | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "deployment_id": { "title": "Deployment Id", "type": "string" }, "image_digest": { "title": "Image Digest", "type": "string" } }, "required": [ "app_id", "deployment_id", "image_digest" ], "title": "g8_app_promoteArguments", "type": "object"}g8_app_publish_schema
Publish this app’s object schema and materialize it in every consented tenant. Idempotent on the content: republishing an identical schema resolves to the existing version rather than writing to every tenant again. The fan-out is failure-isolated, so one unreachable tenant does not fail the publish or stop the others. Only tenants that have CONSENTED receive anything. A pending or revoked install gets nothing. Args: app_id: The app id objects: Declared objects. Each needs slug, singular_noun, plural_noun and attributes; each attribute needs slug, title and type. Publishing an empty list is refused, because it would archive every object the app has ever declared.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
objects | Yes | array | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "objects": { "items": { "additionalProperties": true, "type": "object" }, "title": "Objects", "type": "array" } }, "required": [ "app_id", "objects" ], "title": "g8_app_publish_schemaArguments", "type": "object"}g8_app_put_app_secret
Put App Secret. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /apps/{app_id}/secrets/{secret_key}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
secret_key | Yes | string | See the schema below for constraints and defaults. |
body | Yes | #/$defs/ApiPutAppSecretRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiPutAppSecretRequest": { "additionalProperties": false, "properties": { "provider_ref": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Secret-manager PATH for the value. Never the value itself.", "title": "Provider Ref" } }, "title": "ApiPutAppSecretRequest", "type": "object" } }, "properties": { "app_id": { "title": "App Id", "type": "string" }, "secret_key": { "title": "Secret Key", "type": "string" }, "body": { "$ref": "#/$defs/ApiPutAppSecretRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "secret_key", "body" ], "title": "g8_app_put_app_secretArguments", "type": "object"}g8_app_release_app_domain
Release App Domain. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /apps/{app_id}/domains/{hostname}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
hostname | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "hostname": { "title": "Hostname", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "hostname" ], "title": "g8_app_release_app_domainArguments", "type": "object"}g8_app_report_observed_build
Observe a real Kubernetes build Job and report its derived progress after confirm=true. Requires the isolated g8-controller-mcp-server connection with existing controller credentials and cluster service-account mounts. App/deployment identifiers select a Job whose identity is verified. Agents cannot supply status, image digest, error text, credentials or cluster addresses. Missing or unreadable evidence never updates progress. The API verifies the app binding and state transition; this never promotes an app to live traffic.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
deployment_id | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "pattern": "^dapp_[0-9a-f]{6,32}$", "title": "App Id", "type": "string" }, "deployment_id": { "pattern": "^ddep_[0-9a-f]{6,32}$", "title": "Deployment Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "deployment_id" ], "title": "g8_app_report_observed_buildArguments", "type": "object"}g8_app_revoke_app_credential
Revoke App Credential. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /apps/{app_id}/credentials/{client_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
client_id | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "client_id": { "title": "Client Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "client_id" ], "title": "g8_app_revoke_app_credentialArguments", "type": "object"}g8_app_rollback_deployment
Rollback Deployment. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /apps/{app_id}/deployments/{deployment_id}/rollback
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
deployment_id | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "deployment_id": { "title": "Deployment Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "deployment_id" ], "title": "g8_app_rollback_deploymentArguments", "type": "object"}g8_app_set_app_limit
Set App Limit. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /apps/{app_id}/limit
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
body | Yes | #/$defs/ApiSetAppLimitRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiSetAppLimitRequest": { "additionalProperties": false, "properties": { "credit_cap": { "description": "Hard cap in credits for the window. `0` means 'cap at zero', NOT 'uncapped' -- to remove a cap, DELETE the limit instead.", "minimum": 0.0, "title": "Credit Cap", "type": "integer" }, "window": { "default": "calendar_month", "description": "Cap window. `calendar_month` is the only value today.", "title": "Window", "type": "string" } }, "required": [ "credit_cap" ], "title": "ApiSetAppLimitRequest", "type": "object" } }, "properties": { "app_id": { "title": "App Id", "type": "string" }, "body": { "$ref": "#/$defs/ApiSetAppLimitRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "body" ], "title": "g8_app_set_app_limitArguments", "type": "object"}g8_app_set_app_source
Set App Source. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /apps/{app_id}/source
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
body | Yes | #/$defs/ApiAppSourceRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiAppSourceRequest": { "additionalProperties": false, "properties": { "credential_ref": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Secret-manager PATH for the fetch credential. Never the credential itself.", "title": "Credential Ref" }, "default_branch": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Defaults to the repository's own default when omitted.", "title": "Default Branch" }, "provider": { "description": "One of: github, gitlab, bitbucket.", "title": "Provider", "type": "string" }, "repo_url": { "description": "Clone URL.", "maxLength": 2000, "minLength": 1, "title": "Repo Url", "type": "string" } }, "required": [ "provider", "repo_url" ], "title": "ApiAppSourceRequest", "type": "object" } }, "properties": { "app_id": { "title": "App Id", "type": "string" }, "body": { "$ref": "#/$defs/ApiAppSourceRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "body" ], "title": "g8_app_set_app_sourceArguments", "type": "object"}g8_app_set_app_status
Set App Status. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /apps/{app_id}/status
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
body | Yes | #/$defs/ApiSetAppStatusRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiSetAppStatusRequest": { "additionalProperties": false, "properties": { "status": { "description": "`draft`, `published`, `suspended` or `archived`. `active` is accepted as the legacy spelling of `published`.", "title": "Status", "type": "string" } }, "required": [ "status" ], "title": "ApiSetAppStatusRequest", "type": "object" } }, "properties": { "app_id": { "title": "App Id", "type": "string" }, "body": { "$ref": "#/$defs/ApiSetAppStatusRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "body" ], "title": "g8_app_set_app_statusArguments", "type": "object"}g8_app_status
Get one app: its lifecycle status, registered origins and hostname. Args: app_id: The app id (e.g. dapp_a1b2c3d4e5f6)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" } }, "required": [ "app_id" ], "title": "g8_app_statusArguments", "type": "object"}g8_app_uninstall_app
Uninstall App. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /installed-apps/{app_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id" ], "title": "g8_app_uninstall_appArguments", "type": "object"}g8_app_validate_manifest
Check a graph8.app.yaml without applying it. No app id needed. Answers successfully whether or not the manifest is valid:
validis the answer andissuesis why not, each with a path pointer, so a whole file is fixed in one pass rather than one error per attempt. Use this on a manifest you just wrote, before applying it. A manifest MUST declare a frontend and/or a backend build target. One that declares only objects is rejected with no_build_target. Args: manifest: The full graph8.app.yaml document as text, newlines and all. Rejected above 256 KiB.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
manifest | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "manifest": { "title": "Manifest", "type": "string" } }, "required": [ "manifest" ], "title": "g8_app_validate_manifestArguments", "type": "object"}g8_app_verify_app_domain
Verify App Domain. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /apps/{app_id}/domains/{hostname}/verify
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
app_id | Yes | string | See the schema below for constraints and defaults. |
hostname | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "app_id": { "title": "App Id", "type": "string" }, "hostname": { "title": "Hostname", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "app_id", "hostname" ], "title": "g8_app_verify_app_domainArguments", "type": "object"}g8_apply_install
Apply the generated GTM patches to the repository. IMPORTANT: This modifies the codebase. Always confirm with the user first. Args: repo_id: Repository ID with a pending patch set
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" } }, "required": [ "repo_id" ], "title": "g8_apply_installArguments", "type": "object"}g8_apply_landing_page_patch
Submit ordered exact replacements to a landing-page draft. First call g8_get_landing_page_source. Build replacements from its exact HTML and pass back its sha256. Every
oldstring must occur exactlyexpected_matchestimes against the evolving document or nothing is written. Studio handoffs default topending_review, where the user applies or discards the validated diff in graph8. If the user explicitly selected automatic updates, a successful call snapshots the previous HTML as a restorable graph8 version and applies immediately. Reuse the same idempotency key only when retrying the identical request. Args: edit_session: Opaque page-scoped session copied from graph8 Studio. base_sha256: sha256 returned by g8_get_landing_page_source. replacements: 1-20 ordered exact old/new replacements. idempotency_key: New stable retry key (8-128 URL-safe characters). summary: Concise human-readable description for version history.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
edit_session | Yes | string | See the schema below for constraints and defaults. |
base_sha256 | Yes | string | See the schema below for constraints and defaults. |
replacements | Yes | array | See the schema below for constraints and defaults. |
idempotency_key | Yes | string | See the schema below for constraints and defaults. |
summary | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "LandingPageReplacementInput": { "description": "One ordered exact-text replacement for a landing-page patch.", "properties": { "old": { "maxLength": 200000, "minLength": 1, "title": "Old", "type": "string" }, "new": { "maxLength": 500000, "title": "New", "type": "string" }, "expected_matches": { "default": 1, "maximum": 100, "minimum": 1, "title": "Expected Matches", "type": "integer" } }, "required": [ "old", "new" ], "title": "LandingPageReplacementInput", "type": "object" } }, "properties": { "edit_session": { "title": "Edit Session", "type": "string" }, "base_sha256": { "title": "Base Sha256", "type": "string" }, "replacements": { "items": { "$ref": "#/$defs/LandingPageReplacementInput" }, "title": "Replacements", "type": "array" }, "idempotency_key": { "title": "Idempotency Key", "type": "string" }, "summary": { "default": "External AI edit", "title": "Summary", "type": "string" } }, "required": [ "edit_session", "base_sha256", "replacements", "idempotency_key" ], "title": "g8_apply_landing_page_patchArguments", "type": "object"}g8_appointments_add_booking_guests
Add guest email addresses to an existing booking. Guests are extra attendees who get the same calendar invite and notifications; each new guest is emailed. Args: booking_uid: Booking UID to add guests to. guests: List of email addresses to invite as guests.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
guests | Yes | array | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "guests": { "items": { "type": "string" }, "title": "Guests", "type": "array" } }, "required": [ "booking_uid", "guests" ], "title": "g8_appointments_add_booking_guestsArguments", "type": "object"}g8_appointments_add_booking_note
Add an internal host-only note to a booking. Notes are not visible to attendees - only to org members in the booking detail view. Args: booking_uid: Booking UID to annotate. text: Note content (plain text).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
text | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "text": { "title": "Text", "type": "string" } }, "required": [ "booking_uid", "text" ], "title": "g8_appointments_add_booking_noteArguments", "type": "object"}g8_appointments_cancel_booking
Cancel a booking and notify both parties. This sends cancellation emails and frees the slot - confirm with the user first. Args: booking_uid: Booking UID to cancel. cancellation_reason: Optional reason shown in the notification. cancel_subsequent: For recurring bookings, also cancel later occurrences (default False).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
cancellation_reason | No | string / null | See the schema below for constraints and defaults. |
cancel_subsequent | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "cancellation_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Cancellation Reason" }, "cancel_subsequent": { "default": false, "title": "Cancel Subsequent", "type": "boolean" } }, "required": [ "booking_uid" ], "title": "g8_appointments_cancel_bookingArguments", "type": "object"}g8_appointments_confirm_booking
Confirm or reject a pending booking that requires host approval. SENDS EMAILS to both parties - confirm intent with the user first. confirmed=True accepts (pending -> accepted); confirmed=False rejects and notifies the attendee with the optional reason. Args: booking_uid: Booking UID to confirm or reject. confirmed: True to accept, False to reject. reason: Optional message to the attendee (shown on rejection).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
confirmed | Yes | boolean | See the schema below for constraints and defaults. |
reason | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "confirmed": { "title": "Confirmed", "type": "boolean" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Reason" } }, "required": [ "booking_uid", "confirmed" ], "title": "g8_appointments_confirm_bookingArguments", "type": "object"}g8_appointments_connect_conferencing
Connect a conferencing provider that does not need a browser OAuth flow. google_meet reuses your Google Calendar credential (must be connected first). roam/whereby/jitsi are link-based (optionally pass the URL). roam_auto creates a stub credential (OAuth completed once in the web app). For Zoom and Teams (office365_video) use the web app - they need browser OAuth. Args: provider: One of: google_meet, roam, roam_auto, whereby, jitsi. link: Optional meeting URL for roam, whereby, or jitsi providers.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
provider | Yes | string | See the schema below for constraints and defaults. |
link | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "provider": { "title": "Provider", "type": "string" }, "link": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Link" } }, "required": [ "provider" ], "title": "g8_appointments_connect_conferencingArguments", "type": "object"}g8_appointments_create_booking
Book an appointment. CHARGES CREDITS (~20) and sends calendar invites + confirmation emails to attendee and host. ALWAYS confirm event type, time, and attendee with the user first - billable, externally-visible. Resolve event_type_id via g8_appointments_list_event_types and inspect it with g8_appointments_get_event_type first (duration + required booking_fields). start_time must be an available slot; end_time derives from the event-type length when omitted. Args: event_type_id: The event type to book. start_time: ISO-8601 start (e.g. “2026-06-10T15:00:00Z”). attendee_name: Primary attendee’s name. attendee_email: Primary attendee’s email. attendee_time_zone: IANA tz for the attendee (e.g. “America/New_York”). end_time: ISO-8601 end. Omit to use the event-type duration. location: Location/conferencing key (e.g. “zoom”, “google_meet”). guests: Additional guest email addresses to invite. responses: Answers to the event type’s custom booking_fields, keyed by field id.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
event_type_id | Yes | integer | See the schema below for constraints and defaults. |
start_time | Yes | string | See the schema below for constraints and defaults. |
attendee_name | Yes | string | See the schema below for constraints and defaults. |
attendee_email | Yes | string | See the schema below for constraints and defaults. |
attendee_time_zone | No | string / null | See the schema below for constraints and defaults. |
end_time | No | string / null | See the schema below for constraints and defaults. |
location | No | string / null | See the schema below for constraints and defaults. |
guests | No | array / null | See the schema below for constraints and defaults. |
responses | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "event_type_id": { "title": "Event Type Id", "type": "integer" }, "start_time": { "title": "Start Time", "type": "string" }, "attendee_name": { "title": "Attendee Name", "type": "string" }, "attendee_email": { "title": "Attendee Email", "type": "string" }, "attendee_time_zone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Attendee Time Zone" }, "end_time": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "End Time" }, "location": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Location" }, "guests": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Guests" }, "responses": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Responses" } }, "required": [ "event_type_id", "start_time", "attendee_name", "attendee_email" ], "title": "g8_appointments_create_bookingArguments", "type": "object"}g8_appointments_create_event_type
Create a bookable event type (what people book on your calendar). slug must be unique in the org (it becomes part of the public booking URL); collisions return an error. Args: title: Display name, e.g. “Discovery call”. slug: URL slug, e.g. “discovery-call” (unique per org). length: Duration in minutes. description: Optional description shown on the booking page. scheduling_type: “collective” | “round_robin” for team events; omit for 1:1. schedule_id: Availability schedule to attach (from g8_appointments_list_schedules). hidden: Create it hidden (not publicly bookable) when True. requires_confirmation: Require host approval before a booking is confirmed. minimum_booking_notice: Minutes of lead time required before a slot (default 120). locations: Location/conferencing config, e.g. [{“type”: “integrations:google:meet”}]. booking_fields: Custom questions the attendee must answer.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
title | Yes | string | See the schema below for constraints and defaults. |
slug | Yes | string | See the schema below for constraints and defaults. |
length | Yes | integer | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
scheduling_type | No | string / null | See the schema below for constraints and defaults. |
schedule_id | No | integer / null | See the schema below for constraints and defaults. |
hidden | No | boolean | See the schema below for constraints and defaults. |
requires_confirmation | No | boolean | See the schema below for constraints and defaults. |
minimum_booking_notice | No | integer / null | See the schema below for constraints and defaults. |
locations | No | array / null | See the schema below for constraints and defaults. |
booking_fields | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "title": { "title": "Title", "type": "string" }, "slug": { "title": "Slug", "type": "string" }, "length": { "title": "Length", "type": "integer" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "scheduling_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Scheduling Type" }, "schedule_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Schedule Id" }, "hidden": { "default": false, "title": "Hidden", "type": "boolean" }, "requires_confirmation": { "default": false, "title": "Requires Confirmation", "type": "boolean" }, "minimum_booking_notice": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Minimum Booking Notice" }, "locations": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Locations" }, "booking_fields": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Booking Fields" } }, "required": [ "title", "slug", "length" ], "title": "g8_appointments_create_event_typeArguments", "type": "object"}g8_appointments_create_ooo
Create an out-of-office entry for the calling user. While active, the user’s slots are blocked so no new bookings land in the period. Args: start: ISO-8601 UTC start datetime, e.g. “2026-07-01T00:00:00Z”. end: ISO-8601 UTC end datetime, e.g. “2026-07-08T00:00:00Z”. notes: Optional free-text note visible to the host. to_user_id: Integer user id of a team member to redirect bookings to. reason: Optional short label, e.g. “vacation” or “conference”.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
start | Yes | string | See the schema below for constraints and defaults. |
end | Yes | string | See the schema below for constraints and defaults. |
notes | No | string / null | See the schema below for constraints and defaults. |
to_user_id | No | integer / null | See the schema below for constraints and defaults. |
reason | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "start": { "title": "Start", "type": "string" }, "end": { "title": "End", "type": "string" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Notes" }, "to_user_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "To User Id" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Reason" } }, "required": [ "start", "end" ], "title": "g8_appointments_create_oooArguments", "type": "object"}g8_appointments_create_routing_form
Create a new routing form (sequence of questions that route the visitor to an event type based on answers). Each field needs a label and type (select/text/email/phone); select fields need an options list of {label, value}. Routes need conditions (list of {field_id, operator, value} where field_id is the field’s identifier slug) plus action_type + action_value (event-type slug to redirect to). Include one route with is_fallback=True as the catch-all. Args: name: Display name for the form. description: Optional description shown on the form page. disabled: Create the form in disabled state when True. fields: List of field dicts (label, type, required, options). routes: List of route dicts (conditions, action_type, action_value, is_fallback).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
name | Yes | string | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
disabled | No | boolean | See the schema below for constraints and defaults. |
fields | No | array / null | See the schema below for constraints and defaults. |
routes | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "name": { "title": "Name", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "disabled": { "default": false, "title": "Disabled", "type": "boolean" }, "fields": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Fields" }, "routes": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Routes" } }, "required": [ "name" ], "title": "g8_appointments_create_routing_formArguments", "type": "object"}g8_appointments_create_schedule
Create a named availability schedule with weekly rules and optional date overrides. Args: name: Display name, e.g. “Working hours”. time_zone: IANA timezone string, e.g. “America/New_York”. is_default: Set as the caller’s default schedule when True (used for slot generation when an event type has no schedule attached). availability: Weekly rules [{days: [1..7], start_time: “HH:MM”, end_time: “HH:MM”}]. Days: 1=Monday … 7=Sunday. Omit for Mon-Fri 09:00-17:00. overrides: Date-specific overrides [{date: “YYYY-MM-DD”, start_time, end_time}].
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
name | Yes | string | See the schema below for constraints and defaults. |
time_zone | Yes | string | See the schema below for constraints and defaults. |
is_default | No | boolean | See the schema below for constraints and defaults. |
availability | No | array / null | See the schema below for constraints and defaults. |
overrides | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "name": { "title": "Name", "type": "string" }, "time_zone": { "title": "Time Zone", "type": "string" }, "is_default": { "default": false, "title": "Is Default", "type": "boolean" }, "availability": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Availability" }, "overrides": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Overrides" } }, "required": [ "name", "time_zone" ], "title": "g8_appointments_create_scheduleArguments", "type": "object"}g8_appointments_create_workflow
Create a booking workflow that automates actions (emails, reminders) tied to booking lifecycle events. Must have at least one step. Args: name: Display name for the workflow. trigger: When the workflow fires. One of: “new_booking” (on creation), “before_event”/“after_event” (N time_units before/after; need time + time_unit), “booking_cancelled”, “booking_rescheduled”. steps: List of step dicts (at least one). Each step: action (required): “EMAIL_HOST” | “EMAIL_ATTENDEE” | “EMAIL_ADDRESS”; template (default “REMINDER”); email_subject; reminder_body; send_to (required when action is “EMAIL_ADDRESS”); sender; include_calendar_event (default False). time: For time-based triggers - how many time_unit intervals before/after. time_unit: “minutes” | “hours” | “days” | “weeks” (required with time). is_active_on_all: Apply to all event types when True (default False). event_type_ids: Specific event types to attach this workflow to.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
name | Yes | string | See the schema below for constraints and defaults. |
trigger | Yes | string | See the schema below for constraints and defaults. |
steps | Yes | array | See the schema below for constraints and defaults. |
time | No | integer / null | See the schema below for constraints and defaults. |
time_unit | No | string / null | See the schema below for constraints and defaults. |
is_active_on_all | No | boolean | See the schema below for constraints and defaults. |
event_type_ids | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "name": { "title": "Name", "type": "string" }, "trigger": { "title": "Trigger", "type": "string" }, "steps": { "items": { "additionalProperties": true, "type": "object" }, "title": "Steps", "type": "array" }, "time": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Time" }, "time_unit": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Time Unit" }, "is_active_on_all": { "default": false, "title": "Is Active On All", "type": "boolean" }, "event_type_ids": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Event Type Ids" } }, "required": [ "name", "trigger", "steps" ], "title": "g8_appointments_create_workflowArguments", "type": "object"}g8_appointments_delete_event_type
Delete an event type permanently (irreversible). Removes its public booking page; existing bookings are not cancelled. Confirm with the user first. Requires Admin or Owner role - a non-admin key gets a permission error, in which case hide it instead via g8_appointments_update_event_type(hidden=True). Args: event_type_id: The event type to delete.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
event_type_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "event_type_id": { "title": "Event Type Id", "type": "integer" } }, "required": [ "event_type_id" ], "title": "g8_appointments_delete_event_typeArguments", "type": "object"}g8_appointments_delete_ooo
Delete an out-of-office entry permanently. The user’s slots in the previously-blocked period become bookable again after deletion. Confirm with the user before calling. Args: ooo_uuid: UUID of the out-of-office entry (from g8_appointments_list_ooo).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
ooo_uuid | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "ooo_uuid": { "title": "Ooo Uuid", "type": "string" } }, "required": [ "ooo_uuid" ], "title": "g8_appointments_delete_oooArguments", "type": "object"}g8_appointments_delete_routing_form
Delete a routing form permanently. Cascades to all fields, routes, and captured responses. Irreversible - confirm with the user first. Args: form_id: The routing form to delete.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
form_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "form_id": { "title": "Form Id", "type": "integer" } }, "required": [ "form_id" ], "title": "g8_appointments_delete_routing_formArguments", "type": "object"}g8_appointments_delete_schedule
Delete an availability schedule permanently. Confirm with the user first - this removes the schedule from any linked event types. Returns 409 if it is the user’s only remaining schedule (must keep at least one). Args: schedule_id: Schedule to delete.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
schedule_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "schedule_id": { "title": "Schedule Id", "type": "integer" } }, "required": [ "schedule_id" ], "title": "g8_appointments_delete_scheduleArguments", "type": "object"}g8_appointments_delete_workflow
Delete a workflow permanently. Pending reminders are cancelled; existing bookings are unaffected. Confirm with the user before calling. Args: workflow_id: The workflow to delete.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
workflow_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "workflow_id": { "title": "Workflow Id", "type": "integer" } }, "required": [ "workflow_id" ], "title": "g8_appointments_delete_workflowArguments", "type": "object"}g8_appointments_deselect_calendar
Remove a sub-calendar from conflict checking. The calendar account stays connected; only its conflict-check selection is removed. Args: credential_id: ID of the connected calendar account credential. integration: Provider type, e.g. “google_calendar”. external_id: The calendar’s external ID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
credential_id | Yes | integer | See the schema below for constraints and defaults. |
integration | Yes | string | See the schema below for constraints and defaults. |
external_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "credential_id": { "title": "Credential Id", "type": "integer" }, "integration": { "title": "Integration", "type": "string" }, "external_id": { "title": "External Id", "type": "string" } }, "required": [ "credential_id", "integration", "external_id" ], "title": "g8_appointments_deselect_calendarArguments", "type": "object"}g8_appointments_disconnect_calendar
Disconnect a calendar account entirely: removes the credential, revokes the OAuth token (best-effort), and clears destination settings pointing at it. Existing bookings are unaffected. Confirm with the user before calling. Args: credential_id: ID of the calendar account credential to disconnect (from g8_appointments_list_calendars).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
credential_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "credential_id": { "title": "Credential Id", "type": "integer" } }, "required": [ "credential_id" ], "title": "g8_appointments_disconnect_calendarArguments", "type": "object"}g8_appointments_disconnect_conferencing
Disconnect a conferencing provider. Real-credential providers (zoom, roam, whereby, jitsi, office365_video, roam_auto) have their credential deleted; Google Meet has no credential, so it is suppressed and cleared as default. Confirm with the user first - reconnecting OAuth providers (zoom, office365_video) requires the web app. Args: provider: The conferencing provider to disconnect.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
provider | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "provider": { "title": "Provider", "type": "string" } }, "required": [ "provider" ], "title": "g8_appointments_disconnect_conferencingArguments", "type": "object"}g8_appointments_duplicate_event_type
Duplicate an event type into a copy with a unique “{slug}-copy” slug and the same hosts/config. Args: event_type_id: The source event type to copy.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
event_type_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "event_type_id": { "title": "Event Type Id", "type": "integer" } }, "required": [ "event_type_id" ], "title": "g8_appointments_duplicate_event_typeArguments", "type": "object"}g8_appointments_duplicate_routing_form
Duplicate a routing form with all its fields and routes. Creates a copy named “{name} (copy)” with a unique auto-generated slug. Captured responses are NOT copied. Args: form_id: The source routing form to copy.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
form_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "form_id": { "title": "Form Id", "type": "integer" } }, "required": [ "form_id" ], "title": "g8_appointments_duplicate_routing_formArguments", "type": "object"}g8_appointments_get_availability
Get a schedule’s availability list (recurring weekly rules with days 1=Mon..7=Sun, start_time, end_time) and overrides list (one-time overrides for specific dates). Args: schedule_id: Schedule integer ID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
schedule_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "schedule_id": { "title": "Schedule Id", "type": "integer" } }, "required": [ "schedule_id" ], "title": "g8_appointments_get_availabilityArguments", "type": "object"}g8_appointments_get_booking
Get a single booking by its UID. Returns the full detail: attendees, status, times, location, meeting_url, the attendee’s form responses, and internal notes. Args: booking_uid: Booking UID (uuid string) from g8_appointments_list_bookings.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" } }, "required": [ "booking_uid" ], "title": "g8_appointments_get_bookingArguments", "type": "object"}g8_appointments_get_default_conferencing
Get the default conferencing provider used for new bookings when no explicit location is specified. Returns null provider when none is set.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_appointments_get_default_conferencingArguments", "type": "object"}g8_appointments_get_destination_calendar
Get the destination calendar where new booking events are pushed. Returns null when none is configured. Args: event_type_id: Optional event type ID for a per-event-type lookup; omit to get the user-level default.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
event_type_id | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "event_type_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Event Type Id" } }, "title": "g8_appointments_get_destination_calendarArguments", "type": "object"}g8_appointments_get_event_type
Get full detail for one bookable event type: title, slug, duration (length minutes), locations, hosts, schedule, buffers, minimum notice, and the booking_fields an attendee must answer. Call before g8_appointments_create_booking to learn required fields + slot length. Find event_type_id via g8_appointments_list_event_types. Args: event_type_id: Event-type integer ID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
event_type_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "event_type_id": { "title": "Event Type Id", "type": "integer" } }, "required": [ "event_type_id" ], "title": "g8_appointments_get_event_typeArguments", "type": "object"}g8_appointments_get_insights
Get aggregated booking insights (counts, show/no-show rates, per-event-type breakdowns) for the caller’s org. Answers questions like booking volume, no-show rate, or most-booked event type. Args: date_from: ISO date lower bound, e.g. “2026-01-01”. date_to: ISO date upper bound, e.g. “2026-06-30”. event_type_ids: Comma-separated event-type IDs to filter by. member_user_id: Filter by a specific member (ignored for non-admin API callers).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
date_from | No | string / null | See the schema below for constraints and defaults. |
date_to | No | string / null | See the schema below for constraints and defaults. |
event_type_ids | No | string / null | See the schema below for constraints and defaults. |
member_user_id | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "date_from": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Date From" }, "date_to": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Date To" }, "event_type_ids": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Event Type Ids" }, "member_user_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Member User Id" } }, "title": "g8_appointments_get_insightsArguments", "type": "object"}g8_appointments_get_routing_form
Get a routing form by ID with its full fields, routes, and response_count. Each field has an identifier (slug used as the condition key), type (select/text/email/phone/number), label, required, and options (select fields). Routes map answer conditions to an event-type redirect; the fallback route has is_fallback=True. Conditions reference field_id = field.identifier (the slug, not the integer id). Args: form_id: The routing form integer ID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
form_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "form_id": { "title": "Form Id", "type": "integer" } }, "required": [ "form_id" ], "title": "g8_appointments_get_routing_formArguments", "type": "object"}g8_appointments_get_routing_form_responses
List captured responses for a routing form (paginated). Each response has the visitor’s field answers (keyed by field identifier/slug), the event-type routed to, and the submission timestamp. Args: form_id: The routing form integer ID. skip: Number of responses to skip (default 0). take: Maximum responses to return, up to 500 (default 50).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
form_id | Yes | integer | See the schema below for constraints and defaults. |
skip | No | integer | See the schema below for constraints and defaults. |
take | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "form_id": { "title": "Form Id", "type": "integer" }, "skip": { "default": 0, "title": "Skip", "type": "integer" }, "take": { "default": 50, "title": "Take", "type": "integer" } }, "required": [ "form_id" ], "title": "g8_appointments_get_routing_form_responsesArguments", "type": "object"}g8_appointments_get_schedule
Get a single availability schedule with its weekly rules, date overrides, owner info, and linked event types. Returns 404 if it does not exist or belongs to another user. Args: schedule_id: Schedule integer ID (from g8_appointments_list_schedules or the schedule_id field on an event type).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
schedule_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "schedule_id": { "title": "Schedule Id", "type": "integer" } }, "required": [ "schedule_id" ], "title": "g8_appointments_get_scheduleArguments", "type": "object"}g8_appointments_get_workflow
Get full details for a single workflow, including all steps and linked event types. Args: workflow_id: The workflow integer ID (from g8_appointments_list_workflows).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
workflow_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "workflow_id": { "title": "Workflow Id", "type": "integer" } }, "required": [ "workflow_id" ], "title": "g8_appointments_get_workflowArguments", "type": "object"}g8_appointments_list_bookings
List the caller’s appointment bookings (paginated). Shows bookings the user owns, hosts, or shared a link for - never org-wide. Args: status: Filter by status - accepted | pending | cancelled | rejected. event_type_id: Only bookings for this event type. after_start: ISO-8601 lower bound on start_time (e.g. “2026-06-01T00:00:00Z”). before_end: ISO-8601 upper bound on end_time. attendee_email: Filter to bookings including this attendee. sort_by: start_time | end_time | created_at | status (default start_time). sort_order: asc | desc (default desc). skip: Pagination offset (default 0). take: Page size, 1-100 (default 20).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
status | No | string / null | See the schema below for constraints and defaults. |
event_type_id | No | integer / null | See the schema below for constraints and defaults. |
after_start | No | string / null | See the schema below for constraints and defaults. |
before_end | No | string / null | See the schema below for constraints and defaults. |
attendee_email | No | string / null | See the schema below for constraints and defaults. |
sort_by | No | string | See the schema below for constraints and defaults. |
sort_order | No | string | See the schema below for constraints and defaults. |
skip | No | integer | See the schema below for constraints and defaults. |
take | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "event_type_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Event Type Id" }, "after_start": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "After Start" }, "before_end": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Before End" }, "attendee_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Attendee Email" }, "sort_by": { "default": "start_time", "title": "Sort By", "type": "string" }, "sort_order": { "default": "desc", "title": "Sort Order", "type": "string" }, "skip": { "default": 0, "title": "Skip", "type": "integer" }, "take": { "default": 20, "title": "Take", "type": "integer" } }, "title": "g8_appointments_list_bookingsArguments", "type": "object"}g8_appointments_list_calendars
List connected calendar accounts (Google Calendar, Outlook). Each account shows its sub-calendars and which are selected for conflict checking. Requires a calendar connected in the web app first.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_appointments_list_calendarsArguments", "type": "object"}g8_appointments_list_conferencing
List connected conferencing providers. Returns each provider’s name, type, meeting link (if applicable), and whether it is the default. Google Meet appears when a Google Calendar credential exists and was not removed.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_appointments_list_conferencingArguments", "type": "object"}g8_appointments_list_event_types
List bookable calendar event types (Cal.com appointments). An event type is the “where do they book?” picker: a title, a slug, and a duration. Pass the row’s integer id back as appointment_id on g8_gtm_launch_campaign to attach the booking link. Different from g8_list_meetings (the inbox of already-booked meetings); this is the picker for which booking template the sequence references. Args: include_hidden: Include event types marked hidden (not bookable publicly). Default False matches the in-app picker. scheduling_type: Filter by Cal.com scheduling type: managed | round_robin | collective. Omit to return all.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
include_hidden | No | boolean | See the schema below for constraints and defaults. |
scheduling_type | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "include_hidden": { "default": false, "title": "Include Hidden", "type": "boolean" }, "scheduling_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Scheduling Type" } }, "title": "list_event_typesArguments", "type": "object"}g8_appointments_list_ooo
List all out-of-office entries for the calling user. Each entry has a uuid, date range, optional notes, optional redirect-to user id, and reason. Use the uuid to delete an entry with g8_appointments_delete_ooo.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_appointments_list_oooArguments", "type": "object"}g8_appointments_list_routing_forms
List all routing forms owned by the current user. Returns each form’s id, name, slug, description, disabled state, field count, route count, and total response_count. Use g8_appointments_get_routing_form for the full field/route definitions.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_appointments_list_routing_formsArguments", "type": "object"}g8_appointments_list_schedules
List the caller’s appointment availability schedules. DISTINCT from g8_list_schedules (sequencer send-window schedules). Each entry has id, name, time_zone, weekly rules, and is_default; use an id with g8_appointments_get_schedule / _update_schedule / _set_default_schedule.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_appointments_list_schedulesArguments", "type": "object"}g8_appointments_list_workflows
List all booking workflows configured for the organisation. Returns every workflow with its trigger, active state, linked event types, and steps. Use this to discover existing workflows before creating new ones.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_appointments_list_workflowsArguments", "type": "object"}g8_appointments_mark_absent
Mark the host and/or attendees as no-show for a booking. Args: booking_uid: Booking UID to update. host: Set True to mark the host as no-show. attendees: List of attendee dicts (each needs at least “email”), e.g. [{“email”: “[email protected]”}], to mark as no-show.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
host | No | boolean / null | See the schema below for constraints and defaults. |
attendees | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "host": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Host" }, "attendees": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Attendees" } }, "required": [ "booking_uid" ], "title": "g8_appointments_mark_absentArguments", "type": "object"}g8_appointments_request_reschedule
Ask the attendee to pick a new time (host-initiated reschedule request). Sends a reschedule-request email with a booking-page link. Does NOT move or cancel the original booking - the attendee reschedules by clicking the link. Args: booking_uid: Booking UID for which to request a reschedule. reason: Optional message from host to the attendee.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
reason | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Reason" } }, "required": [ "booking_uid" ], "title": "g8_appointments_request_rescheduleArguments", "type": "object"}g8_appointments_reschedule_booking
Reschedule a booking to a new start time. Free (no extra credit charge); re-sends the updated calendar invite and notifies the attendee. Returns the NEW booking detail. Args: booking_uid: Booking UID to move. start_time: New ISO-8601 start time (must be an available slot). rescheduling_reason: Optional reason shown in the notification.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
start_time | Yes | string | See the schema below for constraints and defaults. |
rescheduling_reason | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "start_time": { "title": "Start Time", "type": "string" }, "rescheduling_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Rescheduling Reason" } }, "required": [ "booking_uid", "start_time" ], "title": "g8_appointments_reschedule_bookingArguments", "type": "object"}g8_appointments_select_calendar
Add a sub-calendar to conflict checking; its busy times are then checked before offering booking slots. Find all args via g8_appointments_list_calendars. Args: credential_id: ID of the connected calendar account credential. integration: Provider type, e.g. “google_calendar” or “office365_calendar”. external_id: The calendar’s external ID (from list_calendars sub_calendars).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
credential_id | Yes | integer | See the schema below for constraints and defaults. |
integration | Yes | string | See the schema below for constraints and defaults. |
external_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "credential_id": { "title": "Credential Id", "type": "integer" }, "integration": { "title": "Integration", "type": "string" }, "external_id": { "title": "External Id", "type": "string" } }, "required": [ "credential_id", "integration", "external_id" ], "title": "g8_appointments_select_calendarArguments", "type": "object"}g8_appointments_set_conferencing_link
Set or update the meeting URL for a link-based conferencing provider (roam, whereby, or jitsi). The provider must already be connected; the URL is validated against the provider’s pattern. Args: provider: One of: roam, whereby, jitsi. link: The meeting URL (must match the provider’s URL pattern).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
provider | Yes | string | See the schema below for constraints and defaults. |
link | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "provider": { "title": "Provider", "type": "string" }, "link": { "title": "Link", "type": "string" } }, "required": [ "provider", "link" ], "title": "g8_appointments_set_conferencing_linkArguments", "type": "object"}g8_appointments_set_default_conferencing
Set the default conferencing provider for new bookings when no explicit location is specified. Link-based providers (roam, whereby, jitsi) need a meeting URL - pass it here or set it first via g8_appointments_set_conferencing_link. Args: provider: The conferencing provider to set as default. credential_id: Optional credential ID for the provider. link: Optional meeting URL (required for roam/whereby/jitsi if not already stored).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
provider | Yes | string | See the schema below for constraints and defaults. |
credential_id | No | integer / null | See the schema below for constraints and defaults. |
link | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "provider": { "title": "Provider", "type": "string" }, "credential_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Credential Id" }, "link": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Link" } }, "required": [ "provider" ], "title": "g8_appointments_set_default_conferencingArguments", "type": "object"}g8_appointments_set_default_schedule
Set a schedule as the caller’s default availability schedule, used for slot generation when an event type has no explicit schedule attached. Args: schedule_id: Schedule to make the default.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
schedule_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "schedule_id": { "title": "Schedule Id", "type": "integer" } }, "required": [ "schedule_id" ], "title": "g8_appointments_set_default_scheduleArguments", "type": "object"}g8_appointments_set_destination_calendar
Set the destination calendar where new booking events are pushed. Find arg values via g8_appointments_list_calendars. Args: integration: Provider type, e.g. “google_calendar” or “office365_calendar”. external_id: The calendar’s external ID. credential_id: Optional credential ID for the calendar account. event_type_id: Optional event type ID for a per-event-type destination; omit to set the user-level default.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
integration | Yes | string | See the schema below for constraints and defaults. |
external_id | Yes | string | See the schema below for constraints and defaults. |
credential_id | No | integer / null | See the schema below for constraints and defaults. |
event_type_id | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "integration": { "title": "Integration", "type": "string" }, "external_id": { "title": "External Id", "type": "string" }, "credential_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Credential Id" }, "event_type_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Event Type Id" } }, "required": [ "integration", "external_id" ], "title": "g8_appointments_set_destination_calendarArguments", "type": "object"}g8_appointments_toggle_workflow
Activate or deactivate a workflow. Deactivating cancels all pending reminders so scheduled jobs never fire for a disabled workflow. Args: workflow_id: The workflow to toggle. active: True to activate, False to deactivate.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
workflow_id | Yes | integer | See the schema below for constraints and defaults. |
active | Yes | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "workflow_id": { "title": "Workflow Id", "type": "integer" }, "active": { "title": "Active", "type": "boolean" } }, "required": [ "workflow_id", "active" ], "title": "g8_appointments_toggle_workflowArguments", "type": "object"}g8_appointments_update_availability
Replace weekly availability rules and/or date overrides for a schedule. Pass at least one. Each list REPLACES its counterpart entirely - pass all active entries, not just changed ones. Days: 1=Monday … 7=Sunday. Args: schedule_id: Schedule to update. availability: Replacement weekly rules [{days: [1..7], start_time: “HH:MM”, end_time: “HH:MM”}]. Omit to leave weekly rules unchanged. overrides: Replacement date overrides [{date: “YYYY-MM-DD”, start_time: “HH:MM”, end_time: “HH:MM”}]. Omit to leave overrides unchanged.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
schedule_id | Yes | integer | See the schema below for constraints and defaults. |
availability | No | array / null | See the schema below for constraints and defaults. |
overrides | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "schedule_id": { "title": "Schedule Id", "type": "integer" }, "availability": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Availability" }, "overrides": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Overrides" } }, "required": [ "schedule_id" ], "title": "g8_appointments_update_availabilityArguments", "type": "object"}g8_appointments_update_booking_location
Update the meeting location for a booking. Sends location-updated emails to both the host and attendee. Args: booking_uid: Booking UID to update. location: New location key (“zoom”, “google_meet”, “in_person”) or a custom URL.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
location | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "location": { "title": "Location", "type": "string" } }, "required": [ "booking_uid", "location" ], "title": "g8_appointments_update_booking_locationArguments", "type": "object"}g8_appointments_update_booking_sequence
Associate a booking with a sequencer sequence, or detach it. CRM-only action: no notifications are sent. Pass null or omit to detach. Args: booking_uid: Booking UID to update. sequence_id: Sequence UUID to link (from g8_list_sequences), or null to detach.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
sequence_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "sequence_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Sequence Id" } }, "required": [ "booking_uid" ], "title": "g8_appointments_update_booking_sequenceArguments", "type": "object"}g8_appointments_update_event_type
Update an event type. Only the fields you pass are changed; omit a field to leave it as-is. Args: event_type_id: The event type to update (from g8_appointments_list_event_types). title: New display name. slug: New URL slug (must stay unique in the org). length: New duration in minutes. description: New description. scheduling_type: “collective” | “round_robin”. schedule_id: Attach a different availability schedule. hidden: True hides the event type; False makes it publicly bookable. requires_confirmation: Toggle host-approval requirement. minimum_booking_notice: Minutes of lead time required before a slot. locations: Replace the location/conferencing config. booking_fields: Replace the custom booking questions.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
event_type_id | Yes | integer | See the schema below for constraints and defaults. |
title | No | string / null | See the schema below for constraints and defaults. |
slug | No | string / null | See the schema below for constraints and defaults. |
length | No | integer / null | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
scheduling_type | No | string / null | See the schema below for constraints and defaults. |
schedule_id | No | integer / null | See the schema below for constraints and defaults. |
hidden | No | boolean / null | See the schema below for constraints and defaults. |
requires_confirmation | No | boolean / null | See the schema below for constraints and defaults. |
minimum_booking_notice | No | integer / null | See the schema below for constraints and defaults. |
locations | No | array / null | See the schema below for constraints and defaults. |
booking_fields | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "event_type_id": { "title": "Event Type Id", "type": "integer" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Title" }, "slug": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Slug" }, "length": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Length" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "scheduling_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Scheduling Type" }, "schedule_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Schedule Id" }, "hidden": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Hidden" }, "requires_confirmation": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Requires Confirmation" }, "minimum_booking_notice": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Minimum Booking Notice" }, "locations": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Locations" }, "booking_fields": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Booking Fields" } }, "required": [ "event_type_id" ], "title": "g8_appointments_update_event_typeArguments", "type": "object"}g8_appointments_update_ooo
Update an out-of-office entry. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PATCH /appointments/out-of-office/{ooo_uuid}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
ooo_uuid | Yes | string | UUID of the out-of-office entry to update. |
body | Yes | #/$defs/ApiUpdateOutOfOfficeRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiUpdateOutOfOfficeRequest": { "additionalProperties": false, "properties": { "end": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "End" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Notes" }, "public_note": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Public Note" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Reason" }, "start": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Start" }, "time_zone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Time Zone" }, "to_user_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "To User Id" } }, "title": "ApiUpdateOutOfOfficeRequest", "type": "object" } }, "properties": { "ooo_uuid": { "description": "UUID of the out-of-office entry to update.", "title": "Ooo Uuid", "type": "string" }, "body": { "$ref": "#/$defs/ApiUpdateOutOfOfficeRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "ooo_uuid", "body" ], "title": "g8_appointments_update_oooArguments", "type": "object"}g8_appointments_update_routing_form
Update a routing form. Only the fields you pass are changed; omit a parameter to leave it as-is. Passing fields or routes REPLACES the existing list atomically. slug must be unique in the org (409 on collision). disabled=True pauses the form without deleting it. Args: form_id: The routing form to update. name: New display name. slug: New URL slug (must be unique in the org). description: New description. disabled: True pauses the form; False re-enables it. fields: Replacement field list (replaces all existing fields). routes: Replacement route list (replaces all existing routes).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
form_id | Yes | integer | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
slug | No | string / null | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
disabled | No | boolean / null | See the schema below for constraints and defaults. |
fields | No | array / null | See the schema below for constraints and defaults. |
routes | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "form_id": { "title": "Form Id", "type": "integer" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "slug": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Slug" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "disabled": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Disabled" }, "fields": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Fields" }, "routes": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Routes" } }, "required": [ "form_id" ], "title": "g8_appointments_update_routing_formArguments", "type": "object"}g8_appointments_update_schedule
Partial update of an availability schedule. Omit a field to leave it as-is. availability and overrides each REPLACE all entries when passed. Args: schedule_id: Schedule to update. name: New display name. time_zone: New IANA timezone string. is_default: True to set as the caller’s default schedule. availability: Replacement weekly rules [{days, start_time, end_time}]. overrides: Replacement date overrides [{date, start_time, end_time}].
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
schedule_id | Yes | integer | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
time_zone | No | string / null | See the schema below for constraints and defaults. |
is_default | No | boolean / null | See the schema below for constraints and defaults. |
availability | No | array / null | See the schema below for constraints and defaults. |
overrides | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "schedule_id": { "title": "Schedule Id", "type": "integer" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "time_zone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Time Zone" }, "is_default": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Is Default" }, "availability": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Availability" }, "overrides": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Overrides" } }, "required": [ "schedule_id" ], "title": "g8_appointments_update_scheduleArguments", "type": "object"}g8_appointments_update_workflow
Update a workflow. Only the fields you pass are changed; omit a field to leave it as-is. Passing steps replaces all existing steps; passing event_type_ids replaces all links. Args: workflow_id: The workflow to update (from g8_appointments_list_workflows). name: New display name. trigger: New trigger type. steps: New steps list (replaces all existing steps when provided). time: New time value for time-based triggers. time_unit: New time unit for time-based triggers. is_active_on_all: Toggle org-wide application. event_type_ids: New list of event type IDs to link (replaces existing links).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
workflow_id | Yes | integer | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
trigger | No | string / null | See the schema below for constraints and defaults. |
steps | No | array / null | See the schema below for constraints and defaults. |
time | No | integer / null | See the schema below for constraints and defaults. |
time_unit | No | string / null | See the schema below for constraints and defaults. |
is_active_on_all | No | boolean / null | See the schema below for constraints and defaults. |
event_type_ids | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "workflow_id": { "title": "Workflow Id", "type": "integer" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "trigger": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Trigger" }, "steps": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Steps" }, "time": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Time" }, "time_unit": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Time Unit" }, "is_active_on_all": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Is Active On All" }, "event_type_ids": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Event Type Ids" } }, "required": [ "workflow_id" ], "title": "g8_appointments_update_workflowArguments", "type": "object"}g8_assign_reply
Assign a user to an inbox thread. Args: reply_id: Thread/reply ID. assignee_email: Email of the user to assign. channel: email, sms, or linkedin (default email).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
reply_id | Yes | string | See the schema below for constraints and defaults. |
assignee_email | Yes | string | See the schema below for constraints and defaults. |
channel | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "reply_id": { "title": "Reply Id", "type": "string" }, "assignee_email": { "title": "Assignee Email", "type": "string" }, "channel": { "default": "email", "title": "Channel", "type": "string" } }, "required": [ "reply_id", "assignee_email" ], "title": "g8_assign_replyArguments", "type": "object"}g8_assign_task_executor
Save an eligible Work agent assignment without starting execution. Keep the task’s human assignee accountable. Omit agent_id to return to human execution. Read the task first and supply its updated_at value.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
task_id | Yes | string | See the schema below for constraints and defaults. |
expected_updated_at | Yes | string | See the schema below for constraints and defaults. |
agent_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "task_id": { "title": "Task Id", "type": "string" }, "expected_updated_at": { "title": "Expected Updated At", "type": "string" }, "agent_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Agent Id" } }, "required": [ "task_id", "expected_updated_at" ], "title": "g8_assign_task_executorArguments", "type": "object"}g8_audit_list_request_logs
List Request Logs. Uses the current organization and existing API permissions. API: GET /logs
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
limit | No | integer / null | Max entries to return (most recent first) |
Complete input schema
{ "properties": { "limit": { "anyOf": [ { "maximum": 200, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Max entries to return (most recent first)", "title": "Limit" } }, "title": "g8_audit_list_request_logsArguments", "type": "object"}g8_cancel_booking
Cancel a booking and notify both parties. This sends cancellation emails and frees the slot - confirm with the user first. Args: booking_uid: Booking UID to cancel. cancellation_reason: Optional reason shown in the notification. cancel_subsequent: For recurring bookings, also cancel later occurrences (default False).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
cancellation_reason | No | string / null | See the schema below for constraints and defaults. |
cancel_subsequent | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "cancellation_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Cancellation Reason" }, "cancel_subsequent": { "default": false, "title": "Cancel Subsequent", "type": "boolean" } }, "required": [ "booking_uid" ], "title": "g8_appointments_cancel_bookingArguments", "type": "object"}g8_company_open_jobs
Find out what companies in your CRM are hiring for right now. A growth/buying signal: a company staffing up is a company with budget. Use it to prioritise accounts, time outreach, or open with a specific role they just posted. NOT related to g8_marketplace_create_job_post. That publishes an SDR role YOU are recruiting for onto the graph8 marketplace. This reads jobs OTHER companies are advertising. Same word, different data - if the user wants to hire someone, you want the marketplace tool, not this one. Pass CRM company ids (from g8_search_companies). Companies you don’t have ids for yet: search first, then call this. Free - reads an already-ingested corpus, no credits. Results split into
items(resolved) andunresolved. An unresolved company is normal - it means we couldn’t match it to a LinkedIn company page, not that it isn’t hiring.open_jobs: 0means resolved and genuinely hiring nobody. Readlcid_confidencebefore trusting a match: 1.0 is an exact LinkedIn-URL match, 0.7 is a domain fallback that can mismatch on shared or parked domains. And noteopen_jobscounts postings seen withinwindow_days- the source has no open/closed state, so a filled role lingers until it ages out. Args: company_ids: CRM company ids (max 200). NOT LinkedIn ids. window_days: How far back to look for postings (1-365, default 60). include_postings: False returns counts only - faster, use when you just need to rank accounts by hiring activity. limit_per_company: Max postings per company (1-50, default 25).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
company_ids | Yes | array | See the schema below for constraints and defaults. |
window_days | No | integer | See the schema below for constraints and defaults. |
include_postings | No | boolean | See the schema below for constraints and defaults. |
limit_per_company | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "company_ids": { "items": { "type": "integer" }, "title": "Company Ids", "type": "array" }, "window_days": { "default": 60, "title": "Window Days", "type": "integer" }, "include_postings": { "default": true, "title": "Include Postings", "type": "boolean" }, "limit_per_company": { "default": 25, "title": "Limit Per Company", "type": "integer" } }, "required": [ "company_ids" ], "title": "g8_company_open_jobsArguments", "type": "object"}g8_connect_repo
Connect a GitHub/GitLab repository to graph8 for GTM automation. After connecting, read the tech stack yourself and record it with g8_scan_repo. graph8 does not scan the repository for you. Args: repo_url: Full repository URL (e.g. https://github.com/org/repo) repo_name: Short name for the repo (e.g. my-saas-app) provider: Repository provider - github, gitlab, or local default_branch: Default branch name (usually main)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_url | Yes | string | See the schema below for constraints and defaults. |
repo_name | Yes | string | See the schema below for constraints and defaults. |
provider | No | string | See the schema below for constraints and defaults. |
default_branch | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_url": { "title": "Repo Url", "type": "string" }, "repo_name": { "title": "Repo Name", "type": "string" }, "provider": { "default": "github", "title": "Provider", "type": "string" }, "default_branch": { "default": "main", "title": "Default Branch", "type": "string" } }, "required": [ "repo_url", "repo_name" ], "title": "g8_connect_repoArguments", "type": "object"}g8_connection_describe_current_key
Describe the API connection this session is using. By default: who the key belongs to, the org it acts for, the scopes it carries and the operations those reach. That is the answer to “why did that call 403?” - compare the failing operation against what comes back here. Two opt-in extras, both reads: -
include_org_keys: every API key in the org - id, name, mode, scopes, who created it and when it was last used. Secrets are never returned by any of these routes; a token is emitted only at creation and rotation, neither of which is available here. Use it to find a key nobody uses any more, or to see which key a teammate’s integration is running on. -include_scope_catalog: the full scope vocabulary a key CAN be granted, plus the default grant. Wider than the scope list on this key, and wider than the operations above: several scopes exist only in this catalog because their routes gate themselves, so this is the only place to see them. Each extra costs one additional request, so leave them off unless the question needs them. API: GET /me (plus GET /api-keys and GET /api-keys/scopes when the flags are set).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
include_org_keys | No | boolean | See the schema below for constraints and defaults. |
include_scope_catalog | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "include_org_keys": { "default": false, "title": "Include Org Keys", "type": "boolean" }, "include_scope_catalog": { "default": false, "title": "Include Scope Catalog", "type": "boolean" } }, "title": "g8_connection_describe_current_keyArguments", "type": "object"}g8_connection_get_mcp_connection
Get Mcp Connection. Uses the current organization and existing API permissions. API: GET /mcp/connection
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_connection_get_mcp_connectionArguments", "type": "object"}g8_connection_revoke_api_key
Revoke one of the org’s API keys, permanently. The key stops working immediately and its token cannot be recovered - anything running on it breaks until someone issues a new key in the app and redeploys. There is no un-revoke. Check
last_used_atfirst withg8_connection_describe_current_key(include_org_keys=True): a key used in the last few minutes is almost certainly load-bearing. Note the list does not say WHICH key this session is using, so revoking the wrong row can end the session’s own access. A key id that is not in this org returns not-found, the same as one that was already revoked. Args: api_key_id: Frominclude_org_keysabove. confirm: Must be true. Without it no request is sent. API: DELETE /api-keys/{api_key_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
api_key_id | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "api_key_id": { "title": "Api Key Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "api_key_id" ], "title": "g8_connection_revoke_api_keyArguments", "type": "object"}g8_contact_support
Send the user’s message to graph8’s HUMAN support team. Use this when the user explicitly asks to talk to a human, contact graph8 support, report a problem you cannot solve, or file a complaint about the graph8 platform. Do NOT use it for questions you can answer yourself with the other tools. How the reply works: graph8 support is notified immediately and replies by EMAIL to the user’s own address (or to contact_email when provided). After calling, tell the user which address the reply will go to - it is in the response. There is no live chat behind this tool. Duplicate handling: a repeat call within a few minutes returns status “already_received” - the team was already notified, so do NOT retry or call again for the same issue. Args: message: What the user needs help with, in their own words. Include relevant context (what they tried, error messages, which feature). 3 to 5000 characters. contact_email: Where support should reply. Usually omit it - the authenticated user’s email is used. REQUIRED when the server says the API key has no user email (org-scoped machine key): ask the user for their email and retry with it. urgency: Optional free-form urgency hint, e.g. “normal”, “high”, “urgent”. Urgent-flavored values are flagged to the team.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
message | Yes | string | See the schema below for constraints and defaults. |
contact_email | No | string / null | See the schema below for constraints and defaults. |
urgency | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "message": { "title": "Message", "type": "string" }, "contact_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contact Email" }, "urgency": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Urgency" } }, "required": [ "message" ], "title": "g8_contact_supportArguments", "type": "object"}g8_copy_task_to_people
Create a separate human task for each selected person; leave the source unchanged. Read the source first and pass its updated_at revision. request_id is a UUID that MUST be reused after any uncertain result or partial failure. Retry only failed recipients with the same request_id and revision. The response separates copied task IDs from recipient failures. Copies exclude execution/approval history, comments, subtasks and reminders. This does not start any agent execution.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
task_id | Yes | string | See the schema below for constraints and defaults. |
assignee_ids | Yes | array | See the schema below for constraints and defaults. |
expected_updated_at | Yes | string | See the schema below for constraints and defaults. |
request_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "task_id": { "title": "Task Id", "type": "string" }, "assignee_ids": { "items": { "type": "string" }, "title": "Assignee Ids", "type": "array" }, "expected_updated_at": { "title": "Expected Updated At", "type": "string" }, "request_id": { "title": "Request Id", "type": "string" } }, "required": [ "task_id", "assignee_ids", "expected_updated_at", "request_id" ], "title": "g8_copy_task_to_peopleArguments", "type": "object"}g8_create_audience_sync
Create an audience sync config: syncs a graph8 audience list to an ad platform for custom audience targeting. Returns 409 if a sync already exists for this audience + platform combo. Args: audience_id: Audience list ID to sync platform: Ad platform (meta, linkedin, google, x) mode: Sync mode - “mirror” (add+remove) or “append_only” (add only) refresh_cadence_hours: Hours between auto-syncs (default 24) platform_audience_name: Custom name for the audience on the platform
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
audience_id | Yes | integer | See the schema below for constraints and defaults. |
platform | Yes | string | See the schema below for constraints and defaults. |
mode | No | string | See the schema below for constraints and defaults. |
refresh_cadence_hours | No | integer | See the schema below for constraints and defaults. |
platform_audience_name | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "audience_id": { "title": "Audience Id", "type": "integer" }, "platform": { "title": "Platform", "type": "string" }, "mode": { "default": "mirror", "title": "Mode", "type": "string" }, "refresh_cadence_hours": { "default": 24, "title": "Refresh Cadence Hours", "type": "integer" }, "platform_audience_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Platform Audience Name" } }, "required": [ "audience_id", "platform" ], "title": "g8_create_audience_syncArguments", "type": "object"}g8_create_booking
Book an appointment. CHARGES CREDITS (~20) and sends calendar invites + confirmation emails to attendee and host. ALWAYS confirm event type, time, and attendee with the user first - billable, externally-visible. Resolve event_type_id via g8_appointments_list_event_types and inspect it with g8_appointments_get_event_type first (duration + required booking_fields). start_time must be an available slot; end_time derives from the event-type length when omitted. Args: event_type_id: The event type to book. start_time: ISO-8601 start (e.g. “2026-06-10T15:00:00Z”). attendee_name: Primary attendee’s name. attendee_email: Primary attendee’s email. attendee_time_zone: IANA tz for the attendee (e.g. “America/New_York”). end_time: ISO-8601 end. Omit to use the event-type duration. location: Location/conferencing key (e.g. “zoom”, “google_meet”). guests: Additional guest email addresses to invite. responses: Answers to the event type’s custom booking_fields, keyed by field id.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
event_type_id | Yes | integer | See the schema below for constraints and defaults. |
start_time | Yes | string | See the schema below for constraints and defaults. |
attendee_name | Yes | string | See the schema below for constraints and defaults. |
attendee_email | Yes | string | See the schema below for constraints and defaults. |
attendee_time_zone | No | string / null | See the schema below for constraints and defaults. |
end_time | No | string / null | See the schema below for constraints and defaults. |
location | No | string / null | See the schema below for constraints and defaults. |
guests | No | array / null | See the schema below for constraints and defaults. |
responses | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "event_type_id": { "title": "Event Type Id", "type": "integer" }, "start_time": { "title": "Start Time", "type": "string" }, "attendee_name": { "title": "Attendee Name", "type": "string" }, "attendee_email": { "title": "Attendee Email", "type": "string" }, "attendee_time_zone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Attendee Time Zone" }, "end_time": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "End Time" }, "location": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Location" }, "guests": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Guests" }, "responses": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Responses" } }, "required": [ "event_type_id", "start_time", "attendee_name", "attendee_email" ], "title": "g8_appointments_create_bookingArguments", "type": "object"}g8_create_company
Create a company in your CRM.
domainis required (e.g. “acme.com”); it drives dedup, so creating the same domain twice reuses the existing company rather than making a duplicate. Returns the newcompany_id(mashup_companies.id). Use this to add a company that isn’t in your CRM yet and then attach it to a contact: create it here, then call g8_update_contact(contact_id=…, company_id=<company_id>). A deal can then derive its company from that contact. Args: domain: Company domain, e.g. “acme.com” (required). name: Company name. website, industry, linkedin_url, phone, city, state, country, employee_count: Optional company details. list_id: Optionally add the company to this list after creation. Backed byPOST /api/v1/companies.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
domain | Yes | string | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
website | No | string / null | See the schema below for constraints and defaults. |
industry | No | string / null | See the schema below for constraints and defaults. |
linkedin_url | No | string / null | See the schema below for constraints and defaults. |
phone | No | string / null | See the schema below for constraints and defaults. |
city | No | string / null | See the schema below for constraints and defaults. |
state | No | string / null | See the schema below for constraints and defaults. |
country | No | string / null | See the schema below for constraints and defaults. |
employee_count | No | string / null | See the schema below for constraints and defaults. |
list_id | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "domain": { "title": "Domain", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "website": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Website" }, "industry": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Industry" }, "linkedin_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Linkedin Url" }, "phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Phone" }, "city": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "City" }, "state": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "State" }, "country": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Country" }, "employee_count": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Employee Count" }, "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "List Id" } }, "required": [ "domain" ], "title": "g8_create_companyArguments", "type": "object"}g8_create_contact
Create a contact in your CRM database. Use this after g8_lookup_person to save a prospect you want to track, or to manually add a contact you know about. Optionally add them directly to a list by providing list_id. Returns the new contact_id (needed for g8_add_to_sequence and g8_add_to_list). Args: work_email: Contact’s work email (required) first_name: First name last_name: Last name job_title: Job title company_domain: Company domain (e.g. acme.com) to resolve-or-create company_id: Existing company id (mashup_companies.id) to attach; wins over company_domain linkedin_url: LinkedIn profile URL direct_phone: Direct phone number mobile_phone: Mobile phone number seniority_level: Seniority level (C-Suite, VP, Director, Manager, etc.) city: City state: State/province country: Country list_id: Optionally add to this list immediately (from g8_create_list)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
work_email | Yes | string | See the schema below for constraints and defaults. |
first_name | No | string / null | See the schema below for constraints and defaults. |
last_name | No | string / null | See the schema below for constraints and defaults. |
job_title | No | string / null | See the schema below for constraints and defaults. |
company_domain | No | string / null | See the schema below for constraints and defaults. |
company_id | No | integer / null | See the schema below for constraints and defaults. |
linkedin_url | No | string / null | See the schema below for constraints and defaults. |
direct_phone | No | string / null | See the schema below for constraints and defaults. |
mobile_phone | No | string / null | See the schema below for constraints and defaults. |
seniority_level | No | string / null | See the schema below for constraints and defaults. |
city | No | string / null | See the schema below for constraints and defaults. |
state | No | string / null | See the schema below for constraints and defaults. |
country | No | string / null | See the schema below for constraints and defaults. |
list_id | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "work_email": { "title": "Work Email", "type": "string" }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "First Name" }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Last Name" }, "job_title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Job Title" }, "company_domain": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Company Domain" }, "company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Company Id" }, "linkedin_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Linkedin Url" }, "direct_phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Direct Phone" }, "mobile_phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Mobile Phone" }, "seniority_level": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Seniority Level" }, "city": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "City" }, "state": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "State" }, "country": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Country" }, "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "List Id" } }, "required": [ "work_email" ], "title": "g8_create_contactArguments", "type": "object"}g8_create_deal
Create a new CRM deal. Requires an owner and at least one contact. A deal is always tied to a company, and the company is DERIVED from the contacts (every contact must belong to the same company, which becomes the deal’s company). You do not pass a company id. Defaults to the org’s default pipeline and its first non-closed stage when those are not provided. Backed by
POST /api/v1/deals. By default this rejects (409) creating a second deal for a company that already has one. If you get that error and still want another deal for the company, retry with allow_duplicate=true. Closed-stage rules (400 on violation, detail prefixed with a marker): creating a deal directly in a Closed Won stage requires close_date AND amount; Closed Lost requires close_date; either requires an owner. Markers: close_date_required_for_won_stage, close_date_required_for_lost_stage, amount_required_for_won_stage, owner_required_for_closed_stage. Past close dates are allowed (backdating is a supported workflow). Args: name: Deal name (required). owner_id: Deal owner, user id or email (required). contact_ids: mashup_contact_ids to link (required, at least one). All must belong to the same company; that company becomes the deal’s company. Same id space as g8_search_contacts.id. Idempotent: already-linked contacts are skipped. company_id: Deprecated. The company is derived from the contacts. If provided it must match the contacts’ company, else omit it. description: Free-text description. amount: Monetary value. Required when creating directly in a Closed Won stage (0 is a valid amount). currency: Currency code (defaults to USD server-side). stage_id: Pipeline stage UUID (see g8_get_pipeline). Must exist (422 otherwise) and belong to pipeline_id when both are sent. pipeline_id: Pipeline UUID (defaults to org default). Must exist (422 otherwise). close_date: Expected close date (ISO 8601). Required when creating directly in a Closed Won or Closed Lost stage. allow_duplicate: Set true to create a deal even when one already exists for the company (default false).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
name | Yes | string | See the schema below for constraints and defaults. |
owner_id | Yes | string | See the schema below for constraints and defaults. |
contact_ids | Yes | array | See the schema below for constraints and defaults. |
company_id | No | integer / null | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
amount | No | number / null | See the schema below for constraints and defaults. |
currency | No | string / null | See the schema below for constraints and defaults. |
stage_id | No | string / null | See the schema below for constraints and defaults. |
pipeline_id | No | string / null | See the schema below for constraints and defaults. |
close_date | No | string / null | See the schema below for constraints and defaults. |
allow_duplicate | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "name": { "title": "Name", "type": "string" }, "owner_id": { "title": "Owner Id", "type": "string" }, "contact_ids": { "items": { "type": "integer" }, "title": "Contact Ids", "type": "array" }, "company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Company Id" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "amount": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Amount" }, "currency": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Currency" }, "stage_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Stage Id" }, "pipeline_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Pipeline Id" }, "close_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Close Date" }, "allow_duplicate": { "default": false, "title": "Allow Duplicate", "type": "boolean" } }, "required": [ "name", "owner_id", "contact_ids" ], "title": "g8_create_dealArguments", "type": "object"}g8_create_field
Create a SINGLE custom column on contacts or companies. DEPRECATED - prefer
g8_create_fields, which creates one OR many columns in one call. STRONGLY RECOMMENDED: passenrichment_providers=[...](andenrichment_email_verification=Truefor ZeroBounce email verification). Without them the column has NO enrichment pipeline, so the UI “Enrich” button andg8_enrich_contacts(waterfall mode) both fail with 422 until a pipeline is provisioned separately. Default to passingenrichment_providersunless the caller wants a placeholder column. Whenlist_idis set the column is list-scoped; when omitted it is global across the org.list_idis REQUIRED when supplyingenrichment_providers(waterfall pipelines are list-scoped). Onlydata_type="text"is supported today; unknown values 400. Allowed providers: graph8, hunter, prospeo, dropcontact, icypeas, leadmagic, emaillistverify, apollo, lusha, rocketreach. Response on success includes anenrichmentblock with thecolumn_idslug to pass tog8_enrich_contacts(waterfall mode). Args: title: Column title shown in the UI (e.g. “Work Email”) entity: Target entity - “contacts” or “companies” (default: contacts) list_id: List ID to scope the column. Required when supplyingenrichment_providers. data_type: Column data type (default: “text”) enrichment_providers: STRONGLY RECOMMENDED. Ordered list of provider names. When supplied, the new column ships with a runnable waterfall pipeline so the UI “Enrich” button works immediately.list_idbecomes required. enrichment_email_verification: When True, the auto-provisioned pipeline bolts ZeroBounce email verification on after enrichment. Recommended for any email-finder column. Ignored unless a pipeline is provisioned. enrichment_name: Optional pipeline name. Defaults to"<title> Enrichment". enrichment_target_field: The KIND of data this column holds - “phone” / “mobile” / “email” / “linkedin” or a canonical CONTACT_/COMPANY_ column. Pass this whenever the column is for a phone/mobile/etc. so each provider runs the CORRECT action (phone -> leadmagicmobile_finder, notemail_finder) - the same actions the UI’s “Add column -> Waterfall” picks. Combine withenrichment_providersto filter to those providers. Without it,enrichment_providersuses the legacy email-finder mapping.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
title | Yes | string | See the schema below for constraints and defaults. |
entity | No | string | See the schema below for constraints and defaults. |
list_id | No | integer / null | See the schema below for constraints and defaults. |
data_type | No | string | See the schema below for constraints and defaults. |
enrichment_providers | No | array / null | See the schema below for constraints and defaults. |
enrichment_email_verification | No | boolean | See the schema below for constraints and defaults. |
enrichment_name | No | string / null | See the schema below for constraints and defaults. |
enrichment_target_field | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "title": { "title": "Title", "type": "string" }, "entity": { "default": "contacts", "title": "Entity", "type": "string" }, "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "List Id" }, "data_type": { "default": "text", "title": "Data Type", "type": "string" }, "enrichment_providers": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Enrichment Providers" }, "enrichment_email_verification": { "default": false, "title": "Enrichment Email Verification", "type": "boolean" }, "enrichment_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Enrichment Name" }, "enrichment_target_field": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Enrichment Target Field" } }, "required": [ "title" ], "title": "g8_create_fieldArguments", "type": "object"}g8_create_fields
Create one OR many custom columns on contacts or companies in a single call. The default field-creation tool (prefer over deprecated
g8_create_field).fieldsis a list: one column or a batch, all created in one transaction with a single view rebuild.entityandlist_idare SHARED across every column. Each entry is a dict: { “title”: “Phone Number”, # required “data_type”: “text”, # optional, default “text” “enrichment_target_field”: “phone”, # RECOMMENDED for phone/email/etc. “enrichment_providers”: [“leadmagic”], # optional waterfall (filters template) “enrichment_email_verification”: true, # optional, ZeroBounce (email cols) “enrichment_name”: “Phone Enrichment” # optional pipeline name } Per-column enrichment works likeg8_create_field. Ship a runnable pipeline (else the UI “Enrich” button 422s) by passing eitherenrichment_target_field(RECOMMENDED - “phone”/“mobile”/“email”/ “linkedin” or a CONTACT_/COMPANY_ column, so each provider runs the CORRECT action: phone -> leadmagicmobile_finder, notemail_finder) and/orenrichment_providers.list_idis REQUIRED whenever ANY column carries a pipeline. For email columns also setenrichment_email_verification: true. Allowed providers: graph8, hunter, prospeo, dropcontact, icypeas, leadmagic, emaillistverify, apollo, lusha, rocketreach. Validation is fail-fast: invalid data_type, duplicate titles, or a bad enrichment block rejects the whole request and creates NOTHING. On success the response includestotal_createdand aresults[]array with each column’sid,name, and (if requested) itsenrichmentblock carrying thecolumn_idforg8_enrich_contacts. Args: fields: List of column specs (1-100). Each is a dict as shown above. entity: Target entity for ALL columns - “contacts” or “companies”. list_id: Shared list scope. REQUIRED if any field uses enrichment.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
fields | Yes | array | See the schema below for constraints and defaults. |
entity | No | string | See the schema below for constraints and defaults. |
list_id | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "fields": { "items": { "additionalProperties": true, "type": "object" }, "title": "Fields", "type": "array" }, "entity": { "default": "contacts", "title": "Entity", "type": "string" }, "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "List Id" } }, "required": [ "fields" ], "title": "g8_create_fieldsArguments", "type": "object"}g8_create_list
Create a contact or company list, optionally pre-populated. Source modes (pass at most one; default = empty list): - contact_ids: list[int] - add existing CRM contacts to the new list (free) - rows: list[dict] - import explicit records (free; no enrichment). Each row may contain any of: first_name, last_name, work_email, job_title, company_domain, seniority_level, linkedin_url, city, state, country, personal_emails, direct_phone, mobile_phone, job_department. - filters: list[dict] - search + save from open data (free, no credits). Same shape as g8_find_contacts; max_results caps how many are saved. When
filtersorrowsis supplied, call withdry_run=Truefirst to get a ConfirmationPreview. Re-call withdry_run=Falseto execute. Forcontact_idsand the empty-list mode the cost is zero, butdry_run=Trueis still honored if the caller wants a preview. Returns the new list’s id on success. Backward compatible: with no source params this is identical to the original empty-list creator. Args: title: List name (e.g. “Enterprise Q2 Targets”) type: List type - “contacts” or “companies” (default: contacts) contact_ids: Optional CRM contact ids to attach to the new list. rows: Optional list of record dicts to import into the list. filters: Optional g8_find_contacts-style filters to search and save. max_results: Cap on records saved whenfiltersis used (default 100). dry_run: When True, return a ConfirmationPreview instead of executing.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
title | Yes | string | See the schema below for constraints and defaults. |
type | No | string | See the schema below for constraints and defaults. |
contact_ids | No | array / null | See the schema below for constraints and defaults. |
rows | No | array / null | See the schema below for constraints and defaults. |
filters | No | array / null | See the schema below for constraints and defaults. |
max_results | No | integer | See the schema below for constraints and defaults. |
dry_run | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "title": { "title": "Title", "type": "string" }, "type": { "default": "contacts", "title": "Type", "type": "string" }, "contact_ids": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Contact Ids" }, "rows": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Rows" }, "filters": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Filters" }, "max_results": { "default": 100, "title": "Max Results", "type": "integer" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" } }, "required": [ "title" ], "title": "g8_create_listArguments", "type": "object"}g8_create_note
Add a note to a CRM contact, COMPANY or DEAL. Notes are polymorphic in graph8: contacts, companies and deals all file notes into the same store, so this one tool covers all three. Pass exactly ONE of contact_id / company_id / deal_id - whichever record the note belongs to. Use
deal_idfor deal-room context (budget, next steps, decision criteria); there is no separate “deal note” tool to look for. Backed byPOST /api/v1/{contacts\|companies\|deals}/{id}/notes. Args: content: Note body (plain text or markdown). An “@name” inside the body is parsed as a mention and NOTIFIES that teammate, so avoid stray ”@” text you did not mean as a ping. contact_id: Integer contact ID from g8_find_contacts. company_id: Integer company ID from g8_find_companies. deal_id: Deal UUID from g8_get_deals / g8_create_deal.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
content | Yes | string | See the schema below for constraints and defaults. |
contact_id | No | integer / null | See the schema below for constraints and defaults. |
company_id | No | integer / null | See the schema below for constraints and defaults. |
deal_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "content": { "title": "Content", "type": "string" }, "contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Contact Id" }, "company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Company Id" }, "deal_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Deal Id" } }, "required": [ "content" ], "title": "g8_create_noteArguments", "type": "object"}g8_create_quote
Create a new quote in
draftstatus. Always creates, never sends. At least one of signer_contact_id or signer_email is required. line_items must be non-empty. Each line-item dict (see g8_list_quotable_products): stripe_product_id + stripe_price_id, OR manual_product_id, OR neither (custom one-off); plus product_name (required), description, quantity, unit_amount (cents), discount_pct, billing_frequency, start_month, billing_start_date, sort_order. Recurring billing starts at contract start by default (start_month=1). Use start_month=3 for after 2 months, up to 120, or billing_start_date (YYYY-MM-DD) for an exact date, keeping start_month=1. Dates must be within the contract. The two start options cannot be combined. Args: title: Quote title (1-500 chars). line_items: Non-empty list of line-item dicts. signer_contact_id: Contact id of the e-signature recipient. signer_email: Direct signer email (used if signer_contact_id is omitted). signer_name: Display name to render on the quote. billing_contact_id: Optional separate billing contact id. billing_legal_name: Customer legal entity name shown on the quote. billing_primary_email: Billing contact email. billing_email: Secondary billing email. billing_address: Billing address (max 2000 chars). owner_id: Quote owner/AE (user id or email). Defaults to the API caller; set it to attribute the quote to a real rep. mashup_company_id: Company the quote is for. deal_id: Deal UUID to attach to. template_id: Optional quote-settings template id for branding. currency: 3-letter ISO currency, default USD. payment_terms: One of due_on_receipt / net_15 / net_30 / net_45 / net_60 / net_90. valid_until: ISO date for quote expiration. terms_content: Inline terms markdown (max 50k chars). privacy_content: Inline privacy markdown (max 50k chars). notes: Private notes (max 10k chars). public_notes: Public notes shown to signer (max 10k chars). tax_amount: Total tax in cents (default 0). contract_months: Month-equivalent for reporting/MRR, accepts fractions. contract_duration_value / contract_duration_unit: Exact term, e.g. 6 + weeks or 42 + days. contract_start_date / contract_end_date: ISO dates for contract window. accepted_payment_methods: Any subset of [ach, credit_card, wire]. marketing_rights: Any subset of [logo, quote, case_study].
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
title | Yes | string | See the schema below for constraints and defaults. |
line_items | Yes | array | See the schema below for constraints and defaults. |
signer_contact_id | No | integer / null | See the schema below for constraints and defaults. |
signer_email | No | string / null | See the schema below for constraints and defaults. |
signer_name | No | string / null | See the schema below for constraints and defaults. |
billing_contact_id | No | integer / null | See the schema below for constraints and defaults. |
billing_legal_name | No | string / null | See the schema below for constraints and defaults. |
billing_primary_email | No | string / null | See the schema below for constraints and defaults. |
billing_email | No | string / null | See the schema below for constraints and defaults. |
billing_address | No | string / null | See the schema below for constraints and defaults. |
mashup_company_id | No | integer / null | See the schema below for constraints and defaults. |
deal_id | No | string / null | See the schema below for constraints and defaults. |
owner_id | No | string / null | See the schema below for constraints and defaults. |
template_id | No | string / null | See the schema below for constraints and defaults. |
currency | No | string | See the schema below for constraints and defaults. |
payment_terms | No | string | See the schema below for constraints and defaults. |
valid_until | No | string / null | See the schema below for constraints and defaults. |
terms_content | No | string / null | See the schema below for constraints and defaults. |
privacy_content | No | string / null | See the schema below for constraints and defaults. |
notes | No | string / null | See the schema below for constraints and defaults. |
public_notes | No | string / null | See the schema below for constraints and defaults. |
tax_amount | No | integer | See the schema below for constraints and defaults. |
contract_months | No | number / null | See the schema below for constraints and defaults. |
contract_duration_value | No | number / null | See the schema below for constraints and defaults. |
contract_duration_unit | No | string / null | See the schema below for constraints and defaults. |
contract_start_date | No | string / null | See the schema below for constraints and defaults. |
contract_end_date | No | string / null | See the schema below for constraints and defaults. |
accepted_payment_methods | No | array / null | See the schema below for constraints and defaults. |
marketing_rights | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "title": { "title": "Title", "type": "string" }, "line_items": { "items": { "additionalProperties": true, "type": "object" }, "title": "Line Items", "type": "array" }, "signer_contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Signer Contact Id" }, "signer_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Signer Email" }, "signer_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Signer Name" }, "billing_contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Billing Contact Id" }, "billing_legal_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Legal Name" }, "billing_primary_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Primary Email" }, "billing_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Email" }, "billing_address": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Address" }, "mashup_company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Mashup Company Id" }, "deal_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Deal Id" }, "owner_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Owner Id" }, "template_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Template Id" }, "currency": { "default": "USD", "title": "Currency", "type": "string" }, "payment_terms": { "default": "net_30", "title": "Payment Terms", "type": "string" }, "valid_until": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Valid Until" }, "terms_content": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Terms Content" }, "privacy_content": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Privacy Content" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Notes" }, "public_notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Public Notes" }, "tax_amount": { "default": 0, "title": "Tax Amount", "type": "integer" }, "contract_months": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Contract Months" }, "contract_duration_value": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Contract Duration Value" }, "contract_duration_unit": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contract Duration Unit" }, "contract_start_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contract Start Date" }, "contract_end_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contract End Date" }, "accepted_payment_methods": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Accepted Payment Methods" }, "marketing_rights": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Marketing Rights" } }, "required": [ "title", "line_items" ], "title": "g8_create_quoteArguments", "type": "object"}g8_create_sequence
Create a new outbound sequence (drafted state). Confirm with the user before calling - this creates a real sequence. A “nurture” is a sequence with sequence_kind=“nurture”: same step types and structure, but pinned to one mailbox (pinned_mailbox_id) with a higher daily email cap. There is no separate nurture tool - pass sequence_kind=“nurture” plus pinned_mailbox_id here. Args: name: Sequence name user_email: Owner email description: Optional description finish_on_reply: Stop contacting on reply (default true) send_in_same_thread: Send follow-ups in same email thread wait_for_new_contacts: Keep sequence open for late-arriving contacts associated_list_id: Contact list ID to attach to the sequence (use g8_get_lists to find) steps: Sequence steps. Each item is a dict with: - step_order (int, 1-based) - step_type (str): one of EMAIL, PHONE, SMS, WHATSAPP, HEYREACH, MANUAL_DIALER. Note: LinkedIn outreach uses HEYREACH, not LINKEDIN. Case-insensitive. - input_type (str, default ON_DEMAND): one of ON_DEMAND, MANUAL_TEMPLATE, AI_GENERATED_TEMPLATE. Case-insensitive (e.g. ‘template’ -> MANUAL_TEMPLATE). - time_interval (int, seconds delay after previous step) - step_data (dict): EMAIL needs {subject, body}; SMS/WHATSAPP need {message_body}; HEYREACH needs {linkedin_action_type, …}; ON_DEMAND can use {instructions}. channels: Channels to attach. Each item is a dict with: - channel_id (int): mailbox/phone resource ID - channel_value (str): email address, phone number, etc. - channel_type (str): one of SMTP, GMAIL, INBOXKIT, PHONE, LINKEDIN, SMS, WHATSAPP. campaign_id: AI Studio campaign ID to link (optional) sequence_kind: Sequence kind, ‘cold_outbound’ (default) or ‘nurture’. Use ‘nurture’ for high-volume, single-mailbox nurture sends. Immutable after creation. pinned_mailbox_id: Mailbox ID to pin for nurture sequences. REQUIRED when sequence_kind=‘nurture’; all email channels must use this mailbox. Ignored for cold_outbound. (Nurture is gated by the ENABLE_NURTURE feature flag.) Example minimal email sequence: steps=[ {“step_order”: 1, “step_type”: “EMAIL”, “input_type”: “MANUAL_TEMPLATE”, “time_interval”: 0, “step_data”: {“subject”: “Hi {{first_name}}”, “body”: “Quick intro…”}}, {“step_order”: 2, “step_type”: “EMAIL”, “input_type”: “MANUAL_TEMPLATE”, “time_interval”: 259200, “step_data”: {“subject”: “Re: Hi {{first_name}}”, “body”: “Bumping this…”}}, ] Example nurture sequence (same step format, just pinned + kind): sequence_kind=“nurture”, pinned_mailbox_id=12345, steps=[…same shape as above…]
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
name | Yes | string | See the schema below for constraints and defaults. |
user_email | Yes | string | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
finish_on_reply | No | boolean | See the schema below for constraints and defaults. |
send_in_same_thread | No | boolean | See the schema below for constraints and defaults. |
wait_for_new_contacts | No | boolean | See the schema below for constraints and defaults. |
associated_list_id | No | integer / null | See the schema below for constraints and defaults. |
steps | No | array / null | See the schema below for constraints and defaults. |
channels | No | array / null | See the schema below for constraints and defaults. |
campaign_id | No | string / null | See the schema below for constraints and defaults. |
sequence_kind | No | string | See the schema below for constraints and defaults. |
pinned_mailbox_id | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "name": { "title": "Name", "type": "string" }, "user_email": { "title": "User Email", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "finish_on_reply": { "default": true, "title": "Finish On Reply", "type": "boolean" }, "send_in_same_thread": { "default": false, "title": "Send In Same Thread", "type": "boolean" }, "wait_for_new_contacts": { "default": false, "title": "Wait For New Contacts", "type": "boolean" }, "associated_list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Associated List Id" }, "steps": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Steps" }, "channels": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Channels" }, "campaign_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Campaign Id" }, "sequence_kind": { "default": "cold_outbound", "title": "Sequence Kind", "type": "string" }, "pinned_mailbox_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Pinned Mailbox Id" } }, "required": [ "name", "user_email" ], "title": "g8_create_sequenceArguments", "type": "object"}g8_create_task
Create a task linked to a contact or multiple typed business records. Args: tags: Task labels (up to 20, each 1-50 characters); [] clears labels on update. contact_id: Optional CRM contact. Otherwise supply records or entity_type/entity_id. records: Related records with entity_type and entity_id (contact, company, deal, lead, application, team_member). entity_type: Primary record type when records is omitted. entity_id: Primary record ID when records is omitted. source_url: Exact originating source URL, when known. task_type: Optional activity type, such as call or meeting. title: Task title. description: Optional long-form description. due_date: ISO 8601 due date. assignee_id: User ID to assign the task to. priority: 0=none, 1=high, 2=medium, 3=low; historical 4=low is preserved. parent_task_id: Optional parent task UUID. When set, this task is created as a subtask of the parent. Subtasks cannot themselves have subtasks (one level deep). subtask_sort_order: Optional sort position within the parent’s subtasks. Omit to append to the end.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
title | Yes | string | See the schema below for constraints and defaults. |
contact_id | No | integer / null | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
tags | No | array / null | See the schema below for constraints and defaults. |
due_date | No | string / null | See the schema below for constraints and defaults. |
assignee_id | No | string / null | See the schema below for constraints and defaults. |
priority | No | integer / null | See the schema below for constraints and defaults. |
parent_task_id | No | string / null | See the schema below for constraints and defaults. |
subtask_sort_order | No | integer / null | See the schema below for constraints and defaults. |
records | No | array / null | See the schema below for constraints and defaults. |
entity_type | No | string / null | See the schema below for constraints and defaults. |
entity_id | No | string / null | See the schema below for constraints and defaults. |
source_url | No | string / null | See the schema below for constraints and defaults. |
task_type | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "title": { "title": "Title", "type": "string" }, "contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Contact Id" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "tags": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Tags" }, "due_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Due Date" }, "assignee_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Assignee Id" }, "priority": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Priority" }, "parent_task_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Parent Task Id" }, "subtask_sort_order": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Subtask Sort Order" }, "records": { "anyOf": [ { "items": { "additionalProperties": { "type": "string" }, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Records" }, "entity_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Entity Type" }, "entity_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Entity Id" }, "source_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Source Url" }, "task_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Task Type" } }, "required": [ "title" ], "title": "g8_create_taskArguments", "type": "object"}g8_crm_assert_companies_batch
Assert Companies Batch. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /companies/assert/batch
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiBatchCompanyAssertRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiBatchCompanyAssertRequest": { "additionalProperties": false, "properties": { "companies": { "description": "Up to 100 companies with domain or linkedin_url", "items": { "additionalProperties": true, "type": "object" }, "maxItems": 100, "title": "Companies", "type": "array" }, "create_missing_fields": { "default": false, "description": "When true, any key in `custom_fields` that matches no existing column is created as a NEW list-scoped custom column (max 100 per request) and then written. Default false preserves the previous behaviour of not creating columns implicitly.", "title": "Create Missing Fields", "type": "boolean" }, "list_id": { "description": "Target list ID", "title": "List Id", "type": "integer" } }, "required": [ "companies", "list_id" ], "title": "ApiBatchCompanyAssertRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiBatchCompanyAssertRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_crm_assert_companies_batchArguments", "type": "object"}g8_crm_assert_company
Assert Company. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /companies/assert
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiCompanyAssertRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiCompanyAssertRequest": { "additionalProperties": false, "properties": { "annual_revenue": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Annual Revenue" }, "city": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "City" }, "country": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Country" }, "create_missing_fields": { "default": false, "description": "When true, any key in `custom_fields` that matches no existing column is created as a NEW list-scoped custom column (max 100 per request) and then written. Default false preserves the previous behaviour of not creating columns implicitly.", "title": "Create Missing Fields", "type": "boolean" }, "custom_fields": { "anyOf": [ { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "type": "object" }, { "type": "null" } ], "default": null, "description": "Custom column values to write on this record, keyed by the column's display title (e.g. 'Followup 1'), its slug (e.g. 'udo_followup_1_ab12cd34'), or a case/space variant of the title. Keys that match no existing column are reported back in `ignored_fields` unless `create_missing_fields` is true.", "title": "Custom Fields" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "domain": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Company domain (primary match key)", "title": "Domain" }, "employee_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Employee Count" }, "industry": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Industry" }, "linkedin_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "LinkedIn URL (fallback match key)", "title": "Linkedin Url" }, "list_id": { "description": "Target list ID", "title": "List Id", "type": "integer" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "state": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "State" }, "website": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Website" } }, "required": [ "list_id" ], "title": "ApiCompanyAssertRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiCompanyAssertRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_crm_assert_companyArguments", "type": "object"}g8_crm_assert_contact
Assert Contact. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /contacts/assert
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiContactAssertRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiContactAssertRequest": { "additionalProperties": false, "properties": { "city": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "City" }, "company_domain": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Company Domain" }, "country": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Country" }, "create_missing_fields": { "default": false, "description": "When true, any key in `custom_fields` that matches no existing column is created as a NEW list-scoped custom column (max 100 per request) and then written. Default false preserves the previous behaviour of not creating columns implicitly.", "title": "Create Missing Fields", "type": "boolean" }, "custom_fields": { "anyOf": [ { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "type": "object" }, { "type": "null" } ], "default": null, "description": "Custom column values to write on this record, keyed by the column's display title (e.g. 'Followup 1'), its slug (e.g. 'udo_followup_1_ab12cd34'), or a case/space variant of the title. Keys that match no existing column are reported back in `ignored_fields` unless `create_missing_fields` is true.", "title": "Custom Fields" }, "direct_phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Direct Phone" }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "First Name" }, "job_department": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Job Department" }, "job_title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Job Title" }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Last Name" }, "linkedin_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "LinkedIn URL (fallback match key)", "title": "Linkedin Url" }, "list_id": { "description": "Target list ID", "title": "List Id", "type": "integer" }, "mobile_phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Mobile Phone" }, "personal_emails": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Personal Emails" }, "seniority_level": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Seniority Level" }, "state": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "State" }, "work_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Work email (primary match key)", "title": "Work Email" } }, "required": [ "list_id" ], "title": "ApiContactAssertRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiContactAssertRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_crm_assert_contactArguments", "type": "object"}g8_crm_assert_contacts_batch
Assert Contacts Batch. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /contacts/assert/batch
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiBatchContactAssertRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiBatchContactAssertRequest": { "additionalProperties": false, "properties": { "contacts": { "description": "Up to 100 contacts with work_email or linkedin_url", "items": { "additionalProperties": true, "type": "object" }, "maxItems": 100, "title": "Contacts", "type": "array" }, "create_missing_fields": { "default": false, "description": "When true, any key in `custom_fields` that matches no existing column is created as a NEW list-scoped custom column (max 100 per request) and then written. Default false preserves the previous behaviour of not creating columns implicitly.", "title": "Create Missing Fields", "type": "boolean" }, "list_id": { "description": "Target list ID", "title": "List Id", "type": "integer" } }, "required": [ "contacts", "list_id" ], "title": "ApiBatchContactAssertRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiBatchContactAssertRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_crm_assert_contacts_batchArguments", "type": "object"}g8_crm_assert_deal
Assert Deal. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /deals/assert
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiDealAssertRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiDealAssertRequest": { "additionalProperties": false, "properties": { "amount": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Amount" }, "close_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Close Date" }, "company_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Company ID (match key, combined with name)", "title": "Company Id" }, "currency": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Currency" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "name": { "description": "Deal name (match key)", "title": "Name", "type": "string" }, "pipeline_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Pipeline Id" }, "stage_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Stage Id" } }, "required": [ "name" ], "title": "ApiDealAssertRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiDealAssertRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_crm_assert_dealArguments", "type": "object"}g8_crm_assert_deal_contact
Assert Deal Contact. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /contacts/{contact_id}/deals/assert
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | Yes | integer | Contact ID |
body | Yes | #/$defs/ApiDealContactAssertRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiDealContactAssertRequest": { "additionalProperties": false, "properties": { "deal_id": { "description": "Deal ID to associate", "title": "Deal Id", "type": "string" } }, "required": [ "deal_id" ], "title": "ApiDealContactAssertRequest", "type": "object" } }, "properties": { "contact_id": { "description": "Contact ID", "title": "Contact Id", "type": "integer" }, "body": { "$ref": "#/$defs/ApiDealContactAssertRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "contact_id", "body" ], "title": "g8_crm_assert_deal_contactArguments", "type": "object"}g8_crm_create_company_column
Create Company Column. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /companies/columns/create
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiCreateCompanyColumnRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiCreateCompanyColumnRequest": { "additionalProperties": false, "properties": { "created_by": { "description": "Email of the user creating the column (for audit).", "format": "email", "title": "Created By", "type": "string" }, "data_type": { "default": "text", "description": "Column data type. Currently only 'text' is supported.", "enum": [ "text", "int", "numeric", "boolean" ], "title": "Data Type", "type": "string" }, "enrichment": { "anyOf": [ { "$ref": "#/$defs/ApiCreateFieldEnrichmentInput" }, { "type": "null" } ], "default": null, "description": "STRONGLY RECOMMENDED. Optional waterfall enrichment block. When supplied, a companion `enrichment_configs` row is created alongside the column so the UI 'Enrich' button works immediately. Without it the column exists but isn't enrichable until a pipeline is configured via POST /enrichment/waterfall/configs." }, "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "If set, the column is list-scoped (only visible on that list). Required when `enrichment` is supplied - waterfall pipelines are list-scoped.", "title": "List Id" }, "title": { "description": "Column title shown in the UI (e.g. 'Tier')", "title": "Title", "type": "string" } }, "required": [ "created_by", "title" ], "title": "ApiCreateCompanyColumnRequest", "type": "object" }, "ApiCreateFieldEnrichmentInput": { "additionalProperties": false, "properties": { "email_verification": { "anyOf": [ { "$ref": "#/$defs/ApiEmailVerificationInput" }, { "type": "null" } ], "default": null, "description": "Optional post-enrichment email verification config." }, "field_to_enrich": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Target field identifier. Defaults to the new column's slug.", "title": "Field To Enrich" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Pipeline name. Defaults to `<column title> Enrichment` if omitted.", "title": "Name" }, "providers": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Ordered list of provider names. Without `target_field`, server maps each to its default email-finder action (legacy). With `target_field`, filters the column template to these providers (correct per-field action preserved). Mutually exclusive with `steps`.", "title": "Providers" }, "skip_existing_values": { "default": true, "description": "If true, skip rows where the target field is already populated.", "title": "Skip Existing Values", "type": "boolean" }, "steps": { "anyOf": [ { "items": { "$ref": "#/$defs/ApiWaterfallStepInput" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Full caller-supplied step list. Persisted verbatim. Mutually exclusive with `providers`.", "title": "Steps" }, "target_field": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Kind of data this column holds - CONTACT_DIRECT_PHONE, CONTACT_MOBILE_PHONE, CONTACT_WORK_EMAIL, CONTACT_LINKEDIN_URL, COMPANY_PHONE, ... or a friendly synonym ('phone', 'mobile', 'email', 'linkedin'). When set, the pipeline is built from the server's per-column TEMPLATE so each provider runs its CORRECT action for that data kind (e.g. leadmagic `mobile_finder` for a phone, NOT `email_finder`) - the same actions the web UI's 'Add column -> Waterfall' picks. Combine with `providers[]` to keep only those providers from the template. Mutually exclusive with `steps`. When omitted, the legacy `providers[]` email-finder shortcut is unchanged.", "title": "Target Field" }, "type": { "default": "waterfall", "description": "Pipeline kind. Only 'waterfall' is supported today.", "title": "Type", "type": "string" } }, "title": "ApiCreateFieldEnrichmentInput", "type": "object" }, "ApiEmailVerificationInput": { "additionalProperties": false, "properties": { "accept_catchall": { "default": false, "description": "Treat catch-all responses as valid (domains that accept any address).", "title": "Accept Catchall", "type": "boolean" }, "enabled": { "default": true, "description": "Enable post-enrichment email verification", "title": "Enabled", "type": "boolean" }, "provider": { "default": "zerobounce", "description": "Verification provider. Charges credits when use_system_credentials=True.", "enum": [ "zerobounce", "hunter", "icypeas", "leadmagic" ], "title": "Provider", "type": "string" }, "use_system_credentials": { "default": true, "description": "Use graph8-managed API keys (charges credits). False = use org's BYOK keys.", "title": "Use System Credentials", "type": "boolean" }, "valid_statuses": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Verification statuses to accept as valid. Typical: ['valid'] or ['valid','catch-all'].", "title": "Valid Statuses" } }, "title": "ApiEmailVerificationInput", "type": "object" }, "ApiWaterfallStepInput": { "additionalProperties": false, "properties": { "action": { "description": "Provider action: lookup_person, find_email, enrich_person, ...", "title": "Action", "type": "string" }, "action_display_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable label shown in UI. Auto-titled from `action` if omitted.", "title": "Action Display Name" }, "confidence_threshold": { "default": 0.0, "maximum": 1.0, "minimum": 0.0, "title": "Confidence Threshold", "type": "number" }, "config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Provider-specific options (e.g. apollo `reveal_phone_numbers=true`).", "title": "Config" }, "enabled": { "default": true, "title": "Enabled", "type": "boolean" }, "id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Step identifier. Auto-generated (`step_<provider>_<uuid8>`) if omitted.", "title": "Id" }, "input_mapping": { "anyOf": [ { "additionalProperties": { "type": "string" }, "type": "object" }, { "type": "null" } ], "default": null, "description": "Maps provider input names to graph8 column identifiers (CONTACT_*).", "title": "Input Mapping" }, "is_system_provider": { "default": false, "description": "True = use graph8-managed credentials + charge credits. False = use org BYOK.", "title": "Is System Provider", "type": "boolean" }, "max_retries": { "default": 0, "maximum": 3.0, "minimum": 0.0, "title": "Max Retries", "type": "integer" }, "order": { "default": 0, "description": "0-indexed execution order.", "minimum": 0.0, "title": "Order", "type": "integer" }, "output_field": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Dotted path the worker writes into (e.g. 'contact.work_email').", "title": "Output Field" }, "output_mapping": { "anyOf": [ { "additionalProperties": { "type": "string" }, "type": "object" }, { "type": "null" } ], "default": null, "description": "Optional output field remap (deprecated - prefer `output_field`).", "title": "Output Mapping" }, "provider": { "description": "Provider name: graph8, hunter, prospeo, dropcontact, apollo, ...", "title": "Provider", "type": "string" }, "stop_on_success": { "default": true, "title": "Stop On Success", "type": "boolean" } }, "required": [ "action", "provider" ], "title": "ApiWaterfallStepInput", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiCreateCompanyColumnRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_crm_create_company_columnArguments", "type": "object"}g8_crm_create_contact_column
Create Contact Column. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /contacts/columns/create
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiCreateContactColumnRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiCreateContactColumnRequest": { "additionalProperties": false, "properties": { "created_by": { "description": "Email of the user creating the column (for audit).", "format": "email", "title": "Created By", "type": "string" }, "data_type": { "default": "text", "description": "Column data type. Currently only 'text' is supported.", "enum": [ "text", "int", "numeric", "boolean" ], "title": "Data Type", "type": "string" }, "enrichment": { "anyOf": [ { "$ref": "#/$defs/ApiCreateFieldEnrichmentInput" }, { "type": "null" } ], "default": null, "description": "STRONGLY RECOMMENDED. Optional waterfall enrichment block. When supplied, a companion `enrichment_configs` row is created alongside the column so the UI 'Enrich' button works immediately. Without it the column exists but isn't enrichable until a pipeline is configured via POST /enrichment/waterfall/configs." }, "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "If set, the column is list-scoped (only visible on that list). Required when `enrichment` is supplied - waterfall pipelines are list-scoped.", "title": "List Id" }, "title": { "description": "Column title shown in the UI (e.g. 'Lead Score')", "title": "Title", "type": "string" } }, "required": [ "created_by", "title" ], "title": "ApiCreateContactColumnRequest", "type": "object" }, "ApiCreateFieldEnrichmentInput": { "additionalProperties": false, "properties": { "email_verification": { "anyOf": [ { "$ref": "#/$defs/ApiEmailVerificationInput" }, { "type": "null" } ], "default": null, "description": "Optional post-enrichment email verification config." }, "field_to_enrich": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Target field identifier. Defaults to the new column's slug.", "title": "Field To Enrich" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Pipeline name. Defaults to `<column title> Enrichment` if omitted.", "title": "Name" }, "providers": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Ordered list of provider names. Without `target_field`, server maps each to its default email-finder action (legacy). With `target_field`, filters the column template to these providers (correct per-field action preserved). Mutually exclusive with `steps`.", "title": "Providers" }, "skip_existing_values": { "default": true, "description": "If true, skip rows where the target field is already populated.", "title": "Skip Existing Values", "type": "boolean" }, "steps": { "anyOf": [ { "items": { "$ref": "#/$defs/ApiWaterfallStepInput" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Full caller-supplied step list. Persisted verbatim. Mutually exclusive with `providers`.", "title": "Steps" }, "target_field": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Kind of data this column holds - CONTACT_DIRECT_PHONE, CONTACT_MOBILE_PHONE, CONTACT_WORK_EMAIL, CONTACT_LINKEDIN_URL, COMPANY_PHONE, ... or a friendly synonym ('phone', 'mobile', 'email', 'linkedin'). When set, the pipeline is built from the server's per-column TEMPLATE so each provider runs its CORRECT action for that data kind (e.g. leadmagic `mobile_finder` for a phone, NOT `email_finder`) - the same actions the web UI's 'Add column -> Waterfall' picks. Combine with `providers[]` to keep only those providers from the template. Mutually exclusive with `steps`. When omitted, the legacy `providers[]` email-finder shortcut is unchanged.", "title": "Target Field" }, "type": { "default": "waterfall", "description": "Pipeline kind. Only 'waterfall' is supported today.", "title": "Type", "type": "string" } }, "title": "ApiCreateFieldEnrichmentInput", "type": "object" }, "ApiEmailVerificationInput": { "additionalProperties": false, "properties": { "accept_catchall": { "default": false, "description": "Treat catch-all responses as valid (domains that accept any address).", "title": "Accept Catchall", "type": "boolean" }, "enabled": { "default": true, "description": "Enable post-enrichment email verification", "title": "Enabled", "type": "boolean" }, "provider": { "default": "zerobounce", "description": "Verification provider. Charges credits when use_system_credentials=True.", "enum": [ "zerobounce", "hunter", "icypeas", "leadmagic" ], "title": "Provider", "type": "string" }, "use_system_credentials": { "default": true, "description": "Use graph8-managed API keys (charges credits). False = use org's BYOK keys.", "title": "Use System Credentials", "type": "boolean" }, "valid_statuses": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Verification statuses to accept as valid. Typical: ['valid'] or ['valid','catch-all'].", "title": "Valid Statuses" } }, "title": "ApiEmailVerificationInput", "type": "object" }, "ApiWaterfallStepInput": { "additionalProperties": false, "properties": { "action": { "description": "Provider action: lookup_person, find_email, enrich_person, ...", "title": "Action", "type": "string" }, "action_display_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable label shown in UI. Auto-titled from `action` if omitted.", "title": "Action Display Name" }, "confidence_threshold": { "default": 0.0, "maximum": 1.0, "minimum": 0.0, "title": "Confidence Threshold", "type": "number" }, "config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Provider-specific options (e.g. apollo `reveal_phone_numbers=true`).", "title": "Config" }, "enabled": { "default": true, "title": "Enabled", "type": "boolean" }, "id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Step identifier. Auto-generated (`step_<provider>_<uuid8>`) if omitted.", "title": "Id" }, "input_mapping": { "anyOf": [ { "additionalProperties": { "type": "string" }, "type": "object" }, { "type": "null" } ], "default": null, "description": "Maps provider input names to graph8 column identifiers (CONTACT_*).", "title": "Input Mapping" }, "is_system_provider": { "default": false, "description": "True = use graph8-managed credentials + charge credits. False = use org BYOK.", "title": "Is System Provider", "type": "boolean" }, "max_retries": { "default": 0, "maximum": 3.0, "minimum": 0.0, "title": "Max Retries", "type": "integer" }, "order": { "default": 0, "description": "0-indexed execution order.", "minimum": 0.0, "title": "Order", "type": "integer" }, "output_field": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Dotted path the worker writes into (e.g. 'contact.work_email').", "title": "Output Field" }, "output_mapping": { "anyOf": [ { "additionalProperties": { "type": "string" }, "type": "object" }, { "type": "null" } ], "default": null, "description": "Optional output field remap (deprecated - prefer `output_field`).", "title": "Output Mapping" }, "provider": { "description": "Provider name: graph8, hunter, prospeo, dropcontact, apollo, ...", "title": "Provider", "type": "string" }, "stop_on_success": { "default": true, "title": "Stop On Success", "type": "boolean" } }, "required": [ "action", "provider" ], "title": "ApiWaterfallStepInput", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiCreateContactColumnRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_crm_create_contact_columnArguments", "type": "object"}g8_crm_delete_company
Delete Company. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /companies/{company_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
company_id | Yes | integer | Company ID |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "company_id": { "description": "Company ID", "title": "Company Id", "type": "integer" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "company_id" ], "title": "g8_crm_delete_companyArguments", "type": "object"}g8_crm_delete_company_column
Delete Company Column. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /companies/columns/{column_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
column_id | Yes | integer | ID of the column to delete |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "column_id": { "description": "ID of the column to delete", "title": "Column Id", "type": "integer" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "column_id" ], "title": "g8_crm_delete_company_columnArguments", "type": "object"}g8_crm_delete_contact
Delete Contact. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /contacts/{contact_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | Yes | integer | Contact ID |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "contact_id": { "description": "Contact ID", "title": "Contact Id", "type": "integer" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "contact_id" ], "title": "g8_crm_delete_contactArguments", "type": "object"}g8_crm_delete_contact_column
Delete Contact Column. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /contacts/columns/{column_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
column_id | Yes | integer | ID of the column to delete |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "column_id": { "description": "ID of the column to delete", "title": "Column Id", "type": "integer" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "column_id" ], "title": "g8_crm_delete_contact_columnArguments", "type": "object"}g8_crm_delete_list
Delete List. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /lists/{list_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
list_id | Yes | integer | List ID |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "list_id": { "description": "List ID", "title": "List Id", "type": "integer" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "list_id" ], "title": "g8_crm_delete_listArguments", "type": "object"}g8_crm_get_company
Get Company. Uses the current organization and existing API permissions. API: GET /companies/{company_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
company_id | Yes | integer | Company ID |
include_custom_fields | No | boolean / null | When true, the response includes a custom_fields object of custom column values keyed by column slug. Default false omits it. |
Complete input schema
{ "properties": { "company_id": { "description": "Company ID", "title": "Company Id", "type": "integer" }, "include_custom_fields": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "When true, the response includes a `custom_fields` object of custom column values keyed by column slug. Default false omits it.", "title": "Include Custom Fields" } }, "required": [ "company_id" ], "title": "g8_crm_get_companyArguments", "type": "object"}g8_crm_get_list_contacts
Get List Contacts. Uses the current organization and existing API permissions. API: GET /lists/{list_id}/contacts
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
list_id | Yes | integer | List ID |
page | No | integer / null | Page number (1-indexed) |
limit | No | integer / null | Items per page (max 200) |
Complete input schema
{ "properties": { "list_id": { "description": "List ID", "title": "List Id", "type": "integer" }, "page": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Page number (1-indexed)", "title": "Page" }, "limit": { "anyOf": [ { "maximum": 200, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Items per page (max 200)", "title": "Limit" } }, "required": [ "list_id" ], "title": "g8_crm_get_list_contactsArguments", "type": "object"}g8_crm_list_company_columns
List Company Columns. Uses the current organization and existing API permissions. API: GET /companies/columns
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
list_id | No | integer / null | Optional list ID. When provided, list-specific dynamic columns are included alongside global ones. |
Complete input schema
{ "properties": { "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "Optional list ID. When provided, list-specific dynamic columns are included alongside global ones.", "title": "List Id" } }, "title": "g8_crm_list_company_columnsArguments", "type": "object"}g8_crm_list_contact_columns
List Contact Columns. Uses the current organization and existing API permissions. API: GET /contacts/columns
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
list_id | No | integer / null | Optional list ID. When provided, list-specific dynamic columns are included alongside global ones. |
Complete input schema
{ "properties": { "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "description": "Optional list ID. When provided, list-specific dynamic columns are included alongside global ones.", "title": "List Id" } }, "title": "g8_crm_list_contact_columnsArguments", "type": "object"}g8_crm_list_contact_tasks
List Contact Tasks. Uses the current organization and existing API permissions. API: GET /contacts/{contact_id}/tasks
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | Yes | integer | Contact ID |
status | No | string / null | Filter by status (open, completed) |
Complete input schema
{ "properties": { "contact_id": { "description": "Contact ID", "title": "Contact Id", "type": "integer" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Filter by status (open, completed)", "title": "Status" } }, "required": [ "contact_id" ], "title": "g8_crm_list_contact_tasksArguments", "type": "object"}g8_crm_list_duplicates
Find duplicate records, and review merges that already happened. Four views over one surface: -
suggestions(default): candidate duplicate PAIRS awaiting a decision, with their confidence and the fields that matched. Each carries a suggestion id - that is whatg8_crm_resolve_duplicatetakes. -counts: how many pairs are pending. Cheap; use it to answer “do we have a duplicates problem?” without pulling rows. -recent_merges: merges already applied, each withcan_undo.can_undofalse means the 30-day undo window has closed or the merge is not reversible - do not offer an undo it will refuse. -merge_status: progress of one bulk-merge run. Needsrun_id, which comes from a run started in the app’s duplicate review screen; this surface does not start merge runs. Rows are already narrowed to what the calling key may see, so an empty result means “none visible to you”, which is not always the same as “none exist”. Args: entity_type: contact | company | deal. Required for suggestions and counts. Note deals can be SUGGESTED and rejected but never merged. view: suggestions | counts | recent_merges | merge_status. status: Suggestion status filter, default “pending”. search: Substring match on the records in the pair. confidence: Confidence band filter. owner_id: Only pairs owned by this user. lifecycle_stage: Comma-separated lifecycle stages to filter by. run_id: The bulk-merge run to poll, merge_status only. include_shadow: recent_merges only - include shadow merges. cursor: Opaque page cursor from a previous suggestions page. limit: Rows per page (1-100, default 25).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
entity_type | No | string | See the schema below for constraints and defaults. |
view | No | string | See the schema below for constraints and defaults. |
status | No | string | See the schema below for constraints and defaults. |
search | No | string / null | See the schema below for constraints and defaults. |
confidence | No | string / null | See the schema below for constraints and defaults. |
owner_id | No | string / null | See the schema below for constraints and defaults. |
lifecycle_stage | No | string / null | See the schema below for constraints and defaults. |
run_id | No | string / null | See the schema below for constraints and defaults. |
include_shadow | No | boolean | See the schema below for constraints and defaults. |
cursor | No | string / null | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "entity_type": { "default": "contact", "title": "Entity Type", "type": "string" }, "view": { "default": "suggestions", "title": "View", "type": "string" }, "status": { "default": "pending", "title": "Status", "type": "string" }, "search": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Search" }, "confidence": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Confidence" }, "owner_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Owner Id" }, "lifecycle_stage": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Lifecycle Stage" }, "run_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Run Id" }, "include_shadow": { "default": false, "title": "Include Shadow", "type": "boolean" }, "cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Cursor" }, "limit": { "default": 25, "title": "Limit", "type": "integer" } }, "title": "g8_crm_list_duplicatesArguments", "type": "object"}g8_crm_list_suppressions
List the org’s do-not-contact ledger - who may NOT be contacted. This is the same ledger every send path checks (sequencer, newsletter, audience sync), so a contact listed here will not be reached by any of them. Use it to reconcile an external suppression list, to audit what the org is blocking and why, or to answer “how many people have opted out”. To check ONE contact, use
g8_get_contact_detail(include_suppression=True)instead of paging this. To suppress or reinstate, useg8_update_contact. Rows carry NO contact PII - no email, phone or name, onlycontact_id. Resolve a person withg8_get_contact_detail.categorysays who set the block, and whether it may be lifted: -contact_initiated: they asked (an unsubscribe). NEVER lift it. -org_initiated: your own operator block. Reversible by you. -system: a hard bounce, complaint or DNC-registry hit. Args: channel: all | email | phone | linkedin. Filters the way the SEND gate filters:allrows, because a contact blocked on every channel is blocked for email too. Passallto see only the umbrella rows. Omit it for the whole ledger. category: contact_initiated | org_initiated | system. Exact match - unlike channel, there is no umbrella category. limit: Rows per page (1-500, default 50). offset: Rows to skip, for paging. Only ACTIVE (uncleared) rows are returned, so a lifted suppression simply disappears rather than showing as cleared.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
channel | No | string / null | See the schema below for constraints and defaults. |
category | No | string / null | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
offset | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "channel": { "anyOf": [ { "enum": [ "all", "email", "phone", "linkedin" ], "type": "string" }, { "type": "null" } ], "default": null, "title": "Channel" }, "category": { "anyOf": [ { "enum": [ "contact_initiated", "org_initiated", "system" ], "type": "string" }, { "type": "null" } ], "default": null, "title": "Category" }, "limit": { "default": 50, "title": "Limit", "type": "integer" }, "offset": { "default": 0, "title": "Offset", "type": "integer" } }, "title": "g8_crm_list_suppressionsArguments", "type": "object"}g8_crm_remove_contacts_from_list
Remove Contacts From List. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /lists/{list_id}/contacts
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
list_id | Yes | integer | List ID |
body | Yes | #/$defs/ApiRemoveContactsFromListRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiRemoveContactsFromListRequest": { "additionalProperties": false, "properties": { "contact_ids": { "description": "List of contact IDs to remove", "items": { "type": "integer" }, "title": "Contact Ids", "type": "array" } }, "required": [ "contact_ids" ], "title": "ApiRemoveContactsFromListRequest", "type": "object" } }, "properties": { "list_id": { "description": "List ID", "title": "List Id", "type": "integer" }, "body": { "$ref": "#/$defs/ApiRemoveContactsFromListRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "list_id", "body" ], "title": "g8_crm_remove_contacts_from_listArguments", "type": "object"}g8_crm_resolve_duplicate
Dismiss a suggested duplicate pair, or undo a merge. Two decisions, one per id: -
suggestion_id(fromg8_crm_list_duplicates): the pair is NOT a duplicate. This is permanent - there is no un-reject, and the pair will not be suggested again. It changes no contact, company or deal record; only the suggestion is marked. -merge_history_id(from therecent_mergesview, wherecan_undois true): reverse a merge that already happened, restoring the record that was merged away. Only within its 30-day window, and only for contacts and companies. MERGING pairs is deliberately not available here: choosing which record survives a merge is a decision a person makes, and this surface offers no way to show them the outcome first. Point the user at the duplicate review screen for that, then useview="merge_status"andview="recent_merges"to follow it. Args: suggestion_id: Pair to dismiss permanently. merge_history_id: Merge to reverse. reason: Why, recorded on the dismissal. Optional. confirm: Required. Both actions are consequential and neither has a preview.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
suggestion_id | No | string / null | See the schema below for constraints and defaults. |
merge_history_id | No | string / null | See the schema below for constraints and defaults. |
reason | No | string / null | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "suggestion_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Suggestion Id" }, "merge_history_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Merge History Id" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Reason" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "title": "g8_crm_resolve_duplicateArguments", "type": "object"}g8_crm_update_company
Update Company. Uses the current organization and existing API permissions.
bodyedits the company’s own fields.lifecycle_stagemoves it through the revenue lifecycle (Suspects -> Leads -> Trial -> Customers -> Churned, plus any custom stages), which writes the revenue overlay rather than the company record and leaves an audit entry. Pass either, or both. Moving tocustomersis refused unless the company has a live subscription - the same guard the app enforces, so a manual “mark them a customer” cannot silently disagree with billing. With both, the field edit runs first and the stage move second, as two separate writes: on an error assume a partial change and re-read the company. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PATCH /companies/{company_id} and POST /companies/{company_id}/lifecycle-stage
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
company_id | Yes | integer | Company ID |
body | No | #/$defs/ApiCompanyUpdateRequest / null | See the schema below for constraints and defaults. |
lifecycle_stage | No | string / null | Move the company to this revenue lifecycle stage. Use a slug from g8_get_pipeline(include_lifecycle=True); an unknown slug is rejected with the list of valid ones. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiCompanyUpdateRequest": { "additionalProperties": false, "properties": { "address": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Address" }, "city": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "City" }, "country": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Country" }, "domain": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Domain" }, "employee_count": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Employee Count" }, "industry": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Industry" }, "linkedin_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Linkedin Url" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Phone" }, "state": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "State" }, "website": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Website" }, "zip": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Zip" } }, "title": "ApiCompanyUpdateRequest", "type": "object" } }, "properties": { "company_id": { "description": "Company ID", "title": "Company Id", "type": "integer" }, "body": { "anyOf": [ { "$ref": "#/$defs/ApiCompanyUpdateRequest" }, { "type": "null" } ], "default": null }, "lifecycle_stage": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Move the company to this revenue lifecycle stage. Use a `slug` from g8_get_pipeline(include_lifecycle=True); an unknown slug is rejected with the list of valid ones.", "title": "Lifecycle Stage" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "company_id" ], "title": "g8_crm_update_companyArguments", "type": "object"}g8_crm_update_list
Update List. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PATCH /lists/{list_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
list_id | Yes | integer | List ID |
body | Yes | #/$defs/ApiListUpdateRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiListUpdateRequest": { "additionalProperties": false, "properties": { "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "New purpose note for the list (#16641). Omit to leave the current description unchanged; send an empty string to clear it.", "title": "Description" }, "title": { "description": "New name for the list", "minLength": 1, "title": "Title", "type": "string" } }, "required": [ "title" ], "title": "ApiListUpdateRequest", "type": "object" } }, "properties": { "list_id": { "description": "List ID", "title": "List Id", "type": "integer" }, "body": { "$ref": "#/$defs/ApiListUpdateRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "list_id", "body" ], "title": "g8_crm_update_listArguments", "type": "object"}g8_crm_update_quote
Update Quote. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PATCH /quotes/{quote_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
quote_id | Yes | string | Quote UUID |
body | Yes | #/$defs/ApiQuoteUpdateRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiQuoteLineItemRequest": { "additionalProperties": false, "properties": { "billing_frequency": { "anyOf": [ { "enum": [ "one_time", "month", "year", "quarter" ], "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Frequency" }, "billing_start_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Exact recurring billing start date within the contract; start_month must remain 1 when supplied.", "title": "Billing Start Date" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "discount_pct": { "default": 0, "maximum": 100.0, "minimum": 0.0, "title": "Discount Pct", "type": "number" }, "manual_product_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Manual Product Id" }, "product_name": { "maxLength": 255, "minLength": 1, "title": "Product Name", "type": "string" }, "quantity": { "default": 1, "maximum": 10000.0, "minimum": 1.0, "title": "Quantity", "type": "integer" }, "sort_order": { "default": 0, "title": "Sort Order", "type": "integer" }, "start_month": { "default": 1, "description": "Contract month when recurring billing begins; 1 means at contract start. Use billing_start_date instead for an exact date.", "maximum": 120.0, "minimum": 1.0, "title": "Start Month", "type": "integer" }, "stripe_price_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Stripe Price Id" }, "stripe_product_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Stripe Product Id" }, "unit_amount": { "description": "In cents", "maximum": 1000000000.0, "minimum": 0.0, "title": "Unit Amount", "type": "integer" } }, "required": [ "product_name", "unit_amount" ], "title": "ApiQuoteLineItemRequest", "type": "object" }, "ApiQuoteUpdateRequest": { "additionalProperties": false, "properties": { "accepted_payment_methods": { "anyOf": [ { "items": { "enum": [ "ach", "credit_card", "wire" ], "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Accepted Payment Methods" }, "billing_address": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Address" }, "billing_contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Billing Contact Id" }, "billing_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Email" }, "billing_legal_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Legal Name" }, "billing_primary_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Primary Email" }, "contract_duration_unit": { "anyOf": [ { "enum": [ "months", "weeks", "days" ], "type": "string" }, { "type": "null" } ], "default": null, "title": "Contract Duration Unit" }, "contract_duration_value": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Contract Duration Value" }, "contract_end_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contract End Date" }, "contract_months": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Contract Months" }, "contract_start_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contract Start Date" }, "currency": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Currency" }, "deal_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Deal Id" }, "line_items": { "anyOf": [ { "items": { "$ref": "#/$defs/ApiQuoteLineItemRequest" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Line Items" }, "marketing_rights": { "anyOf": [ { "items": { "enum": [ "logo", "quote", "case_study" ], "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Marketing Rights" }, "mashup_company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Mashup Company Id" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Notes" }, "owner_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Owner Id" }, "payment_terms": { "anyOf": [ { "enum": [ "due_on_receipt", "net_15", "net_30", "net_45", "net_60", "net_90" ], "type": "string" }, { "type": "null" } ], "default": null, "title": "Payment Terms" }, "privacy_content": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Privacy Content" }, "public_notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Public Notes" }, "signer_contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Signer Contact Id" }, "signer_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Signer Email" }, "signer_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Signer Name" }, "tax_amount": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Tax Amount" }, "terms_content": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Terms Content" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Title" }, "valid_until": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Valid Until" } }, "title": "ApiQuoteUpdateRequest", "type": "object" } }, "properties": { "quote_id": { "description": "Quote UUID", "title": "Quote Id", "type": "string" }, "body": { "$ref": "#/$defs/ApiQuoteUpdateRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "quote_id", "body" ], "title": "g8_crm_update_quoteArguments", "type": "object"}g8_current_org
Report which organization your MCP actions currently run against. Call when unsure which org is active before reading or writing org data. SURFACE THE RESULT TO THE USER, do not treat it as silent setup. When you call this at session start, briefly tell the user which org they are acting in, and if the result carries an
activitybrief, present it: for mode ‘resume’ show the “pick up where you left off” items (name + type) so they can continue prior work; for ‘onboarding’ offer the first setup steps; for ‘suggest’ offer the next actions. One short line or list is enough - the point is the user should SEE where to pick up, not have to ask. For mode ‘provisioning’ the workspace is still being set up: say so, note it usually takes under a minute, and offer to check again shortly. Re-call this tool when the user asks - a provisioning brief does not consume the once-per-session brief, so re-calling is correct here (and only here). If the brief carries first_connect=true, welcome the user to graph8, offer the get_started prompt for a guided walkthrough, and mention they can open their workspace in the browser via activity.app_url. Call this ONCE at session start and not again unless the user switches org (or you are re-checking a ‘provisioning’ brief). Ifaction_requiredis true the user belongs to multiple orgs and has not chosen one yet - list orgs with g8_list_orgs and ASK which to use before any write.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_current_orgArguments", "type": "object"}g8_dashboard_chat_edit_app_page
Chat Edit App Page. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /app-pages/{page_id}/chat-edit
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
body | Yes | #/$defs/ApiAppPageChatEditRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiAppPageChatEditRequest": { "additionalProperties": false, "properties": { "instruction": { "maxLength": 2000, "minLength": 1, "title": "Instruction", "type": "string" } }, "required": [ "instruction" ], "title": "ApiAppPageChatEditRequest", "type": "object" } }, "properties": { "page_id": { "title": "Page Id", "type": "string" }, "body": { "$ref": "#/$defs/ApiAppPageChatEditRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "page_id", "body" ], "title": "g8_dashboard_chat_edit_app_pageArguments", "type": "object"}g8_dashboard_create_app_page
Create App Page. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /app-pages
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiCreateAppPageRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiAppPageSourceDto": { "additionalProperties": false, "properties": { "alias": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Handle used inside the page. Auto-assigned from the kind when omitted.", "title": "Alias" }, "position": { "default": 0, "title": "Position", "type": "integer" }, "role": { "default": "data", "title": "Role", "type": "string" }, "source_id": { "description": "Opaque to everything but the connector that owns it", "title": "Source Id", "type": "string" }, "source_kind": { "description": "Connector family, e.g. staging-table or custom-object", "title": "Source Kind", "type": "string" } }, "required": [ "source_id", "source_kind" ], "title": "ApiAppPageSourceDto", "type": "object" }, "ApiCreateAppPageRequest": { "additionalProperties": false, "properties": { "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "name": { "title": "Name", "type": "string" }, "sources": { "description": "At least one. A page with no data source can never be generated.", "items": { "$ref": "#/$defs/ApiAppPageSourceDto" }, "minItems": 1, "title": "Sources", "type": "array" } }, "required": [ "name", "sources" ], "title": "ApiCreateAppPageRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiCreateAppPageRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_dashboard_create_app_pageArguments", "type": "object"}g8_dashboard_delete_app_page
Delete App Page. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /app-pages/{page_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page_id": { "title": "Page Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "page_id" ], "title": "g8_dashboard_delete_app_pageArguments", "type": "object"}g8_dashboard_generate_app_page
Generate App Page. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /app-pages/{page_id}/generate
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
body | Yes | #/$defs/ApiGenerateAppPageRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiGenerateAppPageRequest": { "additionalProperties": false, "properties": { "instruction": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "What the page should show. Free text; the generator composes every bound source.", "title": "Instruction" } }, "title": "ApiGenerateAppPageRequest", "type": "object" } }, "properties": { "page_id": { "title": "Page Id", "type": "string" }, "body": { "$ref": "#/$defs/ApiGenerateAppPageRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "page_id", "body" ], "title": "g8_dashboard_generate_app_pageArguments", "type": "object"}g8_dashboard_get_app_page
Get App Page. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /app-pages/{page_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page_id": { "title": "Page Id", "type": "string" } }, "required": [ "page_id" ], "title": "g8_dashboard_get_app_pageArguments", "type": "object"}g8_dashboard_get_app_page_artifact
Get App Page Artifact. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /app-pages/{page_id}/artifact
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page_id": { "title": "Page Id", "type": "string" } }, "required": [ "page_id" ], "title": "g8_dashboard_get_app_page_artifactArguments", "type": "object"}g8_dashboard_get_app_page_status
Get App Page Status. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /app-pages/{page_id}/status
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page_id": { "title": "Page Id", "type": "string" } }, "required": [ "page_id" ], "title": "g8_dashboard_get_app_page_statusArguments", "type": "object"}g8_dashboard_invoke_app_page_action
Invoke App Page Action. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /app-pages/{page_id}/actions/{alias}/{action_name}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
alias | Yes | string | See the schema below for constraints and defaults. |
action_name | Yes | string | See the schema below for constraints and defaults. |
body | Yes | #/$defs/ApiInvokeActionRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiInvokeActionRequest": { "additionalProperties": false, "properties": { "args": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Action arguments. Validated against the object's own schema; an undeclared field is refused, not dropped.", "title": "Args" } }, "title": "ApiInvokeActionRequest", "type": "object" } }, "properties": { "page_id": { "title": "Page Id", "type": "string" }, "alias": { "title": "Alias", "type": "string" }, "action_name": { "title": "Action Name", "type": "string" }, "body": { "$ref": "#/$defs/ApiInvokeActionRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "page_id", "alias", "action_name", "body" ], "title": "g8_dashboard_invoke_app_page_actionArguments", "type": "object"}g8_dashboard_list_app_page_actions
List App Page Actions. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /app-pages/{page_id}/actions
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page_id": { "title": "Page Id", "type": "string" } }, "required": [ "page_id" ], "title": "g8_dashboard_list_app_page_actionsArguments", "type": "object"}g8_dashboard_list_app_page_versions
List App Page Versions. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /app-pages/{page_id}/versions
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page_id": { "title": "Page Id", "type": "string" } }, "required": [ "page_id" ], "title": "g8_dashboard_list_app_page_versionsArguments", "type": "object"}g8_dashboard_list_app_pages
List App Pages. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /app-pages
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_dashboard_list_app_pagesArguments", "type": "object"}g8_dashboard_mint_app_page_frame_session
Mint App Page Frame Session. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /app-pages/{page_id}/frame-session
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page_id": { "title": "Page Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "page_id" ], "title": "g8_dashboard_mint_app_page_frame_sessionArguments", "type": "object"}g8_dashboard_restore_app_page_version
Restore App Page Version. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /app-pages/{page_id}/versions/{version_num}/restore
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
version_num | Yes | integer | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page_id": { "title": "Page Id", "type": "string" }, "version_num": { "title": "Version Num", "type": "integer" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "page_id", "version_num" ], "title": "g8_dashboard_restore_app_page_versionArguments", "type": "object"}g8_delete_audience_sync
Delete an audience sync configuration (soft delete). IMPORTANT: This deactivates the sync. The audience data on the ad platform is NOT deleted - manage that directly in the platform. Args: config_id: Sync config ID
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
config_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "config_id": { "title": "Config Id", "type": "integer" } }, "required": [ "config_id" ], "title": "g8_delete_audience_syncArguments", "type": "object"}g8_delete_deal
Delete a deal by ID. Irreversible. Backed by
DELETE /api/v1/deals/{deal_id}. Args: deal_id: Deal UUID returned by g8_get_deals / g8_create_deal.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
deal_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "deal_id": { "title": "Deal Id", "type": "string" } }, "required": [ "deal_id" ], "title": "g8_delete_dealArguments", "type": "object"}g8_delete_field
Soft-delete a custom column from contacts or companies. Always org-scoped. Pass
list_idto additionally require that the column belong to a specific list - that is the safer default for list-scoped agents because the org may have many custom columns across different lists with similar names. Args: column_id: Column ID to delete (from g8_list_fields or g8_create_field) entity: Target entity - “contacts” or “companies” (default: contacts) list_id: Optional list scope guard. If set, returns 404 unless the column belongs to this list - prevents cross-list deletion.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
column_id | Yes | integer | See the schema below for constraints and defaults. |
entity | No | string | See the schema below for constraints and defaults. |
list_id | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "column_id": { "title": "Column Id", "type": "integer" }, "entity": { "default": "contacts", "title": "Entity", "type": "string" }, "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "List Id" } }, "required": [ "column_id" ], "title": "g8_delete_fieldArguments", "type": "object"}g8_delete_note
Delete a note by ID. Irreversible. Works on a contact, COMPANY or DEAL note - note ids are global, so no deal-specific variant is needed. Notes marked
read_onlyby g8_list_notes cannot be deleted. Backed byDELETE /api/v1/notes/{note_id}. Args: note_id: Note UUID returned by g8_list_notes / g8_create_note.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
note_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "note_id": { "title": "Note Id", "type": "string" } }, "required": [ "note_id" ], "title": "g8_delete_noteArguments", "type": "object"}g8_delete_quote
Delete a draft quote. Irreversible. 400s on any non-draft status. Sent/accepted/voided quotes are preserved as legal records and cannot be hard-deleted - use g8_edit_quote_as_draft or g8_duplicate_quote instead. Args: quote_id: Quote UUID (must be in
draftstatus).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
quote_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "quote_id": { "title": "Quote Id", "type": "string" } }, "required": [ "quote_id" ], "title": "g8_delete_quoteArguments", "type": "object"}g8_delete_sequence
Soft-delete (archive) a sequence. Sets is_archived=True. IMPORTANT: This archives a real sequence. Confirm with the user first. Archived sequences are hidden from the UI and excluded from worker processing. Args: sequence_id: Sequence ID to archive
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "title": "Sequence Id", "type": "string" } }, "required": [ "sequence_id" ], "title": "g8_delete_sequenceArguments", "type": "object"}g8_delete_task
Delete a task by ID. Irreversible. Backed by
DELETE /api/v1/tasks/{task_id}. Args: task_id: Task UUID returned by g8_get_tasks / g8_create_task.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
task_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "task_id": { "title": "Task Id", "type": "string" } }, "required": [ "task_id" ], "title": "g8_delete_taskArguments", "type": "object"}g8_doctor
Report what graph8 knows about a repository’s GTM readiness. Three read-only checks against the stored repo record: is the repo connected and does it carry a write key, are there stored scan results, and is there an install patch set (and was it applied). This does NOT reach into your running application. graph8 has no server-side probe, so it cannot tell you whether a script tag renders, an env var is set, or an event actually arrived. Those you verify in your own environment; this tells you whether the graph8 side of the install is in place. Args: repo_id: Repository ID
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" } }, "required": [ "repo_id" ], "title": "g8_doctorArguments", "type": "object"}g8_duplicate_quote
Clone any quote (any status) into a new draft. Title gets a (Copy) suffix. Useful for renewals or recreating an expired quote without retyping line items. Args: quote_id: Source quote UUID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
quote_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "quote_id": { "title": "Quote Id", "type": "string" } }, "required": [ "quote_id" ], "title": "g8_duplicate_quoteArguments", "type": "object"}g8_edit_quote_as_draft
Convert a sent quote back into an editable draft via void+clone. Side effects: voids the existing signing envelope (recipient’s link stops resolving), marks the source voided, and creates a fresh draft copy with line items preserved. Use when a recipient needs revised pricing/terms on an already-sent quote. Returns the new quote_id to operate on next. Args: quote_id: Source quote UUID (must be in
sentstatus).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
quote_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "quote_id": { "title": "Quote Id", "type": "string" } }, "required": [ "quote_id" ], "title": "g8_edit_quote_as_draftArguments", "type": "object"}g8_enrich_contacts
Enrich existing CRM contacts with third-party data or AI web research. CHARGES CREDITS per contact - call with dry_run=True first for a confirmation preview, then dry_run=False after the user confirms. Two modes share this entry point: 1. waterfall - runs the list’s saved waterfall pipeline. Returns a job_id; poll with g8_get_enrichment_job. Credits per contact = sum of provider step costs. 2. ai-research - runs a saved AI enrichment config (requires
ai_group_id). Runs synchronously and returns final counts inline (status="completed",total,completed,results); the job_id is also valid for g8_get_enrichment_job. ~3 credits per contact. Mode: “auto” (default) prefers AI whenai_group_idis given else waterfall; “waterfall” forces waterfall; “ai-research” forces AI (ai_group_idrequired). Waterfall pipeline discovery: - Noproviders/email_verification/target_field: uses the first active saved pipeline on the list, or auto-creates a minimal graph8 lookup pipeline (0 credits). -target_field="phone": enrich a SPECIFIC column with the correct provider action for that column. The server builds the pipeline from its per-column template, so a phone request runs leadmagicmobile_finder(NOTemail_finder) and writes into the real phone field. Accepts canonical columns (CONTACT_DIRECT_PHONE, CONTACT_MOBILE_PHONE, CONTACT_WORK_EMAIL, CONTACT_LINKEDIN_URL, COMPANY_PHONE, …) or synonyms (“phone”, “mobile”, “email”, “linkedin”). ALWAYS pass this when the user names a field to enrich (“enrich the phone”, “find mobiles”). -providers=["hunter","prospeo"]: provisions a pipeline running those providers in order, deduped by name so re-calls reuse it. Allowed: graph8, hunter, prospeo, dropcontact, icypeas, leadmagic, emaillistverify, apollo, lusha, rocketreach. Combine withtarget_fieldto keep only those providers from the column’s template (each keeps its correct per-field action, e.g.providers=["leadmagic"]+target_field="phone"gives leadmagicmobile_finder). -email_verification=True: bolts ZeroBounce (validonly) on after enrichment. ~1 extra verification credit per row. Credentials (system vs your own key): graph8 funds most providers with its own keys, so a provisioned pipeline uses graph8 system credentials by default and charges credits - no setup needed. If your org has its own key for a provider, that key is used instead (no credits). lusha and rocketreach are NOT graph8-funded: they need your own key under Settings > Providers or their step is skipped. Call g8_list_enrichment_providers to see which is which before enriching. Single-contact enrichment is fine (one-element list); the contact must already be in a list. For an unattached prospect use g8_lookup_person. Args: contact_ids: List of CRM contact IDs to enrich. list_id: ID of the list the contacts belong to. dry_run: When True, return a confirmation preview instead of running. mode: “auto” | “waterfall” | “ai-research”. Defaults to “auto”. ai_group_id: group_id of a saved AI config (required for ai-research). Discover via the/enrichment/ai/configs?list_id=...endpoint or the campaign builder UI. providers: Optional ordered list of provider names. When supplied, auto-provisions a pipeline that runs these providers (ignored for ai-research). Mutually exclusive withai_group_id’s mode. email_verification: When True, bolts ZeroBounce email verification onto the auto-provisioned pipeline (system credentials,validonly). Ignored when an existing pipeline is reused withoutprovidersoverrides. target_field: Optional column to enrich (e.g. “phone”, “mobile”, “email”, or a canonical CONTACT_/COMPANY_ column). Builds the pipeline from the server’s per-column template so each provider runs the CORRECT action for that column (phone → leadmagicmobile_finder, notemail_finder) and writes into the real field. Pass this whenever the user names a field to enrich; omit to run the list’s default/saved pipeline. Ignored for ai-research.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_ids | Yes | array | See the schema below for constraints and defaults. |
list_id | Yes | integer | See the schema below for constraints and defaults. |
dry_run | No | boolean | See the schema below for constraints and defaults. |
mode | No | string | See the schema below for constraints and defaults. |
ai_group_id | No | string / null | See the schema below for constraints and defaults. |
providers | No | array / null | See the schema below for constraints and defaults. |
email_verification | No | boolean | See the schema below for constraints and defaults. |
target_field | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "contact_ids": { "items": { "type": "integer" }, "title": "Contact Ids", "type": "array" }, "list_id": { "title": "List Id", "type": "integer" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" }, "mode": { "default": "auto", "title": "Mode", "type": "string" }, "ai_group_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Ai Group Id" }, "providers": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Providers" }, "email_verification": { "default": false, "title": "Email Verification", "type": "boolean" }, "target_field": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Target Field" } }, "required": [ "contact_ids", "list_id" ], "title": "g8_enrich_contactsArguments", "type": "object"}g8_enrichment_list_ai_configs
List Ai Configs. Uses the current organization and existing API permissions. API: GET /enrichment/ai/configs
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
list_id | Yes | integer | List ID whose saved AI configs to return |
Complete input schema
{ "properties": { "list_id": { "description": "List ID whose saved AI configs to return", "title": "List Id", "type": "integer" } }, "required": [ "list_id" ], "title": "g8_enrichment_list_ai_configsArguments", "type": "object"}g8_enrichment_start_enrichment
Start Enrichment. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /enrichment/enrich
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiEnrichRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiEnrichRequest": { "additionalProperties": false, "properties": { "contact_ids": { "description": "Contact IDs to enrich", "items": { "type": "integer" }, "title": "Contact Ids", "type": "array" }, "fields_config": { "anyOf": [ { "additionalProperties": { "items": { "type": "string" }, "type": "array" }, "type": "object" }, { "type": "null" } ], "default": null, "description": "Fields to enrich and provider order. Example: {\"work_email\": [\"prospeo\", \"dropcontact\"]}", "title": "Fields Config" }, "list_id": { "description": "List ID the contacts belong to", "title": "List Id", "type": "integer" } }, "required": [ "contact_ids", "list_id" ], "title": "ApiEnrichRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiEnrichRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_enrichment_start_enrichmentArguments", "type": "object"}g8_enrichment_verify_email
Verify Email. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /enrichment/verify-email
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiVerifyEmailRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiVerifyEmailRequest": { "additionalProperties": false, "properties": { "email": { "description": "Email address to verify", "title": "Email", "type": "string" } }, "required": [ "email" ], "title": "ApiVerifyEmailRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiVerifyEmailRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_enrichment_verify_emailArguments", "type": "object"}g8_execute
Run ANY graph8 tool by name, even when it is not in your tools list. Use this when g8_tool_search found the tool you need but it did NOT appear in your tool palette (some MCP clients only refresh tools on reconnect). Flow: g8_tool_search returns matches with
input_schemafor the top hits -> buildargumentsfrom that schema -> call g8_execute(tool_name=…, arguments={…}). Never tell the user a graph8 capability is unavailable without trying this first. Args: tool_name: Exact tool name from g8_tool_search (e.g. “g8_voice_create_dialer_session”). arguments: Arguments for that tool, matching its input_schema. Omit or pass {} for tools without required arguments. Returns a G8ExecuteResult envelope: ok=true withresulton success; ok=false witherror,error_typeand ahinton failure. Oninvalid_argumentsthe failure includes the tool’sinput_schema- fix the arguments and retry. Permissions and org-context rules apply to the wrapped tool exactly as if it were called directly. Thectxparameter is auto-injected by FastMCP and hidden from the public tool schema - clients do not see it.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
tool_name | Yes | string | See the schema below for constraints and defaults. |
arguments | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "tool_name": { "title": "Tool Name", "type": "string" }, "arguments": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Arguments" } }, "required": [ "tool_name" ], "title": "g8_executeArguments", "type": "object"}g8_find_companies
Search graph8’s company database for new prospects. Unlike g8_search_companies (which searches YOUR CRM), this searches the open data index for companies you don’t track yet. Free - no credits are consumed. The organization’s default-on deliverability protection policy is applied automatically. It may exclude high-risk account categories configured under Settings > Compliance > Deliverability. Each filter is a dict with: field, operator, value. Fields: name, domain, industry, industry_group, employee_count, revenue, founded_year, country, state, city, linkedin_followers Operators: any_of, contains, all_of, none_of, is_empty, is_not_empty, between, exists Args: filters: List of filter objects (field, operator, value) page: Page number (default 1) limit: Results per page (default 25, max 200)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
filters | Yes | array | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "filters": { "items": { "additionalProperties": true, "type": "object" }, "title": "Filters", "type": "array" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 25, "title": "Limit", "type": "integer" } }, "required": [ "filters" ], "title": "g8_find_companiesArguments", "type": "object"}g8_find_contacts
Search graph8’s contact database to find new prospects. Unlike g8_search_contacts (which searches YOUR CRM), this searches the open data index for leads you don’t have yet. Free - no credits are consumed. The organization’s default-on deliverability protection policy is applied automatically. It may exclude high-risk account categories configured under Settings > Compliance > Deliverability. Each filter is a dict with: field, operator, value. Fields: first_name, last_name, work_email, job_title, seniority_level, job_department, role, linkedin_url, city, state, country, company_name, company_domain, company_industry, company_employee_count, company_revenue, company_founded_year Operators: any_of, contains, all_of, none_of, is_empty, is_not_empty, between, exists Example filters: [ {“field”: “seniority_level”, “operator”: “any_of”, “value”: [“Vice President”, “Director”]}, {“field”: “company_industry”, “operator”: “contains”, “value”: [“SaaS”, “Software”]}, {“field”: “company_employee_count”, “operator”: “between”, “value”: [50, 500]} ] Note: the index stores seniority as full strings (“Vice President”, not “VP”). Common abbreviations (VP, SVP, EVP, AVP, C-Level, C-Suite) are auto-expanded, but prefer the canonical form. Args: filters: List of filter objects (field, operator, value) page: Page number (default 1) limit: Results per page (default 25, max 200)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
filters | Yes | array | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "filters": { "items": { "additionalProperties": true, "type": "object" }, "title": "Filters", "type": "array" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 25, "title": "Limit", "type": "integer" } }, "required": [ "filters" ], "title": "g8_find_contactsArguments", "type": "object"}g8_forms_get_form_overview
Get operational detail for one lead-capture form. Returns capture/delivery/activation health, submission metrics, the destination list, owner, and display name. Args: form_key: The form’s id / group key (from g8_forms_list_forms). source_id: The form’s write key / site (from g8_forms_list_forms) - a form id is only unique within its source, so this is required.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
form_key | Yes | string | See the schema below for constraints and defaults. |
source_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "form_key": { "title": "Form Key", "type": "string" }, "source_id": { "title": "Source Id", "type": "string" } }, "required": [ "form_key", "source_id" ], "title": "g8_forms_get_form_overviewArguments", "type": "object"}g8_forms_list_forms
List and search the org’s website lead-capture forms. Use this to FIND a specific form by name - e.g. search=‘discovery’ to locate a “discovery” form. Each result carries the form_key + source_id needed by g8_forms_get_form_overview. Args: page: 1-indexed page (default 1). per_page: Rows per page (default 20, max 200). search: Case-insensitive substring match on the form name/id. source_id: Restrict to one write key / site. sort_field: One of ‘total_submissions’, ‘latest_submitted_at’, ‘form_tag_id’. sort_order: ‘asc’ or ‘desc’.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page | No | integer | See the schema below for constraints and defaults. |
per_page | No | integer | See the schema below for constraints and defaults. |
search | No | string / null | See the schema below for constraints and defaults. |
source_id | No | string / null | See the schema below for constraints and defaults. |
sort_field | No | string / null | See the schema below for constraints and defaults. |
sort_order | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page": { "default": 1, "title": "Page", "type": "integer" }, "per_page": { "default": 20, "title": "Per Page", "type": "integer" }, "search": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Search" }, "source_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Source Id" }, "sort_field": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Sort Field" }, "sort_order": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Sort Order" } }, "title": "g8_forms_list_formsArguments", "type": "object"}g8_generate_spintax
Rewrite a manual email into spintax for per-contact variation. CHARGES CREDITS per call (one AI generation, token-metered). Confirm with the user before calling. Takes a plain subject + body and returns them rewritten with nested {{option a|option b}} spintax blocks. At send time the sequencer picks one option per block per contact, so every lead receives a different-looking variant of the same email. IMPORTANT - the step MUST be input_type=‘MANUAL_TEMPLATE’. An email step left at the default input_type=‘ON_DEMAND’ IGNORES subject/body entirely and asks the AI to write each email from step_data.instructions instead, so spintax you paste there is silently discarded and never sent. Writing this result onto an ON_DEMAND step now returns a 422 that names the fix. After writing the result into a step, verify with g8_list_sequence_steps: rendered.variants shows the actual per-contact variations, and raw {{a|b|c}} braces in step_data are correct storage rather than a failure. Campaign sequence steps resolve spintax identically at send time, so the result works there too. Generation is synchronous and can take up to ~2 minutes. The output is validated server-side (balanced braces, every {{variable}} preserved, links preserved for HTML) - invalid model output returns an error, never silently broken content. A 402 error means insufficient credits OR an inactive subscription. A 429 error means the server is at its concurrent-generation cap - wait ~15s and retry, do not treat it as a hard failure. Args: subject: Email subject to rewrite into spintax body: Email body to rewrite into spintax email_type: Body format, ‘plain’ (default) or ‘html’. HTML preserves <a href> links. tone_instructions: Optional tone/style guidance for the rewrite strength: Variation intensity - ‘light’, ‘balanced’ (default), or ‘maximum’. Each level has an enforced ceiling on total distinct renderings (subject x body), applied after generation: light up to 200 with flat blocks only, balanced up to 5,000, maximum up to 100,000. Output above the ceiling is trimmed down rather than rejected.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
subject | Yes | string | See the schema below for constraints and defaults. |
body | Yes | string | See the schema below for constraints and defaults. |
email_type | No | string | See the schema below for constraints and defaults. |
tone_instructions | No | string / null | See the schema below for constraints and defaults. |
strength | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "subject": { "title": "Subject", "type": "string" }, "body": { "title": "Body", "type": "string" }, "email_type": { "default": "plain", "title": "Email Type", "type": "string" }, "tone_instructions": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Tone Instructions" }, "strength": { "default": "balanced", "title": "Strength", "type": "string" } }, "required": [ "subject", "body" ], "title": "g8_generate_spintaxArguments", "type": "object"}g8_get_activities
List recent CRM activities for the current organization.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
activity_type | No | string / null | See the schema below for constraints and defaults. |
contact_id | No | string / null | See the schema below for constraints and defaults. |
company_id | No | string / null | See the schema below for constraints and defaults. |
mashup_contact_id | No | integer / null | See the schema below for constraints and defaults. |
mashup_company_id | No | integer / null | See the schema below for constraints and defaults. |
deal_id | No | string / null | See the schema below for constraints and defaults. |
occurred_after | No | string / null | See the schema below for constraints and defaults. |
occurred_before | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 50, "title": "Limit", "type": "integer" }, "activity_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Activity Type" }, "contact_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contact Id" }, "company_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Company Id" }, "mashup_contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Mashup Contact Id" }, "mashup_company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Mashup Company Id" }, "deal_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Deal Id" }, "occurred_after": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Occurred After" }, "occurred_before": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Occurred Before" } }, "title": "g8_get_activitiesArguments", "type": "object"}g8_get_activity_summary
Summarize recent CRM activity for the current organization. Aggregates the most recent activities into a rollup: total count, counts by activity_type and outcome, daily counts for the window, top owners by activity count, and total call/meeting duration. Good for “how was this week” / “which reps are most active” without paging the raw feed. Pulls up to 200 most recent activities then filters client-side by the day window. If more than 200 fall in the window the summary covers only the newest 200 (
truncatedflag is true) - callg8_get_activitieswith narrower filters for a full feed. Args: days: Size of the rollup window in days ending now (default 7). activity_type: Optional activity type filter (e.g. “call”, “email”, “meeting”). Passed to the server-side filter. contact_id: Optional contact filter. company_id: Optional company filter. deal_id: Optional deal filter.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
days | No | integer | See the schema below for constraints and defaults. |
activity_type | No | string / null | See the schema below for constraints and defaults. |
contact_id | No | string / null | See the schema below for constraints and defaults. |
company_id | No | string / null | See the schema below for constraints and defaults. |
deal_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "days": { "default": 7, "title": "Days", "type": "integer" }, "activity_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Activity Type" }, "contact_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contact Id" }, "company_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Company Id" }, "deal_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Deal Id" } }, "title": "g8_get_activity_summaryArguments", "type": "object"}g8_get_audience_sync
Get details for a specific audience sync configuration. Args: config_id: Sync config ID
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
config_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "config_id": { "title": "Config Id", "type": "integer" } }, "required": [ "config_id" ], "title": "g8_get_audience_syncArguments", "type": "object"}g8_get_audience_sync_errors
Get error logs for an audience sync configuration. Returns recent failed sync runs with error messages and details. Args: config_id: Sync config ID limit: Max errors to return (default 20, max 100)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
config_id | Yes | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "config_id": { "title": "Config Id", "type": "integer" }, "limit": { "default": 20, "title": "Limit", "type": "integer" } }, "required": [ "config_id" ], "title": "g8_get_audience_sync_errorsArguments", "type": "object"}g8_get_audience_sync_runs
Get sync run history for an audience sync configuration. Returns recent sync runs with status, member counts, and timing. Args: config_id: Sync config ID limit: Max runs to return (default 20, max 100)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
config_id | Yes | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "config_id": { "title": "Config Id", "type": "integer" }, "limit": { "default": 20, "title": "Limit", "type": "integer" } }, "required": [ "config_id" ], "title": "g8_get_audience_sync_runsArguments", "type": "object"}g8_get_booking
Get a single booking by its UID. Returns the full detail: attendees, status, times, location, meeting_url, the attendee’s form responses, and internal notes. Args: booking_uid: Booking UID (uuid string) from g8_appointments_list_bookings.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" } }, "required": [ "booking_uid" ], "title": "g8_appointments_get_bookingArguments", "type": "object"}g8_get_campaign
Get full details for a specific campaign. Args: repo_id: Repository ID campaign_id: Campaign ID from g8_list_campaigns
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
campaign_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" }, "campaign_id": { "title": "Campaign Id", "type": "string" } }, "required": [ "repo_id", "campaign_id" ], "title": "g8_get_campaignArguments", "type": "object"}g8_get_company_contacts
List the contacts attached to a company. Returns the people your org has recorded at a given company. Useful for multi-threading prep (“who else do we know at Acme?”) or for building account-based outreach lists. Args: company_id: Integer company ID. limit: Items per page (default 100, max 200). offset: Pagination offset (default 0).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
company_id | Yes | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
offset | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "company_id": { "title": "Company Id", "type": "integer" }, "limit": { "default": 100, "title": "Limit", "type": "integer" }, "offset": { "default": 0, "title": "Offset", "type": "integer" } }, "required": [ "company_id" ], "title": "g8_get_company_contactsArguments", "type": "object"}g8_get_company_deals
List all deals associated with a company (account view). Returns every deal linked to this company, with stage, value, currency, pipeline, role, owner, and close date. Useful for “what’s in the pipeline for this account” questions. Mirrors g8_get_contact_deals. Backed by
GET /api/v1/companies/{company_id}/deals. Args: company_id: Integer company ID (mashup_companies.id).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
company_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "company_id": { "title": "Company Id", "type": "integer" } }, "required": [ "company_id" ], "title": "g8_get_company_dealsArguments", "type": "object"}g8_get_company_quotes
List every quote attached to a given company (account view). Args: company_id: MashupCompany ID (integer).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
company_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "company_id": { "title": "Company Id", "type": "integer" } }, "required": [ "company_id" ], "title": "g8_get_company_quotesArguments", "type": "object"}g8_get_contact_activity
List recent activities for a single contact. Returns the activity timeline (calls, emails, meetings, notes) for this contact, newest first. Good for “what have we done with this person”. Pulls up to 200 most recent org-wide activities and filters client-side. For very active orgs the contact’s older activities may fall outside the 200-row scan window; the response sets
scan_truncated: truethen. Args: contact_id: Integer contact ID. limit: Max activities to return after filtering (default 50, max 200). activity_type: Optional type filter (e.g. “call”, “email”, “meeting”).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | Yes | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
activity_type | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "contact_id": { "title": "Contact Id", "type": "integer" }, "limit": { "default": 50, "title": "Limit", "type": "integer" }, "activity_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Activity Type" } }, "required": [ "contact_id" ], "title": "g8_get_contact_activityArguments", "type": "object"}g8_get_contact_company
Get the company record attached to a contact. Single-call wrapper:
/contacts/{id}already embeds the contact’s company as a nested object (id, name, domain, industry, location, linkedin_url, logo_url), so we extract and return that directly. Returns an empty ResourceDetail if the contact has no company linkage. Args: contact_id: Integer contact ID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "contact_id": { "title": "Contact Id", "type": "integer" } }, "required": [ "contact_id" ], "title": "g8_get_contact_companyArguments", "type": "object"}g8_get_contact_deals
List all deals associated with a contact. Returns every deal where this contact is the primary or associated contact, with stage, value, currency, pipeline, and role. Useful for “what’s this person working on with us” questions. Args: contact_id: Integer contact ID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "contact_id": { "title": "Contact Id", "type": "integer" } }, "required": [ "contact_id" ], "title": "g8_get_contact_dealsArguments", "type": "object"}g8_get_contact_detail
Get the full detail record for a single CRM contact. Returns every backend field the org has on this contact (emails, phones, job title, company linkage, social URLs, location, custom attributes). Use after g8_search_contacts has narrowed down a contact_id to read the full record. With
include_suppression=Truethe record also carries asuppressionblock -is_suppressed,active_channelsand the ledger rows behind them - read from the SAME ledger the sequencer and newsletter send gates check. Ask for it BEFORE contacting anyone, or before enrolling them in a sequence. That read is a second API call, so leave it off when you only need the fields. If the suppression read fails, the whole call returns that error rather than a record with the block missing: a returned record either has a true suppression answer or is not returned at all. Nothing is ever inferred from an absent block. Args: contact_id: Integer contact ID (from g8_search_contacts or CRM). include_suppression: Attach the do-not-contact status. Default False, which issues exactly the request this tool always did.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | Yes | integer | See the schema below for constraints and defaults. |
include_suppression | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "contact_id": { "title": "Contact Id", "type": "integer" }, "include_suppression": { "default": false, "title": "Include Suppression", "type": "boolean" } }, "required": [ "contact_id" ], "title": "g8_get_contact_detailArguments", "type": "object"}g8_get_contact_quotes
List quotes where this contact is the signer. Args: contact_id: MashupContact ID (integer).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "contact_id": { "title": "Contact Id", "type": "integer" } }, "required": [ "contact_id" ], "title": "g8_get_contact_quotesArguments", "type": "object"}g8_get_crm_fields
Discover available fields for an entity type on a CRM provider (use to build field mappings before pushing data). Args: provider: CRM provider (hubspot, salesforce, pipedrive, zoho, sugarcrm) entity_type: Entity type (contacts, companies, leads, deals)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
provider | Yes | string | See the schema below for constraints and defaults. |
entity_type | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "provider": { "title": "Provider", "type": "string" }, "entity_type": { "default": "contacts", "title": "Entity Type", "type": "string" } }, "required": [ "provider" ], "title": "g8_get_crm_fieldsArguments", "type": "object"}g8_get_crm_status
Check connection health for a CRM provider. Args: provider: CRM provider (hubspot, salesforce, pipedrive, zoho, sugarcrm)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
provider | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "provider": { "title": "Provider", "type": "string" } }, "required": [ "provider" ], "title": "g8_get_crm_statusArguments", "type": "object"}g8_get_deal
Get details for a single CRM deal.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
deal_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "deal_id": { "title": "Deal Id", "type": "string" } }, "required": [ "deal_id" ], "title": "g8_get_dealArguments", "type": "object"}g8_get_deals
List deals with owner, outcome, stage, pipeline, activity and contact filters. For “my stale deals” use stale_before (ISO timestamp): it returns deals last touched before that time OR never touched at all. Note that last_activity_before alone EXCLUDES never-touched deals (no activity = no last-activity timestamp), which is usually not what “stale” means. Use outcome=“won” | “lost” | “open” to filter by outcome. A deal has exactly one, so this is unambiguous. For closed-lost re-engagement use outcome=“lost”. For “how many deals did we close this month/quarter” combine outcome=“won” with close_after / close_before (ISO timestamps) to scope by close_date. The window is half-open [close_after, close_before) and is applied server-side, so the returned total is the exact count for the period rather than a client-side tally of a truncated page. A period count needs BOTH bounds AND the outcome filter: close_before alone (no lower bound) sums the entire deal history into the period, and omitting outcome counts open/lost deals whose close_date is only a forecast. Deals with no close_date are excluded from a windowed query. Do NOT use is_closed_won=false for that - it is a LEGACY boolean whose false branch means “not won”, which also returns open and unclassified deals. Prefer outcome= in all new code; passing an outcome that contradicts is_closed_won is rejected (400). Pair outcome=“lost” with last_activity_before rather than stale_before when the result will drive an automated action: stale_before also returns deals that have NEVER had a recorded interaction, which is the wrong cohort for outreach that is meant to reference prior conversations. Add has_activity=true to be explicit. Use has_contact=false for “deals without a contact” - the orphaned-deal cohort. This IS filterable server-side, so never page the pipeline checking linkage yourself. “No contact” means no linked contact AND no live primary contact, so a pointer at a merged-away contact still counts as orphaned. Results carry closed_lost_reason when the rep recorded one; it is frequently null, because nothing in the platform requires it.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
stage_id | No | string / null | See the schema below for constraints and defaults. |
pipeline_id | No | string / null | See the schema below for constraints and defaults. |
search | No | string / null | See the schema below for constraints and defaults. |
owner_id | No | string / null | See the schema below for constraints and defaults. |
owner_email | No | string / null | See the schema below for constraints and defaults. |
is_closed_won | No | boolean / null | See the schema below for constraints and defaults. |
outcome | No | string / null | See the schema below for constraints and defaults. |
last_activity_before | No | string / null | See the schema below for constraints and defaults. |
stale_before | No | string / null | See the schema below for constraints and defaults. |
has_activity | No | boolean / null | See the schema below for constraints and defaults. |
has_contact | No | boolean / null | See the schema below for constraints and defaults. |
close_after | No | string / null | See the schema below for constraints and defaults. |
close_before | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 25, "title": "Limit", "type": "integer" }, "stage_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Stage Id" }, "pipeline_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Pipeline Id" }, "search": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Search" }, "owner_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Owner Id" }, "owner_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Owner Email" }, "is_closed_won": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Is Closed Won" }, "outcome": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Outcome" }, "last_activity_before": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Last Activity Before" }, "stale_before": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Stale Before" }, "has_activity": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Has Activity" }, "has_contact": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Has Contact" }, "close_after": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Close After" }, "close_before": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Close Before" } }, "title": "g8_get_dealsArguments", "type": "object"}g8_get_enrichment_job
Poll the status of an enrichment job by the
job_idfrom g8_enrich_contacts. - Waterfall jobs are async: response carriesstatus(queued/running/completed/failed) until the worker reports progress, thentotal/completedpopulate. - AI jobs run synchronously inside g8_enrich_contacts(mode=“ai-research”), so the job is already completed/failed by the time you have a job_id; polling is supported but rarely needed. IMPORTANT:status="completed"means the pipeline RAN, not that it wrote data. Always checksuccessful_enrichments- a completed job withsuccessful_enrichments=0(andtotal_credits_used=0) enriched nothing, almost always a missing provider credential. Passinclude_provider_errors=Trueto get the per-provider reasons (e.g. “<provider> API key is not configured”). Args: job_id: job_id from the g8_enrich_contacts response. include_provider_errors: When True, include per-provider step errors (record_id, provider, error) for a completed/failed job.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
job_id | Yes | string | See the schema below for constraints and defaults. |
include_provider_errors | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "job_id": { "title": "Job Id", "type": "string" }, "include_provider_errors": { "default": false, "title": "Include Provider Errors", "type": "boolean" } }, "required": [ "job_id" ], "title": "g8_get_enrichment_jobArguments", "type": "object"}g8_get_event_type
Get full detail for one bookable event type: title, slug, duration (length minutes), locations, hosts, schedule, buffers, minimum notice, and the booking_fields an attendee must answer. Call before g8_appointments_create_booking to learn required fields + slot length. Find event_type_id via g8_appointments_list_event_types. Args: event_type_id: Event-type integer ID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
event_type_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "event_type_id": { "title": "Event Type Id", "type": "integer" } }, "required": [ "event_type_id" ], "title": "g8_appointments_get_event_typeArguments", "type": "object"}g8_get_field_value
Read a single custom column value from one contact or company row. The read-side counterpart of
g8_set_field_value. Useg8_list_fieldsfirst to find thecolumn_id.record_idis the contact_id (when entity=“contacts”) or company_id (when entity=“companies”). Returnsvalue: nullwhen the column exists but has not been set for that row. To read the custom values of MANY rows at once, passinclude_custom_fields=truetog8_search_contacts/g8_search_companies(or the contact/company read endpoints) instead of calling this per-row. Args: column_id: Column ID fromg8_list_fieldsorg8_create_field. record_id: Contact ID or company ID to read. entity: Target entity - “contacts” or “companies” (default: contacts).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
column_id | Yes | integer | See the schema below for constraints and defaults. |
record_id | Yes | integer | See the schema below for constraints and defaults. |
entity | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "column_id": { "title": "Column Id", "type": "integer" }, "record_id": { "title": "Record Id", "type": "integer" }, "entity": { "default": "contacts", "title": "Entity", "type": "string" } }, "required": [ "column_id", "record_id" ], "title": "g8_get_field_valueArguments", "type": "object"}g8_get_form_template
Return a complete, working progressive form-fill template for a framework. Progressive forms collect visitor data across multiple visits (stage 1: email triggers CDP lookup; later stages add name/company/title then budget/timeline, skipping fields CDP already knows). Each submit calls g8.identify() + g8.track(). PREREQUISITE: install the graph8 tracking snippet first (run g8_get_tracking_snippet); without it the g8 calls silently no-op and no data reaches graph8 CDP. Adapt the returned template freely; it tracks stage via localStorage. Args: framework: html, react, nextjs, vue, wordpress, webflow, or shopify. variant: embedded (inline) or popup (overlay with time/scroll/exit triggers). field_stages: Optional JSON array of stage objects (stage number + fields) for custom stages. Omit for defaults (email/name -> company/title -> budget/timeline). repo_id: Optional repository ID for a repo-specific write key.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
framework | Yes | string | See the schema below for constraints and defaults. |
variant | Yes | string | See the schema below for constraints and defaults. |
field_stages | No | string / null | See the schema below for constraints and defaults. |
repo_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "framework": { "title": "Framework", "type": "string" }, "variant": { "title": "Variant", "type": "string" }, "field_stages": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Field Stages" }, "repo_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Repo Id" } }, "required": [ "framework", "variant" ], "title": "g8_get_form_templateArguments", "type": "object"}g8_get_landing_page_source
Read the exact HTML and SHA-256 for a Studio landing-page edit session. The edit session comes from Studio’s Open in AI dialog. It selects one draft but is not a credential: the connected graph8 account must match the user and organization that created it. Args: edit_session: Opaque page-scoped session copied from graph8 Studio.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
edit_session | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "edit_session": { "title": "Edit Session", "type": "string" } }, "required": [ "edit_session" ], "title": "g8_get_landing_page_sourceArguments", "type": "object"}g8_get_lists
List contact and company lists in your CRM. Args: page: Page number (default 1) limit: Items per page (default 50)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 50, "title": "Limit", "type": "integer" } }, "title": "g8_get_listsArguments", "type": "object"}g8_get_meeting
Get a single meeting with FULL transcript bundled inline. Returns the meeting record plus the complete transcript body, summary, key topics, action items, CRM tasks, and custom-field extractions. If the caller is not a participant and lacks meetings:see_transcripts, transcript content is redacted (transcript_redacted=true). Use after g8_list_meetings narrows down a meeting id. Args: meeting_id: Meeting ID (string or integer form; both accepted).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
meeting_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "meeting_id": { "title": "Meeting Id", "type": "string" } }, "required": [ "meeting_id" ], "title": "g8_get_meetingArguments", "type": "object"}g8_get_pipeline
List deal pipelines and stages, and optionally the revenue lifecycle stages. Two different axes of the same board. A deal pipeline moves one DEAL through selling stages. The revenue lifecycle moves a whole COMPANY (or contact) through Suspects -> Leads -> Trial -> Customers -> Churned, plus any custom stages the org added. Ask for
include_lifecyclebefore using a lifecycle stage anywhere else: theslugreturned here is the valueg8_search_companies(lifecycle_stage=),g8_update_contact(lifecycle_stage=)andg8_crm_update_company(lifecycle_stage=)all take, and an org can rename or add stages so the five seeded slugs are not a safe guess. Args: include_lifecycle: Also return the org’s lifecycle stages. include_counts: Join each lifecycle stage’s company count onto it asrecord_count. Implies include_lifecycle. Counts are COMPANY-side only: moving a contact to a stage never moves one of these numbers.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
include_lifecycle | No | boolean | See the schema below for constraints and defaults. |
include_counts | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "include_lifecycle": { "default": false, "title": "Include Lifecycle", "type": "boolean" }, "include_counts": { "default": false, "title": "Include Counts", "type": "boolean" } }, "title": "g8_get_pipelineArguments", "type": "object"}g8_get_quote
Get full quote detail: line items, activity log, envelope tracking, totals. Args: quote_id: Quote UUID returned by g8_list_quotes / g8_create_quote.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
quote_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "quote_id": { "title": "Quote Id", "type": "string" } }, "required": [ "quote_id" ], "title": "g8_get_quoteArguments", "type": "object"}g8_get_quote_settings
Get org-level quote settings (branding, default terms, sender identity). Auto-creates default settings if none exist. Use to confirm the org’s sender name/email, default payment terms, and default valid_until window before sending.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_get_quote_settingsArguments", "type": "object"}g8_get_reply
Get a single inbox thread with its message history. Long message bodies are capped by default; a capped message is marked with content_truncated=true and its real length in content_chars. Real threads accumulate quoted reply chains and signatures and can otherwise run to hundreds of thousands of tokens, which can blow the context window. For browsing an inbox use g8_list_inbox - its
previewfield already says what each thread is about. Args: reply_id: Thread/reply ID. channel: email, sms, or linkedin (default email). full_messages: Return untrimmed message bodies. Use only when the capped text is genuinely insufficient - e.g. quoting an exact clause from deep in a long thread.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
reply_id | Yes | string | See the schema below for constraints and defaults. |
channel | No | string | See the schema below for constraints and defaults. |
full_messages | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "reply_id": { "title": "Reply Id", "type": "string" }, "channel": { "default": "email", "title": "Channel", "type": "string" }, "full_messages": { "default": false, "title": "Full Messages", "type": "boolean" } }, "required": [ "reply_id" ], "title": "g8_get_replyArguments", "type": "object"}g8_get_reply_draft
Generate an AI draft reply for an inbox thread. Charges credits (402 if insufficient). Draft only - does not send. Args: reply_id: Thread/reply ID. channel: email, sms, or linkedin (default email).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
reply_id | Yes | string | See the schema below for constraints and defaults. |
channel | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "reply_id": { "title": "Reply Id", "type": "string" }, "channel": { "default": "email", "title": "Channel", "type": "string" } }, "required": [ "reply_id" ], "title": "g8_get_reply_draftArguments", "type": "object"}g8_get_scan_results
Get the latest scan results for a repository. Returns detected tech stack, API routes, README summary, and GTM readiness flags. Args: repo_id: Repository ID
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" } }, "required": [ "repo_id" ], "title": "g8_get_scan_resultsArguments", "type": "object"}g8_get_sequence_analytics
Get comprehensive analytics for a sequence. Returns overview, performance, engagement, timeline, and contact distribution. Args: sequence_id: Sequence ID to get analytics for
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "title": "Sequence Id", "type": "string" } }, "required": [ "sequence_id" ], "title": "g8_get_sequence_analyticsArguments", "type": "object"}g8_get_sequence_preview
Preview a sequence with steps, channels and RESOLVED copy (read-only, no enrollment). Each step returns two views of its content, and the difference matters: - step_data: the stored template, spintax braces and all. - rendered: the same copy with spintax collapsed to one real variant, plus total_combinations and up to 3 sample variants. To answer “is my spintax working?”, read rendered.variants. If they differ from each other, per-contact variation is live and each lead receives a different email. Raw {{a|b|c}} in step_data is CORRECT storage, not a bug. {{variables}} stay visible in rendered because a preview has no contact; they fill in at send time. rendered is null for ON_DEMAND steps, whose copy the AI writes per contact at send time. Check rendered.will_send_as_shown before launching. When it is false, rendered.content_issues explains what will be silently dropped from the delivered email, and those same errors will block the launch. Args: sequence_id: Sequence ID to preview
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "title": "Sequence Id", "type": "string" } }, "required": [ "sequence_id" ], "title": "g8_get_sequence_previewArguments", "type": "object"}g8_get_task
Read one task, including typed related records and exact source context.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
task_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "task_id": { "title": "Task Id", "type": "string" } }, "required": [ "task_id" ], "title": "g8_get_taskArguments", "type": "object"}g8_get_task_execution
Read permitted execution history and result links for a CRM task.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
task_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "task_id": { "title": "Task Id", "type": "string" } }, "required": [ "task_id" ], "title": "g8_get_task_executionArguments", "type": "object"}g8_get_tasks
List tasks for the current organization with optional filters. Returns up to
limitrows starting atoffset(default: first 50). Response includestasksplustotal(API total, or unknown on older servers),limit,offset, andhas_next. Args: status: Filter by status (e.g. “open”, “completed”). priority: Filter by priority (0-4). assignee_id: Filter to tasks assigned to this user ID. search: Substring match on title. limit: Max rows to return (default 50, hard cap 100). Larger values are clamped silently. Useoffsetto walk past the first page. offset: Rows to skip from the start of the filtered list. Default 0.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
status | No | string / null | See the schema below for constraints and defaults. |
priority | No | integer / null | See the schema below for constraints and defaults. |
assignee_id | No | string / null | See the schema below for constraints and defaults. |
search | No | string / null | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
offset | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "priority": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Priority" }, "assignee_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Assignee Id" }, "search": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Search" }, "limit": { "default": 50, "title": "Limit", "type": "integer" }, "offset": { "default": 0, "title": "Offset", "type": "integer" } }, "title": "g8_get_tasksArguments", "type": "object"}g8_get_tracking_snippet
Return the graph8 tracking snippet (p.js) with framework-specific install code. First step before any other graph8 integration: p.js must load on every page before g8.identify(), g8.track(), or progressive forms work. For CSR frameworks (React, Vue) it loads after hydration, so use window.g8?.track(). After installing, add g8.identify() on login/signup and g8.track() for key actions, then use g8_get_form_template for progressive data collection. Args: framework: Target framework - one of html, react, nextjs, vue, wordpress, webflow, shopify. repo_id: Optional repository ID for repo-specific config. Returns: TrackingSnippetResult, or a plain-string error envelope on invalid framework / API failure.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
framework | Yes | string | See the schema below for constraints and defaults. |
repo_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "framework": { "title": "Framework", "type": "string" }, "repo_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Repo Id" } }, "required": [ "framework" ], "title": "g8_get_tracking_snippetArguments", "type": "object"}g8_install_spine
Generate a GTM install patch set for a scanned repository. Produces code patches adding tracking, forms, identity resolution, and attribution. Review the patches before applying. Args: repo_id: Repository ID (must have scan results first)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" } }, "required": [ "repo_id" ], "title": "g8_install_spineArguments", "type": "object"}g8_knowledge_context
Assemble the smallest authorized, cited context pack for a task.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
task | Yes | string | See the schema below for constraints and defaults. |
entity_concept_ids | No | array / null | See the schema below for constraints and defaults. |
token_budget | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "task": { "title": "Task", "type": "string" }, "entity_concept_ids": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Entity Concept Ids" }, "token_budget": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Token Budget" } }, "required": [ "task" ], "title": "g8_knowledge_contextArguments", "type": "object"}g8_knowledge_export
Download authorized organization knowledge as a ZIP MCP embedded resource. Requires knowledge:export (or knowledge:admin) plus the existing knowledge read and MCP-channel gates. Contains only records authorized by the API. Maximum compressed archive size is 1 MiB; larger exports fail without truncation and must use the authenticated API download. No shared files or public download links are created. Decode resource.blob to save the ZIP.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_knowledge_exportArguments", "type": "object"}g8_knowledge_get
Read one authorized concept with Markdown, trust, sources, and warnings.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
concept_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "concept_id": { "title": "Concept Id", "type": "string" } }, "required": [ "concept_id" ], "title": "g8_knowledge_getArguments", "type": "object"}g8_knowledge_list
Browse authorized organization knowledge concepts. Git paths and organization selectors are intentionally unavailable; tenant identity comes from the authenticated graph8 connection.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
concept_type | No | string / null | See the schema below for constraints and defaults. |
lifecycle | No | string / null | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "concept_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Concept Type" }, "lifecycle": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Lifecycle" }, "limit": { "default": 50, "title": "Limit", "type": "integer" } }, "title": "g8_knowledge_listArguments", "type": "object"}g8_knowledge_related
Traverse authorized typed relationships from one concept.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
concept_id | Yes | string | See the schema below for constraints and defaults. |
depth | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "concept_id": { "title": "Concept Id", "type": "string" }, "depth": { "default": 1, "title": "Depth", "type": "integer" }, "limit": { "default": 25, "title": "Limit", "type": "integer" } }, "required": [ "concept_id" ], "title": "g8_knowledge_relatedArguments", "type": "object"}g8_knowledge_search
Search authorized tenant knowledge and return concise cited matches.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
query | Yes | string | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "query": { "title": "Query", "type": "string" }, "limit": { "default": 10, "title": "Limit", "type": "integer" } }, "required": [ "query" ], "title": "g8_knowledge_searchArguments", "type": "object"}g8_knowledge_sources
Read allowlisted evidence metadata for one authorized concept.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
concept_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "concept_id": { "title": "Concept Id", "type": "string" } }, "required": [ "concept_id" ], "title": "g8_knowledge_sourcesArguments", "type": "object"}g8_landing_page_create_landing_page_agent_session
Create Landing Page Agent Session. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /landing-pages/{page_id}/agent-sessions
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page_id | Yes | string | See the schema below for constraints and defaults. |
body | No | #/$defs/ApiCreateAgentSessionRequest / null | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiCreateAgentSessionRequest": { "additionalProperties": false, "properties": { "approval_mode": { "default": "review", "description": "'review' (default) stages each patch for a human to approve in Studio. 'auto_apply' writes straight to the draft. Bound to the session at creation, so a later patch cannot escalate itself.", "pattern": "^(review|auto_apply)$", "title": "Approval Mode", "type": "string" } }, "title": "ApiCreateAgentSessionRequest", "type": "object" } }, "properties": { "page_id": { "title": "Page Id", "type": "string" }, "body": { "anyOf": [ { "$ref": "#/$defs/ApiCreateAgentSessionRequest" }, { "type": "null" } ], "default": null }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "page_id" ], "title": "g8_landing_page_create_landing_page_agent_sessionArguments", "type": "object"}g8_list_audience_syncs
List audience sync configs for your org (ad platforms: Meta, LinkedIn, Google Ads, X) with status, cadence, last sync time.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_list_audience_syncsArguments", "type": "object"}g8_list_bookings
List the caller’s appointment bookings (paginated). Shows bookings the user owns, hosts, or shared a link for - never org-wide. Args: status: Filter by status - accepted | pending | cancelled | rejected. event_type_id: Only bookings for this event type. after_start: ISO-8601 lower bound on start_time (e.g. “2026-06-01T00:00:00Z”). before_end: ISO-8601 upper bound on end_time. attendee_email: Filter to bookings including this attendee. sort_by: start_time | end_time | created_at | status (default start_time). sort_order: asc | desc (default desc). skip: Pagination offset (default 0). take: Page size, 1-100 (default 20).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
status | No | string / null | See the schema below for constraints and defaults. |
event_type_id | No | integer / null | See the schema below for constraints and defaults. |
after_start | No | string / null | See the schema below for constraints and defaults. |
before_end | No | string / null | See the schema below for constraints and defaults. |
attendee_email | No | string / null | See the schema below for constraints and defaults. |
sort_by | No | string | See the schema below for constraints and defaults. |
sort_order | No | string | See the schema below for constraints and defaults. |
skip | No | integer | See the schema below for constraints and defaults. |
take | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "event_type_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Event Type Id" }, "after_start": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "After Start" }, "before_end": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Before End" }, "attendee_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Attendee Email" }, "sort_by": { "default": "start_time", "title": "Sort By", "type": "string" }, "sort_order": { "default": "desc", "title": "Sort Order", "type": "string" }, "skip": { "default": 0, "title": "Skip", "type": "integer" }, "take": { "default": 20, "title": "Take", "type": "integer" } }, "title": "g8_appointments_list_bookingsArguments", "type": "object"}g8_list_campaigns
List generated campaigns for a repository. Args: repo_id: Repository ID page: Page number (default 1) limit: Items per page (default 50, max 200)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 50, "title": "Limit", "type": "integer" } }, "required": [ "repo_id" ], "title": "g8_list_campaignsArguments", "type": "object"}g8_list_crm_syncs
List configured CRM integrations for your org (HubSpot, Salesforce, Pipedrive, Zoho, SugarCRM) with connection status.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_list_crm_syncsArguments", "type": "object"}g8_list_enrichment_providers
List enrichment providers with their credential mode and credit cost. Use this before enriching to see which providers graph8 funds with its own keys (usable with no setup, charges credits) versus which need your own API key (BYOK). For each provider it returns: - system_funded: graph8 holds a system key for it (works out of the box). - byok_configured: your org has its own key configured for it. - default_credential_source: what credential_mode=“auto” uses right now (“system” = graph8 key + credits, “byok” = your key, no credits). - credits_per_row: per-action credit cost on graph8 system credentials. Providers that are NOT system_funded (e.g. lusha, rocketreach) require a BYOK key under Settings > Providers, otherwise their step is skipped. Args: None.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_list_enrichment_providersArguments", "type": "object"}g8_list_event_types
List bookable calendar event types (Cal.com appointments). An event type is the “where do they book?” picker: a title, a slug, and a duration. Pass the row’s integer id back as appointment_id on g8_gtm_launch_campaign to attach the booking link. Different from g8_list_meetings (the inbox of already-booked meetings); this is the picker for which booking template the sequence references. Args: include_hidden: Include event types marked hidden (not bookable publicly). Default False matches the in-app picker. scheduling_type: Filter by Cal.com scheduling type: managed | round_robin | collective. Omit to return all.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
include_hidden | No | boolean | See the schema below for constraints and defaults. |
scheduling_type | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "include_hidden": { "default": false, "title": "Include Hidden", "type": "boolean" }, "scheduling_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Scheduling Type" } }, "title": "list_event_typesArguments", "type": "object"}g8_list_fields
List the field definitions (base + custom columns) for contacts or companies. Use this to see which custom columns already exist before calling
g8_create_field, or to discover the columnnameto reference in downstream APIs. Args: entity: Target entity - “contacts” or “companies” (default: contacts) list_id: Optional list ID. When provided, includes custom columns scoped to that list in addition to global columns.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
entity | No | string | See the schema below for constraints and defaults. |
list_id | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "entity": { "default": "contacts", "title": "Entity", "type": "string" }, "list_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "List Id" } }, "title": "g8_list_fieldsArguments", "type": "object"}g8_list_hot_contacts
Most-ENGAGED (‘hot’) contacts by recent INBOUND activity. Ranks contacts by inbound interaction events (replies / opens / meeting RSVPs) over the window - NOT a static score. Use for “who are my hottest contacts” / “most engaged prospects”. Org-scoped to your API key. Args: days: Lookback window in days (default 30, max 365). limit: Max contacts to return (default 10, max 50).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
days | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "days": { "default": 30, "title": "Days", "type": "integer" }, "limit": { "default": 10, "title": "Limit", "type": "integer" } }, "title": "g8_list_hot_contactsArguments", "type": "object"}g8_list_inbox
List inbox threads (email, SMS, LinkedIn) with tags, assignees, and status. Each thread carries
preview(one line of the latest inbound message) andcontact.name. Answer “what is in my inbox”, “who replied” and “what did they say” questions FROM THIS RESULT - do not call g8_get_reply per thread just to see what a thread is about. Open a thread only when the user asks about that specific one or you need the full message history to draft a reply. Args: channel: Filter by channel (email, sms, linkedin). Omit for all channels. sequence_id: Filter by sequence/campaign ID. status: Filter by status. assignee: Filter by assignee email. tag: Filter by tag ID. page: Page number (default 1). page_size: Items per page (default 25, max 200). Raise it only when the user actually wants more than one screenful.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
channel | No | string / null | See the schema below for constraints and defaults. |
sequence_id | No | string / null | See the schema below for constraints and defaults. |
status | No | string / null | See the schema below for constraints and defaults. |
assignee | No | string / null | See the schema below for constraints and defaults. |
tag | No | string / null | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
page_size | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "channel": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Channel" }, "sequence_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Sequence Id" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "assignee": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Assignee" }, "tag": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Tag" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "page_size": { "default": 25, "title": "Page Size", "type": "integer" } }, "title": "g8_list_inboxArguments", "type": "object"}g8_list_kb_documents
List all documents in the GTM knowledge base. Args: repo_id: Repository ID
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" } }, "required": [ "repo_id" ], "title": "g8_list_kb_documentsArguments", "type": "object"}g8_list_meetings
List calendar meetings as compact summary cards. Use for “show me meetings” or browsing the meeting inbox. Each card has title, time, attendees, and transcript status; transcript bodies are omitted - call g8_get_meeting(meeting_id) for the full transcript. Filter to one person via email, contact_id, or participant_emails (matched across organizer + owner + attendees, case-insensitive, OR). Args: email: Single email to filter by (organizer, owner, or attendee). contact_id: CRM contact ID, resolved to its work email and used as a participant filter. Combine with email to broaden (OR). participant_emails: Explicit list of emails to match (OR). scope: ‘my’ (default) or ‘all’ (org-wide, needs meetings:see_all). timeframe: ‘all’, ‘upcoming’, or ‘past’ (default ‘past’). has_transcript: True = only with transcript, False = only without. Omit for all. include_internal: True = include internal-only meetings (team syncs, standups, same-domain attendees). Omit/False follows org policy (most orgs exclude internal). Pass True when the user asks for team meetings, internal standups, or 1:1s. search: Match against meeting title or transcript text. page: Page number (default 1). page_size: Items per page (default 50). Clamped to 25; use page to walk through more rows.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
email | No | string / null | See the schema below for constraints and defaults. |
contact_id | No | integer / null | See the schema below for constraints and defaults. |
participant_emails | No | array / null | See the schema below for constraints and defaults. |
scope | No | string / null | See the schema below for constraints and defaults. |
timeframe | No | string / null | See the schema below for constraints and defaults. |
has_transcript | No | boolean / null | See the schema below for constraints and defaults. |
include_internal | No | boolean / null | See the schema below for constraints and defaults. |
search | No | string / null | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
page_size | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Email" }, "contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Contact Id" }, "participant_emails": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Participant Emails" }, "scope": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Scope" }, "timeframe": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Timeframe" }, "has_transcript": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Has Transcript" }, "include_internal": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Include Internal" }, "search": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Search" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "page_size": { "default": 50, "title": "Page Size", "type": "integer" } }, "title": "g8_list_meetingsArguments", "type": "object"}g8_list_notes
List all notes on a CRM contact, COMPANY or DEAL. Pass exactly ONE of contact_id / company_id / deal_id. Use
deal_idto read a deal’s note history - there is no separate “deal note” tool. Each note carriesread_only. Aread_onlynote came from a CRM import or the activity log, and g8_update_note / g8_delete_note cannot change it - do not offer to edit those. Backed byGET /api/v1/{contacts\|companies\|deals}/{id}/notes. Args: contact_id: Integer contact ID from g8_find_contacts. company_id: Integer company ID from g8_find_companies. deal_id: Deal UUID from g8_get_deals / g8_create_deal.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | No | integer / null | See the schema below for constraints and defaults. |
company_id | No | integer / null | See the schema below for constraints and defaults. |
deal_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Contact Id" }, "company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Company Id" }, "deal_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Deal Id" } }, "title": "g8_list_notesArguments", "type": "object"}g8_list_orgs
List the organizations the signed-in user belongs to, marking the one currently in effect (
is_current). Use when the user asks to switch orgs, asks which orgs they have, or whenaction_requiredis true (multiple orgs, none chosen) - present the options, ASK which to use before any write, then call g8_switch_org with the chosen org.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_list_orgsArguments", "type": "object"}g8_list_quotable_products
List products available for quote line items (Stripe + org manual catalog). Call before g8_create_quote / g8_update_quote to discover valid line-item ids; non-quotable products are rejected server-side. Each row’s
sourcetells you which id family to use:stripe-> stripe_product_id + stripe_price_id;manual-> manual_product_id. Args: currency: Optional 3-letter currency filter (e.g. USD) - drops prices not in this currency. page: 1-indexed page (default 1). limit: Rows per page (default 100, max 500).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
currency | No | string / null | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "currency": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Currency" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 100, "title": "Limit", "type": "integer" } }, "title": "g8_list_quotable_productsArguments", "type": "object"}g8_list_quotes
List quotes in your org with optional status / company / deal / owner filters. Args: page: 1-indexed page (default 1). limit: Rows per page (default 50, max 200). status: Filter by lifecycle stage. One of:
draft,sent,viewed,accepted,declined,voided,expired. Omit to list every status. mashup_company_id: Restrict to quotes attached to one company (mashup_companies.id, integer). deal_id: Restrict to quotes linked to one deal (UUID string). owner_id: Restrict to quotes owned by one user (email).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
status | No | string / null | See the schema below for constraints and defaults. |
mashup_company_id | No | integer / null | See the schema below for constraints and defaults. |
deal_id | No | string / null | See the schema below for constraints and defaults. |
owner_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 50, "title": "Limit", "type": "integer" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "mashup_company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Mashup Company Id" }, "deal_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Deal Id" }, "owner_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Owner Id" } }, "title": "g8_list_quotesArguments", "type": "object"}g8_list_schedules
List sending-window schedules the user can attach at launch. A schedule is the “when do we send?” picker: a name, a timezone, and per-day windows. Pass the row’s id back as schedule_id on g8_gtm_launch_campaign. Use BEFORE launching whenever send timing matters; without it the sequence falls back to the org default window. Args: include_archived: When True, also include archived schedules (rare; default False matches the in-app picker). search: Substring filter on schedule name + description.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
include_archived | No | boolean | See the schema below for constraints and defaults. |
search | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "include_archived": { "default": false, "title": "Include Archived", "type": "boolean" }, "search": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Search" } }, "title": "list_schedulesArguments", "type": "object"}g8_list_sequence_steps
List a sequence’s steps with their resolved copy (read-only). The step list from g8_get_sequence_preview without the sequence and channel envelope. Use it to verify what a specific step will actually send after writing spintax into it. Each step carries the same rendered block, so rendered.variants is the direct proof that per-contact variation works. Args: sequence_id: Sequence ID whose steps to list
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "title": "Sequence Id", "type": "string" } }, "required": [ "sequence_id" ], "title": "g8_list_sequence_stepsArguments", "type": "object"}g8_list_sequences
List available outbound sequences in your organization. Returns sequence IDs, names, status, and step counts. Use this to find a sequence_id before calling g8_add_to_sequence. Nurture sequences are ordinary sequences with sequence_kind=“nurture”; pass sequence_kind=“nurture” to list only those (or “cold_outbound” for standard outreach). Omit to list every kind. Args: page: Page number (default 1) limit: Items per page (default 50) sequence_kind: Optional filter by kind (‘cold_outbound’ or ‘nurture’). Omit to list all.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
sequence_kind | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 50, "title": "Limit", "type": "integer" }, "sequence_kind": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Sequence Kind" } }, "title": "g8_list_sequencesArguments", "type": "object"}g8_lookup_company
Instantly look up a single company in graph8’s data index. Provide at least one of: domain or name. Returns enriched data including revenue, headcount, industry, tech stack, funding, and a confidence score. Costs 1 credit. This searches external data - the company does NOT need to be in your CRM. Args: domain: Company domain (e.g. acme.com) name: Company name
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
domain | No | string / null | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "domain": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Domain" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" } }, "title": "g8_lookup_companyArguments", "type": "object"}g8_lookup_person
Instantly look up a single person in graph8’s data index. Provide at least one of: email, linkedin_url, or (first_name + last_name + company_domain). Returns enriched data including verified email, phone, job title, company info, and a confidence score. Costs 1 credit. This searches external data - the person does NOT need to be in your CRM. To save them to your CRM afterward, use g8_create_contact. Args: email: Person’s email address linkedin_url: Person’s LinkedIn profile URL first_name: Person’s first name (combine with last_name + company_domain) last_name: Person’s last name company_domain: Person’s company domain (e.g. acme.com)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
email | No | string / null | See the schema below for constraints and defaults. |
linkedin_url | No | string / null | See the schema below for constraints and defaults. |
first_name | No | string / null | See the schema below for constraints and defaults. |
last_name | No | string / null | See the schema below for constraints and defaults. |
company_domain | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Email" }, "linkedin_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Linkedin Url" }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "First Name" }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Last Name" }, "company_domain": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Company Domain" } }, "title": "g8_lookup_personArguments", "type": "object"}g8_meetings_booked
Count + recent list of BOOKED meetings (not cancelled/deleted/private). Use for “how many meetings did we book”, “meetings this week”, or “upcoming meetings” (set upcoming_only=true). Org-scoped to your API key. Metadata only - no transcript content; call g8_get_meeting for a transcript. The result’s count is the real total; page past it with page until has_next is false. Args: days: Lookback window in days (default 30, max 365). limit: Max meetings per page (default 20, max 50). page: 1-based page over the booked list (default 1). upcoming_only: Only meetings from now forward (ignores days).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
days | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
upcoming_only | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "days": { "default": 30, "title": "Days", "type": "integer" }, "limit": { "default": 20, "title": "Limit", "type": "integer" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "upcoming_only": { "default": false, "title": "Upcoming Only", "type": "boolean" } }, "title": "g8_meetings_bookedArguments", "type": "object"}g8_newsletter_add_subscriber
Add a single subscriber to a newsletter (status=subscribed). Also creates/links a first-class CRM contact so the subscriber joins the central suppression model - mirrors the public subscribe form. Args: newsletter_id: Newsletter UUID. email: Subscriber email address (max 255 chars). first_name: Optional first name. last_name: Optional last name.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
email | Yes | string | See the schema below for constraints and defaults. |
first_name | No | string / null | See the schema below for constraints and defaults. |
last_name | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "email": { "title": "Email", "type": "string" }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "First Name" }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Last Name" } }, "required": [ "newsletter_id", "email" ], "title": "g8_newsletter_add_subscriberArguments", "type": "object"}g8_newsletter_create_issue
Create a draft newsletter issue. Always creates, never sends. Args: newsletter_id: Newsletter UUID to attach the issue to. subject: Email subject line (max 2000 chars). html_body: Full HTML email body. preview_text: Optional inbox preview snippet (max 500 chars). plain_text: Optional plain-text fallback body. sender_name: Optional From display name (max 255 chars). Falls back to the newsletter’s default sender settings if omitted. sender_email: Optional From email address. Falls back to the newsletter’s default sender settings if omitted. reply_to: Optional Reply-To email address.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
subject | Yes | string | See the schema below for constraints and defaults. |
html_body | Yes | string | See the schema below for constraints and defaults. |
preview_text | No | string / null | See the schema below for constraints and defaults. |
plain_text | No | string / null | See the schema below for constraints and defaults. |
sender_name | No | string / null | See the schema below for constraints and defaults. |
sender_email | No | string / null | See the schema below for constraints and defaults. |
reply_to | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "subject": { "title": "Subject", "type": "string" }, "html_body": { "title": "Html Body", "type": "string" }, "preview_text": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Preview Text" }, "plain_text": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Plain Text" }, "sender_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Sender Name" }, "sender_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Sender Email" }, "reply_to": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Reply To" } }, "required": [ "newsletter_id", "subject", "html_body" ], "title": "g8_newsletter_create_issueArguments", "type": "object"}g8_newsletter_create_newsletter
Create a new newsletter - the parent container issues live under. Always starts in
draftstatus. Call this before creating any issue. Args: name: Newsletter name (max 255 chars). goal: Optional free-text description of what this newsletter is for.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
name | Yes | string | See the schema below for constraints and defaults. |
goal | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "name": { "title": "Name", "type": "string" }, "goal": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Goal" } }, "required": [ "name" ], "title": "g8_newsletter_create_newsletterArguments", "type": "object"}g8_newsletter_duplicate_issue
Duplicate any issue (any status) into a new draft. Useful for recurring sends - clone last week’s issue instead of rebuilding it from scratch. Args: newsletter_id: Newsletter UUID the source issue belongs to. issue_id: Source issue id.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
issue_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "issue_id": { "title": "Issue Id", "type": "integer" } }, "required": [ "newsletter_id", "issue_id" ], "title": "g8_newsletter_duplicate_issueArguments", "type": "object"}g8_newsletter_get_issue
Get full issue detail: subject, html body, status, send stats. Args: newsletter_id: Newsletter UUID the issue belongs to. issue_id: Issue id from g8_newsletter_list_issues / g8_newsletter_create_issue.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
issue_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "issue_id": { "title": "Issue Id", "type": "integer" } }, "required": [ "newsletter_id", "issue_id" ], "title": "g8_newsletter_get_issueArguments", "type": "object"}g8_newsletter_get_issue_analytics
Bucketed KPI counters for a sent issue: opens, clicks, bounces, unsubscribes. Args: newsletter_id: Newsletter UUID the issue belongs to. issue_id: Issue id (should be a sent issue - a draft has no engagement yet).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
issue_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "issue_id": { "title": "Issue Id", "type": "integer" } }, "required": [ "newsletter_id", "issue_id" ], "title": "g8_newsletter_get_issue_analyticsArguments", "type": "object"}g8_newsletter_get_newsletter
Get a single newsletter (name, status, goal, audience list). Args: newsletter_id: Newsletter UUID from g8_newsletter_list_newsletters / g8_newsletter_create_newsletter.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" } }, "required": [ "newsletter_id" ], "title": "g8_newsletter_get_newsletterArguments", "type": "object"}g8_newsletter_list_issues
List every issue (draft, scheduled, or sent) on a newsletter. Args: newsletter_id: Newsletter UUID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" } }, "required": [ "newsletter_id" ], "title": "g8_newsletter_list_issuesArguments", "type": "object"}g8_newsletter_list_newsletters
List every newsletter in your org. Call this first to discover a newsletter_id - every issue/subscriber tool below requires one.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_newsletter_list_newslettersArguments", "type": "object"}g8_newsletter_list_subscribers
Paginated subscriber list for a newsletter. Args: newsletter_id: Newsletter UUID. page: 1-indexed page (default 1). page_size: Rows per page (default 25, max 100). search: Optional free-text search over email/first/last name. status: Optional comma-separated status filter, e.g. ‘subscribed,bounced’.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
page_size | No | integer | See the schema below for constraints and defaults. |
search | No | string / null | See the schema below for constraints and defaults. |
status | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "page_size": { "default": 25, "title": "Page Size", "type": "integer" }, "search": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Search" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" } }, "required": [ "newsletter_id" ], "title": "g8_newsletter_list_subscribersArguments", "type": "object"}g8_newsletter_list_templates
List org-level newsletter templates (reusable HTML scaffolds). Use with g8_newsletter_create_issue by pasting a template’s html_body, or build an issue from scratch without one.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_newsletter_list_templatesArguments", "type": "object"}g8_newsletter_send_issue
Send a newsletter issue to every subscribed, deliverable subscriber. Sends real customer-facing email. Not idempotent - calling twice sends twice. Returns immediately once the send is enqueued (202 semantics) - actual delivery happens asynchronously. Poll g8_newsletter_get_issue to observe completion, or g8_newsletter_get_issue_analytics once sent. Args: newsletter_id: Newsletter UUID the issue belongs to. issue_id: Issue id (must be a draft or already-scheduled issue). scheduled_at: Optional ISO-8601 timestamp to schedule the send for later. Omit to send immediately.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
issue_id | Yes | integer | See the schema below for constraints and defaults. |
scheduled_at | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "issue_id": { "title": "Issue Id", "type": "integer" }, "scheduled_at": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Scheduled At" } }, "required": [ "newsletter_id", "issue_id" ], "title": "g8_newsletter_send_issueArguments", "type": "object"}g8_newsletter_send_test
Send a test copy of an issue to ONE email address. Sends a real email, but never touches the subscriber list or issue status - safe to call repeatedly while drafting. Args: newsletter_id: Newsletter UUID the issue belongs to. issue_id: Issue id to preview. test_email: Address to send the test to.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
issue_id | Yes | integer | See the schema below for constraints and defaults. |
test_email | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "issue_id": { "title": "Issue Id", "type": "integer" }, "test_email": { "title": "Test Email", "type": "string" } }, "required": [ "newsletter_id", "issue_id", "test_email" ], "title": "g8_newsletter_send_testArguments", "type": "object"}g8_newsletter_unsubscribe_subscriber
Soft-unsubscribe a subscriber. Sets status, preserves the row - does NOT hard-delete. Args: newsletter_id: Newsletter UUID. subscriber_id: Subscriber id from g8_newsletter_list_subscribers.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
subscriber_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "subscriber_id": { "title": "Subscriber Id", "type": "integer" } }, "required": [ "newsletter_id", "subscriber_id" ], "title": "g8_newsletter_unsubscribe_subscriberArguments", "type": "object"}g8_newsletter_update_issue
Update a draft issue (partial). Pass only the fields you want to change. Rejects with an error for issues no longer in a draft-editable state - use g8_newsletter_duplicate_issue to get a fresh editable copy of a sent issue instead. Args: see g8_newsletter_create_issue - same field meanings. issue_id: Issue id to update.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
newsletter_id | Yes | string | See the schema below for constraints and defaults. |
issue_id | Yes | integer | See the schema below for constraints and defaults. |
subject | No | string / null | See the schema below for constraints and defaults. |
html_body | No | string / null | See the schema below for constraints and defaults. |
preview_text | No | string / null | See the schema below for constraints and defaults. |
plain_text | No | string / null | See the schema below for constraints and defaults. |
sender_name | No | string / null | See the schema below for constraints and defaults. |
sender_email | No | string / null | See the schema below for constraints and defaults. |
reply_to | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "newsletter_id": { "title": "Newsletter Id", "type": "string" }, "issue_id": { "title": "Issue Id", "type": "integer" }, "subject": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Subject" }, "html_body": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Html Body" }, "preview_text": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Preview Text" }, "plain_text": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Plain Text" }, "sender_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Sender Name" }, "sender_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Sender Email" }, "reply_to": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Reply To" } }, "required": [ "newsletter_id", "issue_id" ], "title": "g8_newsletter_update_issueArguments", "type": "object"}g8_object_archive
Archive a native object without deleting data. Requires objects:manage and Admin access; update can restore it.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" } }, "required": [ "object_slug" ], "title": "g8_object_archiveArguments", "type": "object"}g8_object_attribute_archive
Archive a custom field without deleting its values; update can restore it. Requires objects:manage and Admin access.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
attribute_slug | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "attribute_slug": { "title": "Attribute Slug", "type": "string" } }, "required": [ "object_slug", "attribute_slug" ], "title": "g8_object_attribute_archiveArguments", "type": "object"}g8_object_attribute_create
Create a CRM field with slug, title, attribute_type and optional constraints/config/defaults. Requires objects:manage and current Admin access.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
definition | Yes | object | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "definition": { "additionalProperties": true, "title": "Definition", "type": "object" } }, "required": [ "object_slug", "definition" ], "title": "g8_object_attribute_createArguments", "type": "object"}g8_object_attribute_update
Edit or restore a field using is_archived=false. Omitted fields are preserved; default_value=null clears the default. Type and slug are immutable. Requires objects:manage and Admin access.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
attribute_slug | Yes | string | See the schema below for constraints and defaults. |
changes | Yes | object | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "attribute_slug": { "title": "Attribute Slug", "type": "string" }, "changes": { "additionalProperties": true, "title": "Changes", "type": "object" } }, "required": [ "object_slug", "attribute_slug", "changes" ], "title": "g8_object_attribute_updateArguments", "type": "object"}g8_object_attributes
Discover typed fields, constraints, configured defaults and reference targets.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
include_archived | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "include_archived": { "default": false, "title": "Include Archived", "type": "boolean" } }, "required": [ "object_slug" ], "title": "g8_object_attributesArguments", "type": "object"}g8_object_create
Create a native custom object. Requires objects:manage and current Admin access; standard names are reserved.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
slug | Yes | string | See the schema below for constraints and defaults. |
singular_noun | Yes | string | See the schema below for constraints and defaults. |
plural_noun | Yes | string | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
icon | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "slug": { "title": "Slug", "type": "string" }, "singular_noun": { "title": "Singular Noun", "type": "string" }, "plural_noun": { "title": "Plural Noun", "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "icon": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Icon" } }, "required": [ "slug", "singular_noun", "plural_noun" ], "title": "g8_object_createArguments", "type": "object"}g8_object_get
Read a native custom object’s definition by its discovered API slug.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" } }, "required": [ "object_slug" ], "title": "g8_object_getArguments", "type": "object"}g8_object_list
Discover native custom CRM objects, optionally including archived definitions without restoring them.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
include_archived | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "include_archived": { "default": false, "title": "Include Archived", "type": "boolean" } }, "title": "g8_object_listArguments", "type": "object"}g8_object_record_archive
Archive a custom record, hiding it from listings while retaining its identity and history.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
record_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "record_id": { "title": "Record Id", "type": "string" } }, "required": [ "object_slug", "record_id" ], "title": "g8_object_record_archiveArguments", "type": "object"}g8_object_record_changes
Read custom-record or canonical contact/company mutation facts. Limit 1-200; pass next_cursor to continue. Contact/company IDs stay canonical; current record access and field privacy apply to historical values. Archived records and older unrecorded mutations are not supplied by this reader. An unavailable store fails with 503 rather than reporting zero history.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
record_id | Yes | string | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
cursor | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "record_id": { "title": "Record Id", "type": "string" }, "limit": { "default": 100, "title": "Limit", "type": "integer" }, "cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Cursor" } }, "required": [ "object_slug", "record_id" ], "title": "g8_object_record_changesArguments", "type": "object"}g8_object_record_create
Create a native custom record. Discover attributes first; schema validation and scoped access apply.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
values | Yes | object | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "values": { "additionalProperties": true, "title": "Values", "type": "object" } }, "required": [ "object_slug", "values" ], "title": "g8_object_record_createArguments", "type": "object"}g8_object_record_get
Read one native custom record, canonical contact/company, or deal using its stable graph8 ID. Contacts and companies use canonical IDs, not source CONTACT_ID/COMPANY_ID values. Deals retain UUIDs; company, primary-contact and contact_ids references require related-record access. Generic deal mutations are not yet supported.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
record_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "record_id": { "title": "Record Id", "type": "string" } }, "required": [ "object_slug", "record_id" ], "title": "g8_object_record_getArguments", "type": "object"}g8_object_record_history
Read historical value generations and actor attribution, newest first. Limit 1-500.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
record_id | Yes | string | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "record_id": { "title": "Record Id", "type": "string" }, "limit": { "default": 100, "title": "Limit", "type": "integer" } }, "required": [ "object_slug", "record_id" ], "title": "g8_object_record_historyArguments", "type": "object"}g8_object_record_restore
Restore an archived custom record under current schema and unique constraints. Conflicts preserve the archive.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
record_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "record_id": { "title": "Record Id", "type": "string" } }, "required": [ "object_slug", "record_id" ], "title": "g8_object_record_restoreArguments", "type": "object"}g8_object_record_update
PATCH a custom record, canonical contact or company. Omitted fields stay unchanged; null clears optional values; arrays replace values. Contact/company updates require expected_revision from a fresh read. Custom records also support append_values/remove_values; field groups cannot overlap. Stale revisions return 409.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
record_id | Yes | string | See the schema below for constraints and defaults. |
values | Yes | object | See the schema below for constraints and defaults. |
expected_revision | No | integer / null | See the schema below for constraints and defaults. |
append_values | No | object / null | See the schema below for constraints and defaults. |
remove_values | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "record_id": { "title": "Record Id", "type": "string" }, "values": { "additionalProperties": true, "title": "Values", "type": "object" }, "expected_revision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Expected Revision" }, "append_values": { "anyOf": [ { "additionalProperties": { "items": {}, "type": "array" }, "type": "object" }, { "type": "null" } ], "default": null, "title": "Append Values" }, "remove_values": { "anyOf": [ { "additionalProperties": { "items": {}, "type": "array" }, "type": "object" }, { "type": "null" } ], "default": null, "title": "Remove Values" } }, "required": [ "object_slug", "record_id", "values" ], "title": "g8_object_record_updateArguments", "type": "object"}g8_object_record_upsert
Create or update by an active single-value unique attribute. Supply its value in values. Omitted fields are preserved. A revision requires an existing, unchanged match.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
matching_attribute | Yes | string | See the schema below for constraints and defaults. |
values | Yes | object | See the schema below for constraints and defaults. |
expected_revision | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "matching_attribute": { "title": "Matching Attribute", "type": "string" }, "values": { "additionalProperties": true, "title": "Values", "type": "object" }, "expected_revision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Expected Revision" } }, "required": [ "object_slug", "matching_attribute", "values" ], "title": "g8_object_record_upsertArguments", "type": "object"}g8_object_records
List custom records or canonical deals with current values and revisions. Deal totals and related references respect current access. Pass next_cursor for the next page. Limit 1-200.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
cursor | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "limit": { "default": 50, "title": "Limit", "type": "integer" }, "cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Cursor" } }, "required": [ "object_slug" ], "title": "g8_object_recordsArguments", "type": "object"}g8_object_update
Update a native object; slug/data are preserved. presentation accepts description, icon, display_attribute_slug; omit keys to preserve or use null to clear. Requires objects:manage and Admin access.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
object_slug | Yes | string | See the schema below for constraints and defaults. |
singular_noun | No | string / null | See the schema below for constraints and defaults. |
plural_noun | No | string / null | See the schema below for constraints and defaults. |
is_archived | No | boolean / null | See the schema below for constraints and defaults. |
presentation | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "object_slug": { "title": "Object Slug", "type": "string" }, "singular_noun": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Singular Noun" }, "plural_noun": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Plural Noun" }, "is_archived": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Is Archived" }, "presentation": { "anyOf": [ { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "type": "object" }, { "type": "null" } ], "default": null, "title": "Presentation" } }, "required": [ "object_slug" ], "title": "g8_object_updateArguments", "type": "object"}g8_pause_sequence
Pause a live sequence. Contacts in progress will be wound down. IMPORTANT: This pauses real outreach. Confirm with the user first. Args: sequence_id: Sequence ID to pause
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "title": "Sequence Id", "type": "string" } }, "required": [ "sequence_id" ], "title": "g8_pause_sequenceArguments", "type": "object"}g8_push_to_crm_company
Push companies to an external CRM provider. IMPORTANT: This creates real records in the external CRM. Confirm with the user before pushing. Args: provider: CRM provider (hubspot, salesforce, pipedrive, zoho, sugarcrm) records: List of company records to push (each a dict with company fields)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
provider | Yes | string | See the schema below for constraints and defaults. |
records | Yes | array | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "provider": { "title": "Provider", "type": "string" }, "records": { "items": { "additionalProperties": true, "type": "object" }, "title": "Records", "type": "array" } }, "required": [ "provider", "records" ], "title": "g8_push_to_crm_companyArguments", "type": "object"}g8_push_to_crm_contact
Push contacts to an external CRM provider. IMPORTANT: This creates real records in the external CRM. Confirm with the user before pushing. Args: provider: CRM provider (hubspot, salesforce, pipedrive, zoho, sugarcrm) records: List of contact records to push (each a dict with contact fields)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
provider | Yes | string | See the schema below for constraints and defaults. |
records | Yes | array | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "provider": { "title": "Provider", "type": "string" }, "records": { "items": { "additionalProperties": true, "type": "object" }, "title": "Records", "type": "array" } }, "required": [ "provider", "records" ], "title": "g8_push_to_crm_contactArguments", "type": "object"}g8_push_to_crm_list
Modify CRM list memberships (add/remove contacts from lists). Each record should contain: list_id, add_contact_ids, remove_contact_ids. Args: provider: CRM provider (hubspot, salesforce, pipedrive, zoho, sugarcrm) records: List of membership operations
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
provider | Yes | string | See the schema below for constraints and defaults. |
records | Yes | array | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "provider": { "title": "Provider", "type": "string" }, "records": { "items": { "additionalProperties": true, "type": "object" }, "title": "Records", "type": "array" } }, "required": [ "provider", "records" ], "title": "g8_push_to_crm_listArguments", "type": "object"}g8_radar_ad_detail
One ad’s full detail for the creative drawer - a plain read on the stored ad_creative snapshot (copy / headline / image / dates) joined to the rival’s traffic + threat context. NO LLM, NO live call. Args: ad_id: The ad id (matched via the snapshot data->>‘ad_id’ key).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
ad_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "ad_id": { "title": "Ad Id", "type": "string" } }, "required": [ "ad_id" ], "title": "g8_radar_ad_detailArguments", "type": "object"}g8_radar_add_competitor
Add one competitor to track. Returns the created competitor profile. 409 if already tracked, 422 if the 20-competitor limit is reached. Args: domain: Competitor domain (required; normalized to its apex). name: Optional display name. tier: tier1 or tier2 (default tier2). scan_config: Optional {mode: auto|manual, include_paths: […]} page selection config.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
domain | Yes | string | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
tier | No | string / null | See the schema below for constraints and defaults. |
scan_config | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "domain": { "title": "Domain", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "tier": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Tier" }, "scan_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Scan Config" } }, "required": [ "domain" ], "title": "g8_radar_add_competitorArguments", "type": "object"}g8_radar_aeo_overview
Answer-engine share-of-voice: mention rate, citation rate, SoV vs rivals, leaderboard, and recent runs. Empty (not an error) before any run or before the AEO tables are provisioned.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_aeo_overviewArguments", "type": "object"}g8_radar_aeo_probes
List the org’s tracked AEO buyer-intent probes (the questions queried against the baseline answer engine).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_aeo_probesArguments", "type": "object"}g8_radar_analyze_gaps
BILLABLE: enqueue gap analysis across the tracked competitor set. Runs an LLM pass async on Celery; returns {task_id}. Restrict to a subset of lenses to scope (and bound) the run. Args: lenses: Optional subset of allowed gap lenses to analyze. Omit to run all.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
lenses | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "lenses": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Lenses" } }, "title": "g8_radar_analyze_gapsArguments", "type": "object"}g8_radar_approve_all_opportunities
DESTRUCTIVE / BILLABLE: approve all scored opportunities in one lane (top-50 by score per call; re-run to drain the rest,
remainingsignals more). Converts each into an initiative + seeds stubs (consumes credits when content is generated). Args: lane: Which lane to drain - now, next, or later (default now).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
lane | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "lane": { "default": "now", "title": "Lane", "type": "string" } }, "title": "g8_radar_approve_all_opportunitiesArguments", "type": "object"}g8_radar_approve_opportunity
DESTRUCTIVE / BILLABLE: approve one scored opportunity (open gap) - converts it into an initiative + seeds the content stubs. May create content-generation work for the requested content types (consumes credits when content is generated). Args: gap_id: The gap UUID to approve (must be status=‘open’). content_types: Optional subset of allowed kinds to seed (else the lens default). seed_context: Optional {primary_keyword, volume, cpc} to seed an SEO page.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
gap_id | Yes | string | See the schema below for constraints and defaults. |
content_types | No | array / null | See the schema below for constraints and defaults. |
seed_context | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "gap_id": { "title": "Gap Id", "type": "string" }, "content_types": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Content Types" }, "seed_context": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Seed Context" } }, "required": [ "gap_id" ], "title": "g8_radar_approve_opportunityArguments", "type": "object"}g8_radar_battle_card
Sales-enablement battle card composed from existing Radar intel (NO LLM / paid call): our evidence-gated advantages, the rival’s edges + our exposure (open gaps citing them), their recent moves, and a talk-track. Args: competitor_id: Competitor profile UUID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" } }, "required": [ "competitor_id" ], "title": "g8_radar_battle_cardArguments", "type": "object"}g8_radar_bulk_add_competitors
Add many competitors at once (toggle-from-suggestions UX). Per item: normalize + dedup + respect the 20-competitor cap. Returns {created: <count>, skipped: [{domain, reason}]} where reason is limit / exists / invalid. Args: competitors: List of {domain, name?, tier?, scan_config?} dicts (max 20).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitors | Yes | array | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitors": { "items": { "additionalProperties": true, "type": "object" }, "title": "Competitors", "type": "array" } }, "required": [ "competitors" ], "title": "g8_radar_bulk_add_competitorsArguments", "type": "object"}g8_radar_compare_snapshot
Before/after diff for one page snapshot. By default compares against the prior capture of the same URL; pass
againstto diff against a specific earlier capture (the version-timeline ‘compare any two’). Args: snapshot_id: The snapshot UUID to diff (current side). against: Optional earlier snapshot UUID of the same page.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
snapshot_id | Yes | string | See the schema below for constraints and defaults. |
against | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "snapshot_id": { "title": "Snapshot Id", "type": "string" }, "against": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Against" } }, "required": [ "snapshot_id" ], "title": "g8_radar_compare_snapshotArguments", "type": "object"}g8_radar_competitor_ads
Captured ad creatives for one competitor (distinct by ad, latest capture, newest first). Reads the durable ad_creative snapshot corpus so it works for all tiers. Captured-corpus, not a guaranteed-live set. Args: competitor_id: Competitor profile UUID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" } }, "required": [ "competitor_id" ], "title": "g8_radar_competitor_adsArguments", "type": "object"}g8_radar_competitor_engagers
Steal-Their-Audience: people who engage this competitor’s LinkedIn content who are ALREADY known to us - counts (engaged / in CRM / at open-deal accounts) + a per-engager list. Listener-gated: with no per-org LinkedIn listener the response is honest-empty (configured=True, listener=False). Requires a deals-read permission. Args: competitor_id: Competitor profile UUID. limit: Max engagers (default 100, 1-200).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" }, "limit": { "default": 100, "title": "Limit", "type": "integer" } }, "required": [ "competitor_id" ], "title": "g8_radar_competitor_engagersArguments", "type": "object"}g8_radar_competitor_pages
Distinct tracked pages for one competitor (latest snapshot per URL, kind=‘page’), newest-captured first. The “Pages tracked” click-through; each row’s id opens the per-page version timeline. Args: competitor_id: Competitor profile UUID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" } }, "required": [ "competitor_id" ], "title": "g8_radar_competitor_pagesArguments", "type": "object"}g8_radar_competitor_posts
LinkedIn posts for one competitor (the “Posts / wk” click-through). Reads the matched-post store posts_per_week is derived from. Degrades to a configured-aware empty list (never a 500) when no source is wired. Args: competitor_id: Competitor profile UUID. limit: Max posts (default 50, 1-200).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" }, "limit": { "default": 50, "title": "Limit", "type": "integer" } }, "required": [ "competitor_id" ], "title": "g8_radar_competitor_postsArguments", "type": "object"}g8_radar_competitor_suggestions
Detected-but-untracked competitors surfaced from the org’s existing intelligence (competitor_discovery) + the competitors global-context doc. Each suggestion flags already_tracked. Best-effort (degrades to an empty list on source failure).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_competitor_suggestionsArguments", "type": "object"}g8_radar_competitor_traffic
Traffic detail for one competitor: current estimate + trend plus the ETV / ranked-keyword-count history from the kind=‘traffic’ snapshot series. Args: competitor_id: Competitor profile UUID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" } }, "required": [ "competitor_id" ], "title": "g8_radar_competitor_trafficArguments", "type": "object"}g8_radar_delete_competitor
DESTRUCTIVE: delete a tracked competitor and all its captured snapshots (pages, ads, traffic history). Irreversible. Returns {ok: True}. Args: competitor_id: Competitor profile UUID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" } }, "required": [ "competitor_id" ], "title": "g8_radar_delete_competitorArguments", "type": "object"}g8_radar_discover_pages
Discover a competitor’s pages (Firecrawl /map) for the tracked-pages picker - traffic-ranked, pricing/feature boosted, current selection flagged. Cached per competitor (6h). BILLABLE when refresh=True: bypasses the cache and re-maps the site (a paid Firecrawl call). Leave refresh=False to read the cached inventory. Args: competitor_id: Competitor profile UUID. refresh: When True, force a fresh paid site map (default False).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
refresh | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" }, "refresh": { "default": false, "title": "Refresh", "type": "boolean" } }, "required": [ "competitor_id" ], "title": "g8_radar_discover_pagesArguments", "type": "object"}g8_radar_dispatch_alerts
DESTRUCTIVE: detect + deliver new competitor-move alerts now (in-app bell + bridge mirror for opted-in users), respecting the org’s alert toggles + channels. Sends real notifications to users. Per-snapshot deduped so repeated calls can’t re-spam. Returns {delivered: <count>}. Requires settings:write.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_dispatch_alertsArguments", "type": "object"}g8_radar_feature_matrix
Capability/feature comparison matrix (v1: one capability row per advantage claim) across the tracked competitor set.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_feature_matrixArguments", "type": "object"}g8_radar_get_competitor
Single-competitor aggregation: profile + pages-tracked count + recent content changes + open gaps citing this rival. Args: competitor_id: Competitor profile UUID (from g8_radar_list_competitors).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" } }, "required": [ "competitor_id" ], "title": "g8_radar_get_competitorArguments", "type": "object"}g8_radar_get_settings
Read the org’s Radar settings: tier cadence days, alert toggles, delivery channels (in_app / bridge), and ad_source. Seed-on-empty: degrades to defaults when the org schema isn’t yet migrated.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_get_settingsArguments", "type": "object"}g8_radar_keyword_gap
Keywords each rival ranks for that the org does NOT (“what you’re missing”). Computed from persisted competitor keywords minus the org’s own ranked set. available=False when the org’s own keywords can’t be resolved.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_keyword_gapArguments", "type": "object"}g8_radar_list_competitors
List every tracked competitor profile (active + inactive), tier then domain order. Each carries threat_score, traffic_estimate, posts/wk, ads-live count, scan status, scan_config, and page_budget.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_list_competitorsArguments", "type": "object"}g8_radar_list_gaps
List competitive gaps, optionally filtered. Args: lens: Filter by gap lens (must be an allowed lens, else 400). status: Filter by status - open, dismissed, or converted. competitor_id: Filter to gaps citing this competitor.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
lens | No | string / null | See the schema below for constraints and defaults. |
status | No | string / null | See the schema below for constraints and defaults. |
competitor_id | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "lens": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Lens" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "competitor_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Competitor Id" } }, "title": "g8_radar_list_gapsArguments", "type": "object"}g8_radar_list_initiatives
List radar initiatives (converted opportunities under execution), optionally filtered by lane (now / next / later / live / done). Args: lane: Filter by initiative lane.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
lane | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "lane": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Lane" } }, "title": "g8_radar_list_initiativesArguments", "type": "object"}g8_radar_list_opportunities
List opportunities - the scored OPEN gaps (no separate table), optionally filtered to one lane (now / next / later). Args: lane: Filter by opportunity lane (now, next, or later).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
lane | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "lane": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Lane" } }, "title": "g8_radar_list_opportunitiesArguments", "type": "object"}g8_radar_measure_initiatives
Run the performance loopback now: write content-progression + rival-traffic outcome signals onto the org’s active initiatives. Free (DB-only; also runs on the weekly sweep). Returns {measured: <count>}. Requires settings:write.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_measure_initiativesArguments", "type": "object"}g8_radar_monitoring_ads
Ads & keywords. Reads the durable ad_creative snapshot corpus (never empty-by-design); optionally augments with a live provider fetch per the org’s ad_source setting. Keywords = persisted organic + paid.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_monitoring_adsArguments", "type": "object"}g8_radar_monitoring_content
Competitor content-change feed. Filter by competitor, page kind, change category / type, minimum significance (0-100), date range, and free-text search. Args: competitor_id: Filter to one competitor. kind: Filter by page kind (e.g. pricing, page, features). change_category: Filter by change category. change_type: Filter by change type (new, changed, removed). min_significance: Minimum significance score (0-100). date_from: ISO start date. date_to: ISO end date. search: Free-text search (max 200 chars). limit: Max rows (default 50, 1-200).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | No | string / null | See the schema below for constraints and defaults. |
kind | No | string / null | See the schema below for constraints and defaults. |
change_category | No | string / null | See the schema below for constraints and defaults. |
change_type | No | string / null | See the schema below for constraints and defaults. |
min_significance | No | integer / null | See the schema below for constraints and defaults. |
date_from | No | string / null | See the schema below for constraints and defaults. |
date_to | No | string / null | See the schema below for constraints and defaults. |
search | No | string / null | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Competitor Id" }, "kind": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Kind" }, "change_category": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Change Category" }, "change_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Change Type" }, "min_significance": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Min Significance" }, "date_from": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Date From" }, "date_to": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Date To" }, "search": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Search" }, "limit": { "default": 50, "title": "Limit", "type": "integer" } }, "title": "g8_radar_monitoring_contentArguments", "type": "object"}g8_radar_monitoring_linkedin
Competitor LinkedIn posts for the LinkedIn sub-tab (listener store first, then the MixRank company-post corpus fallback for tracked competitors). Args: limit: Max posts (default 50, 1-200).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "limit": { "default": 50, "title": "Limit", "type": "integer" } }, "title": "g8_radar_monitoring_linkedinArguments", "type": "object"}g8_radar_optimization_runs
Radar-spawned content-refresh grids (ContentGrid ‘Radar: …’) with lean score aggregates over their content jobs.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_optimization_runsArguments", "type": "object"}g8_radar_overview
Radar dashboard summary: tracked counts, 7-day moves, open gaps, act-now / live-initiative funnel, the threat board (one row per active competitor), recent moves, and derived alerts. The single best entry point for “what’s happening with my competitors”.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_overviewArguments", "type": "object"}g8_radar_own_traffic_estimate
Estimated own-domain traffic (DataForSEO) - fallback for the Traffic & market view when the first-party tracking snippet isn’t installed. 6h success cache + 1h miss-cooldown bound the paid Labs call; the result is an APPROXIMATION, not first-party analytics.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_own_traffic_estimateArguments", "type": "object"}g8_radar_page_history
Full capture history for one page (competitor + url), newest-first - powers the per-page version timeline. Excludes unchanged re-captures. Args: url: The page URL (required, max 2048 chars). competitor_id: Competitor profile UUID (required). limit: Max history points (default 20, 1-50).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
url | Yes | string | See the schema below for constraints and defaults. |
competitor_id | Yes | string | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "url": { "title": "Url", "type": "string" }, "competitor_id": { "title": "Competitor Id", "type": "string" }, "limit": { "default": 20, "title": "Limit", "type": "integer" } }, "required": [ "url", "competitor_id" ], "title": "g8_radar_page_historyArguments", "type": "object"}g8_radar_run_aeo
BILLABLE: trigger an AEO run (generate probes on first use, then query the baseline answer engine for each). Async via Celery - one paid LLM call per probe. Guarded by settings:write + a per-org Redis cooldown (returns 429 while a recent run is in flight).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_run_aeoArguments", "type": "object"}g8_radar_scan_all
BILLABLE: enqueue a scan for every active competitor (up to 20). Runs async on Celery; returns the number of scans queued. Consumes paid crawl/provider credits per competitor.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_scan_allArguments", "type": "object"}g8_radar_scan_competitor
BILLABLE: enqueue a fresh scan of one competitor (crawl pages, ads, traffic). Runs async on Celery; returns {task_id}. Consumes paid crawl/provider credits. Args: competitor_id: Competitor profile UUID.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" } }, "required": [ "competitor_id" ], "title": "g8_radar_scan_competitorArguments", "type": "object"}g8_radar_traffic
Traffic & market view: per-competitor visit estimates + trend, with the org’s own domain marked is_self. The market-share comparison series.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_radar_trafficArguments", "type": "object"}g8_radar_update_competitor
Update a competitor profile (tier, active flag, name, or scan_config). Returns the updated profile. Use scan_config to pin the manual tracked-page selection from g8_radar_discover_pages. Args: competitor_id: Competitor profile UUID. tier: New tier - tier1 or tier2. is_active: Active / paused flag. name: New display name. scan_config: {mode: auto|manual, include_paths: […]} selection.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
competitor_id | Yes | string | See the schema below for constraints and defaults. |
tier | No | string / null | See the schema below for constraints and defaults. |
is_active | No | boolean / null | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
scan_config | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "competitor_id": { "title": "Competitor Id", "type": "string" }, "tier": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Tier" }, "is_active": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Is Active" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "scan_config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Scan Config" } }, "required": [ "competitor_id" ], "title": "g8_radar_update_competitorArguments", "type": "object"}g8_radar_update_gap
Update a gap’s status (open / dismissed / converted). Returns the updated gap. Args: gap_id: Gap UUID. status: New status - open, dismissed, or converted.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
gap_id | Yes | string | See the schema below for constraints and defaults. |
status | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "gap_id": { "title": "Gap Id", "type": "string" }, "status": { "title": "Status", "type": "string" } }, "required": [ "gap_id", "status" ], "title": "g8_radar_update_gapArguments", "type": "object"}g8_radar_update_settings
Replace the org’s Radar settings (PUT - full object). Reads current settings via g8_radar_get_settings first when you only want to change a field; any omitted field falls back to its default. Args: tier1_cadence_days: Scan cadence for tier1 competitors (1-365). tier2_cadence_days: Scan cadence for tier2 competitors (1-365). alerts: Toggles dict (pricing_change, new_ads, content_velocity, keyword_overtake, warm_account). channels: Delivery channels dict (in_app, bridge). ad_source: Ad source - stored, linkedin, meta, or all.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
tier1_cadence_days | No | integer / null | See the schema below for constraints and defaults. |
tier2_cadence_days | No | integer / null | See the schema below for constraints and defaults. |
alerts | No | object / null | See the schema below for constraints and defaults. |
channels | No | object / null | See the schema below for constraints and defaults. |
ad_source | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "tier1_cadence_days": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Tier1 Cadence Days" }, "tier2_cadence_days": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Tier2 Cadence Days" }, "alerts": { "anyOf": [ { "additionalProperties": { "type": "boolean" }, "type": "object" }, { "type": "null" } ], "default": null, "title": "Alerts" }, "channels": { "anyOf": [ { "additionalProperties": { "type": "boolean" }, "type": "object" }, { "type": "null" } ], "default": null, "title": "Channels" }, "ad_source": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Ad Source" } }, "title": "g8_radar_update_settingsArguments", "type": "object"}g8_repo_create_campaign
Create Campaign. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /repos/{repo_id}/campaigns
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | Repository ID |
body | Yes | #/$defs/Apideveloper_api__interfaces__v1__cli_campaigns_router__CampaignCreateRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "Apideveloper_api__interfaces__v1__cli_campaigns_router__CampaignCreateRequest": { "additionalProperties": false, "properties": { "brief": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Campaign brief", "title": "Brief" }, "category": { "default": "Outbound", "description": "Campaign category", "title": "Category", "type": "string" }, "core_concept": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Core concept", "title": "Core Concept" }, "goal": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Campaign goal", "title": "Goal" }, "name": { "description": "Campaign name", "title": "Name", "type": "string" }, "primary_hook": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Primary hook text", "title": "Primary Hook" }, "target_persona": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Target persona", "title": "Target Persona" } }, "required": [ "name" ], "title": "Apideveloper_api__interfaces__v1__cli_campaigns_router__CampaignCreateRequest", "type": "object" } }, "properties": { "repo_id": { "description": "Repository ID", "title": "Repo Id", "type": "string" }, "body": { "$ref": "#/$defs/Apideveloper_api__interfaces__v1__cli_campaigns_router__CampaignCreateRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "repo_id", "body" ], "title": "g8_repo_create_campaignArguments", "type": "object"}g8_repo_delete_repo
Delete Repo. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /repos/{repo_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | Repository ID |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "description": "Repository ID", "title": "Repo Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "repo_id" ], "title": "g8_repo_delete_repoArguments", "type": "object"}g8_repo_get_campaign_document
Get Campaign Document. Uses the current organization and existing API permissions. API: GET /repos/{repo_id}/campaigns/{campaign_id}/documents/{document_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | Repository ID |
campaign_id | Yes | string | Campaign ID |
document_id | Yes | string | Document ID |
Complete input schema
{ "properties": { "repo_id": { "description": "Repository ID", "title": "Repo Id", "type": "string" }, "campaign_id": { "description": "Campaign ID", "title": "Campaign Id", "type": "string" }, "document_id": { "description": "Document ID", "title": "Document Id", "type": "string" } }, "required": [ "repo_id", "campaign_id", "document_id" ], "title": "g8_repo_get_campaign_documentArguments", "type": "object"}g8_repo_launch_campaign
Launch Campaign. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /repos/{repo_id}/campaigns/{campaign_id}/launch
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | Repository ID |
campaign_id | Yes | string | Campaign ID |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "description": "Repository ID", "title": "Repo Id", "type": "string" }, "campaign_id": { "description": "Campaign ID", "title": "Campaign Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "repo_id", "campaign_id" ], "title": "g8_repo_launch_campaignArguments", "type": "object"}g8_repo_list_repos
List Repos. Uses the current organization and existing API permissions. API: GET /repos
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page | No | integer / null | Page number (1-indexed) |
limit | No | integer / null | Items per page (max 200) |
Complete input schema
{ "properties": { "page": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Page number (1-indexed)", "title": "Page" }, "limit": { "anyOf": [ { "maximum": 200, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Items per page (max 200)", "title": "Limit" } }, "title": "g8_repo_list_reposArguments", "type": "object"}g8_repo_list_streams
List Streams. Uses the current organization and existing API permissions. API: GET /repos/{repo_id}/streams
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | Repository ID |
Complete input schema
{ "properties": { "repo_id": { "description": "Repository ID", "title": "Repo Id", "type": "string" } }, "required": [ "repo_id" ], "title": "g8_repo_list_streamsArguments", "type": "object"}g8_repo_rollback_install
Rollback Install. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /repos/{repo_id}/rollback
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | Repository ID |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "description": "Repository ID", "title": "Repo Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "repo_id" ], "title": "g8_repo_rollback_installArguments", "type": "object"}g8_repo_update_campaign
Update Campaign. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PATCH /repos/{repo_id}/campaigns/{campaign_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | Repository ID |
campaign_id | Yes | string | Campaign ID |
body | Yes | #/$defs/Apideveloper_api__interfaces__v1__cli_campaigns_router__CampaignUpdateRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "Apideveloper_api__interfaces__v1__cli_campaigns_router__CampaignUpdateRequest": { "additionalProperties": false, "properties": { "brief": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Campaign brief", "title": "Brief" }, "category": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Campaign category", "title": "Category" }, "core_concept": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Core concept", "title": "Core Concept" }, "goal": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Campaign goal", "title": "Goal" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Campaign name", "title": "Name" }, "primary_hook": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Primary hook text", "title": "Primary Hook" }, "target_persona": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Target persona", "title": "Target Persona" } }, "title": "Apideveloper_api__interfaces__v1__cli_campaigns_router__CampaignUpdateRequest", "type": "object" } }, "properties": { "repo_id": { "description": "Repository ID", "title": "Repo Id", "type": "string" }, "campaign_id": { "description": "Campaign ID", "title": "Campaign Id", "type": "string" }, "body": { "$ref": "#/$defs/Apideveloper_api__interfaces__v1__cli_campaigns_router__CampaignUpdateRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "repo_id", "campaign_id", "body" ], "title": "g8_repo_update_campaignArguments", "type": "object"}g8_reschedule_booking
Reschedule a booking to a new start time. Free (no extra credit charge); re-sends the updated calendar invite and notifies the attendee. Returns the NEW booking detail. Args: booking_uid: Booking UID to move. start_time: New ISO-8601 start time (must be an available slot). rescheduling_reason: Optional reason shown in the notification.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
booking_uid | Yes | string | See the schema below for constraints and defaults. |
start_time | Yes | string | See the schema below for constraints and defaults. |
rescheduling_reason | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "booking_uid": { "title": "Booking Uid", "type": "string" }, "start_time": { "title": "Start Time", "type": "string" }, "rescheduling_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Rescheduling Reason" } }, "required": [ "booking_uid", "start_time" ], "title": "g8_appointments_reschedule_bookingArguments", "type": "object"}g8_resume_sequence
Resume a paused sequence. Contacts will resume receiving messages. IMPORTANT: This resumes real outreach. Confirm with the user first. Args: sequence_id: Sequence ID to resume
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "title": "Sequence Id", "type": "string" } }, "required": [ "sequence_id" ], "title": "g8_resume_sequenceArguments", "type": "object"}g8_scan_repo
Record repository scan results that YOU produced by reading the code. graph8 does not clone or scan the repository server-side. Walk the checked-out tree yourself (or run the
g8CLI) and send what you found here. The stored results are whatg8_install_spinereads to decide which patches to generate, so a scan recorded from a stale or guessed tree produces a patch set for a codebase that does not exist.tech_stackis required: a call without it is rejected by the API. Args: repo_id: Repository ID from g8_connect_repo or g8_status tech_stack: What you detected, e.g. {“framework”: “nextjs”, “language”: “typescript”, “package_manager”: “pnpm”} api_routes: Routes you found, e.g. [{“method”: “POST”, “path”: “/api/signup”}] readme_summary: A short summary of the README, if there is one product_type: b2b_saas, api, marketplace, ecommerce, … gtm_readiness: Flags you observed, e.g. {“has_analytics”: false, “has_forms”: true} scan_duration_ms: How long your scan took, in milliseconds
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
tech_stack | Yes | object | See the schema below for constraints and defaults. |
api_routes | No | array / null | See the schema below for constraints and defaults. |
readme_summary | No | string / null | See the schema below for constraints and defaults. |
product_type | No | string / null | See the schema below for constraints and defaults. |
gtm_readiness | No | object / null | See the schema below for constraints and defaults. |
scan_duration_ms | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" }, "tech_stack": { "additionalProperties": true, "title": "Tech Stack", "type": "object" }, "api_routes": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Api Routes" }, "readme_summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Readme Summary" }, "product_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Product Type" }, "gtm_readiness": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Gtm Readiness" }, "scan_duration_ms": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Scan Duration Ms" } }, "required": [ "repo_id", "tech_stack" ], "title": "g8_scan_repoArguments", "type": "object"}g8_search_companies
Search companies already in your CRM database. Returns companies that your organization has imported or created. Use this to find companies you already track - NOT for prospecting. For finding new companies, use g8_find_companies instead.
lifecycle_stageanswers “who is in Trial / Customers / Churned right now?” using the exact membership rule the in-app lifecycle grid uses, so the two can never disagree. It is a different question from the other filters and cannot be combined with them. Companies only - “who is in Trial” has no contact-side answer on this surface. Each row then also carries status, custom_status, subscription_status, owner_id and mrr_cents, which a plain search leaves null. Args: domain: Filter by company domain (e.g. acme.com) industry: Filter by industry name: Filter by company name (partial match) page: Page number (default 1) limit: Items per page (default 25, max 200). Raise it only when the user actually wants more than a screenful. lifecycle_stage: A stageslug(or entry id) fromg8_get_pipeline(include_lifecycle=True). Returns the companies in that stage. A 403 on this branch means the key is missing the deals:read scope this stage read needs, not that the stage is empty.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
domain | No | string / null | See the schema below for constraints and defaults. |
industry | No | string / null | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
lifecycle_stage | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "domain": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Domain" }, "industry": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Industry" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 25, "title": "Limit", "type": "integer" }, "lifecycle_stage": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Lifecycle Stage" } }, "title": "g8_search_companiesArguments", "type": "object"}g8_search_contacts
Search contacts already in your CRM database. Returns contacts that your organization has imported or created. Use this to find people you already know about - NOT for prospecting. For finding new leads, use g8_find_contacts instead. Args: email: Filter by email address (exact match) list_id: Filter by contact list ID name: Filter by first or last name (partial match) job_title: Filter by job title (partial match) seniority_level: Filter by seniority (exact: C-Suite, VP, Director, Manager, etc.) company_name: Filter by company name (partial match) country: Filter by country (exact match) page: Page number (default 1) limit: Items per page (default 25, max 200). Raise it only when the user actually wants more than a screenful.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
email | No | string / null | See the schema below for constraints and defaults. |
list_id | No | string / null | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
job_title | No | string / null | See the schema below for constraints and defaults. |
seniority_level | No | string / null | See the schema below for constraints and defaults. |
company_name | No | string / null | See the schema below for constraints and defaults. |
country | No | string / null | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Email" }, "list_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "List Id" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "job_title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Job Title" }, "seniority_level": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Seniority Level" }, "company_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Company Name" }, "country": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Country" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "limit": { "default": 25, "title": "Limit", "type": "integer" } }, "title": "g8_search_contactsArguments", "type": "object"}g8_search_kb
Search the GTM knowledge base for a repository. Args: repo_id: Repository ID query: Search query (e.g. “ICP for enterprise buyers”)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
query | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" }, "query": { "title": "Query", "type": "string" } }, "required": [ "repo_id", "query" ], "title": "g8_search_kbArguments", "type": "object"}g8_search_save_company_search
Save Company Search. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /search/companies/save
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiSearchSaveRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiSearchFilter": { "additionalProperties": false, "properties": { "field": { "description": "Field name to filter on (e.g., 'job_title', 'country', 'industry')", "title": "Field", "type": "string" }, "operator": { "description": "Filter operator", "enum": [ "any_of", "contains", "all_of", "none_of", "is_empty", "is_not_empty", "between", "exists" ], "title": "Operator", "type": "string" }, "value": { "anyOf": [ { "items": {}, "type": "array" }, { "type": "null" } ], "default": null, "description": "Filter values", "title": "Value" } }, "required": [ "field", "operator" ], "title": "ApiSearchFilter", "type": "object" }, "ApiSearchSaveRequest": { "additionalProperties": false, "properties": { "filters": { "anyOf": [ { "items": { "$ref": "#/$defs/ApiSearchFilter" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Filter conditions (AND logic)", "title": "Filters" }, "limit": { "default": 25, "description": "Results per page (max 100)", "maximum": 100.0, "minimum": 1.0, "title": "Limit", "type": "integer" }, "list_title": { "description": "Title for the new list", "title": "List Title", "type": "string" }, "max_results": { "default": 1000, "description": "Maximum results to save (max 10,000)", "maximum": 10000.0, "minimum": 1.0, "title": "Max Results", "type": "integer" }, "page": { "default": 1, "description": "Page number (1-indexed)", "maximum": 100.0, "minimum": 1.0, "title": "Page", "type": "integer" } }, "required": [ "list_title" ], "title": "ApiSearchSaveRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiSearchSaveRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_search_save_company_searchArguments", "type": "object"}g8_send_quote
Send (or resend) a quote for e-signature. Sends a real customer-facing email. Creates/reuses a signing envelope and rolls the quote status forward to sent. Recipient resolves from the quote’s signer_contact_id or signer_email (one must be set). Idempotent for resend: if an envelope is already sent or viewed, it is re-emailed with the original signing link - safe to call twice. Args: quote_id: Quote UUID (must be in draft or sent status). subject: Optional email subject override (falls back to quote title). message: Optional cover-line override (falls back to default template).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
quote_id | Yes | string | See the schema below for constraints and defaults. |
subject | No | string / null | See the schema below for constraints and defaults. |
message | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "quote_id": { "title": "Quote Id", "type": "string" }, "subject": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Subject" }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Message" } }, "required": [ "quote_id" ], "title": "g8_send_quoteArguments", "type": "object"}g8_send_reply
Send a reply through the specified channel. Sends a real message - confirm with user first. Args: reply_id: Thread/reply ID to reply to. body: Message body to send. channel: Channel to send through - email, sms, or linkedin. subject: Email subject (email channel only). to: Recipient (email address, phone number, or LinkedIn ID). from_address: Sender (mailbox email, phone number, or LinkedIn account ID).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
reply_id | Yes | string | See the schema below for constraints and defaults. |
body | Yes | string | See the schema below for constraints and defaults. |
channel | Yes | string | See the schema below for constraints and defaults. |
subject | No | string / null | See the schema below for constraints and defaults. |
to | No | string / null | See the schema below for constraints and defaults. |
from_address | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "reply_id": { "title": "Reply Id", "type": "string" }, "body": { "title": "Body", "type": "string" }, "channel": { "title": "Channel", "type": "string" }, "subject": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Subject" }, "to": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "To" }, "from_address": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "From Address" } }, "required": [ "reply_id", "body", "channel" ], "title": "g8_send_replyArguments", "type": "object"}g8_sequence_get_sequence
Get Sequence. Uses the current organization and existing API permissions. API: GET /sequences/{sequence_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | Sequence ID |
Complete input schema
{ "properties": { "sequence_id": { "description": "Sequence ID", "title": "Sequence Id", "type": "string" } }, "required": [ "sequence_id" ], "title": "g8_sequence_get_sequenceArguments", "type": "object"}g8_sequence_list_sequence_contacts
List Sequence Contacts. Uses the current organization and existing API permissions. API: GET /sequences/{sequence_id}/contacts
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | Sequence ID |
page | No | integer / null | Page number |
limit | No | integer / null | Items per page |
state | No | string / null | Filter by contact state |
Complete input schema
{ "properties": { "sequence_id": { "description": "Sequence ID", "title": "Sequence Id", "type": "string" }, "page": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Page number", "title": "Page" }, "limit": { "anyOf": [ { "maximum": 200, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Items per page", "title": "Limit" }, "state": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Filter by contact state", "title": "State" } }, "required": [ "sequence_id" ], "title": "g8_sequence_list_sequence_contactsArguments", "type": "object"}g8_sequence_run_sequence
Run Sequence. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /sequences/{sequence_id}/run
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | Sequence ID |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "description": "Sequence ID", "title": "Sequence Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "sequence_id" ], "title": "g8_sequence_run_sequenceArguments", "type": "object"}g8_set_field_value
Set a custom column value on a single contact or company row. Use
g8_list_fieldsfirst to find thecolumn_idfor the column you want to write into. Therecord_idis the contact_id (when entity=“contacts”) or company_id (when entity=“companies”) of the row to update. Passvalue=None(or omit it) to clear the column for that row. This is a write, not a destructive op: setting the same value twice is idempotent and reversible by simply writing the previous value back. Args: column_id: Column ID fromg8_list_fieldsorg8_create_fieldrecord_id: Contact ID or company ID to update value: Value to write into the custom column. Omit/None to clear. entity: Target entity - “contacts” or “companies” (default: contacts)
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
column_id | Yes | integer | See the schema below for constraints and defaults. |
record_id | Yes | integer | See the schema below for constraints and defaults. |
value | No | string / null | See the schema below for constraints and defaults. |
entity | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "column_id": { "title": "Column Id", "type": "integer" }, "record_id": { "title": "Record Id", "type": "integer" }, "value": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Value" }, "entity": { "default": "contacts", "title": "Entity", "type": "string" } }, "required": [ "column_id", "record_id" ], "title": "g8_set_field_valueArguments", "type": "object"}g8_set_field_values
Set custom column values on ONE or MANY contact/company rows in a single call. The batch version of
g8_set_field_value- prefer this whenever you write more than one value (multiple columns on a row, multiple rows, or both).rowsis a list; a single-row update is just a list of length 1.entityis SHARED across every row. Each row is a dict: { “record_id”: 123, # required: contact_id or company_id “fields”: [ # columns to set on this row {“column_id”: 5, “value”: “hot”}, {“column_id”: 6, “value”: “9”}, {“column_id”: 7} # value omitted -> clears that column ] } Useg8_list_fieldsto findcolumn_ids. A field with novalue(or value=null) clears that column for the row. Partial success: rows are applied independently, so one bad row (missing record, unknown column) comes backok: falseinresults[]while the rest still commit. The response carriestotal_rows_updated,total_values_written, and a per-rowresults[]array. Limits: 1-500 rows per call; a record_id may appear only once per call (fold that record’s writes into a single row). Args: rows: List of row specs (1-500). Each is a dict withrecord_idand afieldslist of{column_id, value}pairs as shown above. entity: Target entity for ALL rows - “contacts” or “companies”.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
rows | Yes | array | See the schema below for constraints and defaults. |
entity | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "rows": { "items": { "additionalProperties": true, "type": "object" }, "title": "Rows", "type": "array" }, "entity": { "default": "contacts", "title": "Entity", "type": "string" } }, "required": [ "rows" ], "title": "g8_set_field_valuesArguments", "type": "object"}g8_snippet_get_form_template
Get Form Template. Uses the current organization and existing API permissions. API: GET /snippet/form
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_snippet_get_form_templateArguments", "type": "object"}g8_start_task_execution
Explicitly start an agent-assigned task using the caller’s permissions. Only call when execution is requested. request_id must be a UUID and must be reused for retries of an uncertain response. Assignment alone does not authorize Start; existing consequential-action approvals apply.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
task_id | Yes | string | See the schema below for constraints and defaults. |
request_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "task_id": { "title": "Task Id", "type": "string" }, "request_id": { "title": "Request Id", "type": "string" } }, "required": [ "task_id", "request_id" ], "title": "g8_start_task_executionArguments", "type": "object"}g8_status
Get the current status of a connected repository. Args: repo_id: Repository ID
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
repo_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "repo_id": { "title": "Repo Id", "type": "string" } }, "required": [ "repo_id" ], "title": "g8_statusArguments", "type": "object"}g8_switch_org
Switch which organization all your MCP actions run against. Rejected unless the user is a member of the target org. Takes effect on the user’s NEXT message and applies to every connected client (per-user choice). After switching, briefly confirm which org is now active. Args: org: graph8 id, uuid, or exact name (any value from g8_list_orgs).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
org | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "org": { "title": "Org", "type": "string" } }, "required": [ "org" ], "title": "g8_switch_orgArguments", "type": "object"}g8_tag_reply
Attach tags to an inbox thread. Args: reply_id: Thread/reply ID. tag_ids: List of tag IDs to attach. channel: email, sms, or linkedin (default email).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
reply_id | Yes | string | See the schema below for constraints and defaults. |
tag_ids | Yes | array | See the schema below for constraints and defaults. |
channel | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "reply_id": { "title": "Reply Id", "type": "string" }, "tag_ids": { "items": { "type": "string" }, "title": "Tag Ids", "type": "array" }, "channel": { "default": "email", "title": "Channel", "type": "string" } }, "required": [ "reply_id", "tag_ids" ], "title": "g8_tag_replyArguments", "type": "object"}g8_tool_search
REQUIRED FIRST STEP when the user asks for anything outside your currently visible tools. graph8 ships 586 tools but only 123 are visible at connect time. Workflow, voice/dialer, intent, skill, custom fields, forms, snippet, and playbook tools are HIDDEN until you search for them. Call this BEFORE saying “I don’t have a tool for that” - it returns ranked matches AND auto-activates them so they appear on your next tools/list call (the server emits notifications/tools/list_changed). Common category queries: “workflow”, “dialer”, “voice”, “intent”, “skill”, “field”, “form”, “snippet”, “playbook”. Search is family-aware: it understands synonyms (“automation” -> workflow, “dialer”/“phone” -> voice, “competitor”/“signals” -> intent) and singular/plural drift, and it ranks tools that match in their NAME above tools that only mention a word in their description - so a category query returns that family cleanly instead of bleeding into adjacent groups. The result’s
detected_groupstells you which family/families the query resolved to; a multi-family result means the query was ambiguous. Args: query: Free-text search (e.g. “enrich contacts”, “sequence pause”, “push to CRM”). Ranks all registered tools by name/description match. tool_names: Explicit list of tool names to activate. Use when you already know the tool from a prior turn or skill and just need it visible in tools/list. limit: Max ranked matches to return (default 8). activate: When true (default) the toplimitmatches (or thetool_namesentries) are written to this session’s activated set. Set false to preview without widening tools/list. Returns a ToolSearchResult with: - matches: ranked tool hits (name, description, score, activated flag; the TOP matches also carryinput_schema- the tool’s full argument schema) - activated_session_tools: the full activated set AFTER this call - always_on_tools: the default visible set (for context) - total_registered_tools: how many tools exist in total After a successful activate=true call, the server emitsnotifications/tools/list_changedto prompt the client to re-fetch tools/list. Clients that don’t support the notification still see the newly activated tools on their next session connect (Redis-cached 4h). IMPORTANT: if an activated tool does NOT show up in your tools list (some clients only refresh on reconnect), do not stall and do not tell the user the capability is missing - run it directly with g8_execute(tool_name=<match.name>, arguments={…}) using the match’sinput_schemato shape the arguments. To fetch the schema of a match beyond the top few, call again with tool_names=[<that name>]. Thectxparameter is auto-injected by FastMCP and hidden from the public tool schema - clients do not see it.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
query | No | string / null | See the schema below for constraints and defaults. |
tool_names | No | array / null | See the schema below for constraints and defaults. |
limit | No | integer | See the schema below for constraints and defaults. |
activate | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "query": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Query" }, "tool_names": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Tool Names" }, "limit": { "default": 8, "title": "Limit", "type": "integer" }, "activate": { "default": true, "title": "Activate", "type": "boolean" } }, "title": "g8_tool_searchArguments", "type": "object"}g8_trigger_audience_sync
Manually trigger an audience sync to push latest members to the ad platform. IMPORTANT: This pushes real data to the ad platform immediately. Confirm with the user before triggering. Args: config_id: Sync config ID
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
config_id | Yes | integer | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "config_id": { "title": "Config Id", "type": "integer" } }, "required": [ "config_id" ], "title": "g8_trigger_audience_syncArguments", "type": "object"}g8_update_audience_sync
Update an audience sync configuration. Args: config_id: Sync config ID mode: Sync mode - “mirror” or “append_only” refresh_cadence_hours: Hours between auto-syncs is_active: Enable/disable the sync
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
config_id | Yes | integer | See the schema below for constraints and defaults. |
mode | No | string / null | See the schema below for constraints and defaults. |
refresh_cadence_hours | No | integer / null | See the schema below for constraints and defaults. |
is_active | No | boolean / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "config_id": { "title": "Config Id", "type": "integer" }, "mode": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Mode" }, "refresh_cadence_hours": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Refresh Cadence Hours" }, "is_active": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Is Active" } }, "required": [ "config_id" ], "title": "g8_update_audience_syncArguments", "type": "object"}g8_update_contact
Update fields on an EXISTING contact (partial update). Only the arguments you pass are changed; the rest are left untouched. Attach a company (both optional; a contact may have none): -
company_id: attach an EXISTING company (mashup_companies.id, as returned by g8_find_companies / g8_create_company). Wins if both given. -company_domain(e.g. “acme.com”): resolve-or-create a company from its domain, created if it does not exist. Attaching a company is how you give a company-less contact a company, which is required before g8_create_deal can derive the deal’s company from that contact.contact_idis the mashup_contact_id (same id space as g8_search_contacts / g8_find_contacts / g8_get_contact_detail). Args: contact_id: The contact to update (required). first_name, last_name, work_email, job_title, job_department, seniority_level, direct_phone, mobile_phone, linkedin_url, city, state, country: Fields to overwrite (omit to leave as-is). company_domain: Company domain to resolve-or-create and link. company_id: Existing company id (mashup_companies.id) to link. lifecycle_stage: Move this contact to a revenue lifecycle stage (aslugfromg8_get_pipeline(include_lifecycle=True)). A typo comes back as a 400 naming the valid slugs. suppressed: Do-not-contact switch. True stops outreach, False lifts the org’s own block. Read the suppression section above before using False. suppression_reason: Why, recorded on the ledger row (max 1000 chars). Optional but worth writing - it is what a later audit reads. contact_ids: Suppress or reinstate MANY contacts in one call (max 5000). These must be mashup_contacts.id primary keys, not CONTACT_ID business keys, and ids that do not exist are skipped silently. Use instead of contact_id, never with it. suppression_channel: all (default) | email | phone | linkedin. Bulk suppress only. Careful: a row written for one channel is NOT returned by a query for another, and a per-channel block does not stop sends on other channels. SUPPRESSION, and why False is not the inverse of True: -suppressed=Truewrites an org-initiated do-not-contact block across all channels for one contact, or onsuppression_channelfor a bulk call. -suppressed=Falseclears ONLY the org’s own umbrella block. A block the CONTACT asked for (an unsubscribe) or one the SYSTEM set (a hard bounce, a DNC registry hit) SURVIVES on purpose. So a contact can still come backis_suppressed: trueafter a successful unsuppress, andchannels_clearedcan be empty withis_suppressedstill true - that means “nothing here was yours to reverse”, not “half done”. - The bulk reinstate refuses per contact rather than in bulk. Readskipped[]:not_operator_reversiblemeans an opt-out the org may not lift is present (do NOT retry),no_active_suppressionmeans there was nothing to clear (benign),reinstate_failedmeans that one write errored (retryable).reinstatedplusskippedshould account fortotal_requested, which counts DE-DUPLICATED ids - so a shortsuppressedcount can mean duplicates, non-existent ids, or already-suppressed contacts. Combining field edits withlifecycle_stageorsuppressedin one call issues SEPARATE writes in that order and returns the last ack: the PATCH can succeed and the suppression still fail, so on an error assume a partial change and re-read the contact. Backed byPATCH /api/v1/contacts/{contact_id}, plusPOST /contacts/{contact_id}/lifecycle-stage,POST /contacts/{contact_id}/suppress//unsuppress, andPOST /contacts/suppressions/bulk-add//reinstate.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
contact_id | No | integer / null | See the schema below for constraints and defaults. |
first_name | No | string / null | See the schema below for constraints and defaults. |
last_name | No | string / null | See the schema below for constraints and defaults. |
work_email | No | string / null | See the schema below for constraints and defaults. |
job_title | No | string / null | See the schema below for constraints and defaults. |
job_department | No | string / null | See the schema below for constraints and defaults. |
seniority_level | No | string / null | See the schema below for constraints and defaults. |
direct_phone | No | string / null | See the schema below for constraints and defaults. |
mobile_phone | No | string / null | See the schema below for constraints and defaults. |
linkedin_url | No | string / null | See the schema below for constraints and defaults. |
city | No | string / null | See the schema below for constraints and defaults. |
state | No | string / null | See the schema below for constraints and defaults. |
country | No | string / null | See the schema below for constraints and defaults. |
company_domain | No | string / null | See the schema below for constraints and defaults. |
company_id | No | integer / null | See the schema below for constraints and defaults. |
lifecycle_stage | No | string / null | See the schema below for constraints and defaults. |
suppressed | No | boolean / null | See the schema below for constraints and defaults. |
suppression_reason | No | string / null | See the schema below for constraints and defaults. |
contact_ids | No | array / null | See the schema below for constraints and defaults. |
suppression_channel | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Contact Id" }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "First Name" }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Last Name" }, "work_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Work Email" }, "job_title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Job Title" }, "job_department": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Job Department" }, "seniority_level": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Seniority Level" }, "direct_phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Direct Phone" }, "mobile_phone": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Mobile Phone" }, "linkedin_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Linkedin Url" }, "city": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "City" }, "state": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "State" }, "country": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Country" }, "company_domain": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Company Domain" }, "company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Company Id" }, "lifecycle_stage": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Lifecycle Stage" }, "suppressed": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Suppressed" }, "suppression_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Suppression Reason" }, "contact_ids": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Contact Ids" }, "suppression_channel": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Suppression Channel" } }, "title": "g8_update_contactArguments", "type": "object"}g8_update_deal
Update a deal (partial update). Common uses: change the deal stage, reassign the owner, add/remove contact associations, record the buying-committee role of contacts on the deal. Pass only the fields you want to change. At least one field (or one non-empty contact list) is required. Backed by
PATCH /api/v1/deals/{deal_id}. Closed-stage rules (400 on violation, detail prefixed with a marker): moving a deal into a Closed Won stage requires an effective close_date AND amount; Closed Lost requires an effective close_date; either requires an owner. “Effective” means the value in this call when provided, else the deal’s existing value - so a deal that already carries them moves freely. Re-submitting the deal’s current stage is not a move and is never gated. Markers: close_date_required_for_won_stage, close_date_required_for_lost_stage, amount_required_for_won_stage, owner_required_for_closed_stage. Supply expected_revision from the canonical CRM record to reject stale edits with HTTP 409. A successful conditional edit returns its new revision. Args: expected_revision: Positive canonical CRM revision to compare before writing. deal_id: Deal UUID returned by g8_get_deals / g8_create_deal. name: New deal name. description: New description. amount: New monetary value. currency: New currency code. stage_id: New pipeline stage UUID (see g8_get_pipeline). Must be an existing stage in the deal’s pipeline (422 otherwise). close_date: New expected close date (ISO 8601). owner_id: New deal owner (member id, email, or provider uid). Pass to reassign a deal whose owner is missing or wrong; it is resolved to a real team member (422 if it matches none). Reassign-only: a deal’s owner cannot be cleared (#18469). Omitting owner_id (or passing None) leaves the owner unchanged. add_contact_ids: mashup_contact_ids to link to the deal. Must belong to the deal’s company (if the deal has none yet, the added contacts’ company is adopted); a cross-company add is rejected. Idempotent - already-linked ids skipped silently. remove_contact_ids: mashup_contact_ids to unlink from the deal. Idempotent - unlinked ids skipped silently. contact_roles: Buying-committee role per contact, keyed by mashup_contact_id as a STRING, e.g. {“5500429”: “champion”, “5500914”: null}. Valid roles: champion, decision_maker, influencer, blocker, coach, end_user. null clears a contact’s role. Use this to record roles on contacts ALREADY on the deal - read them back with g8_get_deal, which returns each contact’s current role. Ids you link via add_contact_ids in the SAME call can be roled here too (roles are applied after the link). An id that is neither already linked nor being added is rejected and the whole update is rolled back.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
deal_id | Yes | string | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
amount | No | number / null | See the schema below for constraints and defaults. |
currency | No | string / null | See the schema below for constraints and defaults. |
stage_id | No | string / null | See the schema below for constraints and defaults. |
close_date | No | string / null | See the schema below for constraints and defaults. |
owner_id | No | string / null | See the schema below for constraints and defaults. |
add_contact_ids | No | array / null | See the schema below for constraints and defaults. |
remove_contact_ids | No | array / null | See the schema below for constraints and defaults. |
contact_roles | No | object / null | See the schema below for constraints and defaults. |
expected_revision | No | integer / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "deal_id": { "title": "Deal Id", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "amount": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Amount" }, "currency": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Currency" }, "stage_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Stage Id" }, "close_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Close Date" }, "owner_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Owner Id" }, "add_contact_ids": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Add Contact Ids" }, "remove_contact_ids": { "anyOf": [ { "items": { "type": "integer" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Remove Contact Ids" }, "contact_roles": { "anyOf": [ { "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "type": "object" }, { "type": "null" } ], "default": null, "title": "Contact Roles" }, "expected_revision": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Expected Revision" } }, "required": [ "deal_id" ], "title": "g8_update_dealArguments", "type": "object"}g8_update_note
Update a note’s content, on a contact, COMPANY or DEAL note. Note ids are global, so this works on any note regardless of which record it is filed against - no deal-specific variant is needed. Notes marked
read_onlyby g8_list_notes cannot be updated. Backed byPATCH /api/v1/notes/{note_id}. Args: note_id: Note UUID returned by g8_list_notes / g8_create_note. content: Replacement content (plain text or markdown).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
note_id | Yes | string | See the schema below for constraints and defaults. |
content | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "note_id": { "title": "Note Id", "type": "string" }, "content": { "title": "Content", "type": "string" } }, "required": [ "note_id", "content" ], "title": "g8_update_noteArguments", "type": "object"}g8_update_quote
Update a quote (partial). Pass only the fields you want to change. Draft quotes edit in place. A sent/viewed quote is recalled to draft first (its live signing link is voided), keeping the same row + quote number; terminal quotes (accepted/declined/voided/expired) reject the update. owner_id reassigns the owner/AE (a blank value is ignored - never nulls an existing owner). Passing line_items replaces the entire set and re-runs quotable-product authorization. Args: see g8_create_quote - same field meanings.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
quote_id | Yes | string | See the schema below for constraints and defaults. |
title | No | string / null | See the schema below for constraints and defaults. |
line_items | No | array / null | See the schema below for constraints and defaults. |
signer_contact_id | No | integer / null | See the schema below for constraints and defaults. |
signer_email | No | string / null | See the schema below for constraints and defaults. |
signer_name | No | string / null | See the schema below for constraints and defaults. |
billing_contact_id | No | integer / null | See the schema below for constraints and defaults. |
billing_legal_name | No | string / null | See the schema below for constraints and defaults. |
billing_primary_email | No | string / null | See the schema below for constraints and defaults. |
billing_email | No | string / null | See the schema below for constraints and defaults. |
billing_address | No | string / null | See the schema below for constraints and defaults. |
mashup_company_id | No | integer / null | See the schema below for constraints and defaults. |
deal_id | No | string / null | See the schema below for constraints and defaults. |
owner_id | No | string / null | See the schema below for constraints and defaults. |
currency | No | string / null | See the schema below for constraints and defaults. |
payment_terms | No | string / null | See the schema below for constraints and defaults. |
valid_until | No | string / null | See the schema below for constraints and defaults. |
terms_content | No | string / null | See the schema below for constraints and defaults. |
privacy_content | No | string / null | See the schema below for constraints and defaults. |
notes | No | string / null | See the schema below for constraints and defaults. |
public_notes | No | string / null | See the schema below for constraints and defaults. |
tax_amount | No | integer / null | See the schema below for constraints and defaults. |
contract_months | No | number / null | See the schema below for constraints and defaults. |
contract_duration_value | No | number / null | See the schema below for constraints and defaults. |
contract_duration_unit | No | string / null | See the schema below for constraints and defaults. |
contract_start_date | No | string / null | See the schema below for constraints and defaults. |
contract_end_date | No | string / null | See the schema below for constraints and defaults. |
accepted_payment_methods | No | array / null | See the schema below for constraints and defaults. |
marketing_rights | No | array / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "quote_id": { "title": "Quote Id", "type": "string" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Title" }, "line_items": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Line Items" }, "signer_contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Signer Contact Id" }, "signer_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Signer Email" }, "signer_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Signer Name" }, "billing_contact_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Billing Contact Id" }, "billing_legal_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Legal Name" }, "billing_primary_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Primary Email" }, "billing_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Email" }, "billing_address": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Billing Address" }, "mashup_company_id": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Mashup Company Id" }, "deal_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Deal Id" }, "owner_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Owner Id" }, "currency": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Currency" }, "payment_terms": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Payment Terms" }, "valid_until": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Valid Until" }, "terms_content": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Terms Content" }, "privacy_content": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Privacy Content" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Notes" }, "public_notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Public Notes" }, "tax_amount": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Tax Amount" }, "contract_months": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Contract Months" }, "contract_duration_value": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "default": null, "title": "Contract Duration Value" }, "contract_duration_unit": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contract Duration Unit" }, "contract_start_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contract Start Date" }, "contract_end_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Contract End Date" }, "accepted_payment_methods": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Accepted Payment Methods" }, "marketing_rights": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Marketing Rights" } }, "required": [ "quote_id" ], "title": "g8_update_quoteArguments", "type": "object"}g8_update_sequence
Update sequence metadata, or remove LinkedIn from the sequence entirely. Args: sequence_id: Sequence ID to update name: New name description: New description is_shared: Whether sequence is shared finish_on_reply: Finish on reply send_in_same_thread: Send in same thread wait_for_new_contacts: Wait for new contacts remove_linkedin: Remove LinkedIn from this sequence. Deletes its LinkedIn steps AND unbinds its LinkedIn sender account together, in one atomic operation. Use this rather than trying to unbind the account on its own: a sequence left holding LinkedIn steps with no sender cannot run or resume at all. Works for either provider (Netrion or legacy HeyReach) and also repairs a sequence already stuck in that state. A sequence with no LinkedIn returns success with zero counts, so it is safe to call across a batch. Cannot be combined with the metadata fields above. remove_linkedin_force: Required to remove LinkedIn from a LIVE or WAITING sequence. The sequence is paused afterwards so the result can be reviewed before it sends again. dry_run: With remove_linkedin, preview exactly which steps and channels would be removed without changing anything. IMPORTANT: this deletes real steps. Always run dry_run=True first and show the user what it reports before running it for real.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
is_shared | No | boolean / null | See the schema below for constraints and defaults. |
finish_on_reply | No | boolean / null | See the schema below for constraints and defaults. |
send_in_same_thread | No | boolean / null | See the schema below for constraints and defaults. |
wait_for_new_contacts | No | boolean / null | See the schema below for constraints and defaults. |
remove_linkedin | No | boolean | See the schema below for constraints and defaults. |
remove_linkedin_force | No | boolean | See the schema below for constraints and defaults. |
dry_run | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "title": "Sequence Id", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "is_shared": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Is Shared" }, "finish_on_reply": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Finish On Reply" }, "send_in_same_thread": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Send In Same Thread" }, "wait_for_new_contacts": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Wait For New Contacts" }, "remove_linkedin": { "default": false, "title": "Remove Linkedin", "type": "boolean" }, "remove_linkedin_force": { "default": false, "title": "Remove Linkedin Force", "type": "boolean" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" } }, "required": [ "sequence_id" ], "title": "g8_update_sequenceArguments", "type": "object"}g8_update_sequence_step
Update a single step within a sequence. Args: sequence_id: Sequence ID containing the step step_id: Step ID to update step_data: Step template/content data time_interval: Delay in seconds after previous step step_type: Step type. One of: EMAIL, PHONE, SMS, WHATSAPP, HEYREACH, MANUAL_DIALER. Case-insensitive. input_type: Input type. One of: ON_DEMAND, MANUAL_TEMPLATE, AI_GENERATED_TEMPLATE. Case-insensitive.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
sequence_id | Yes | string | See the schema below for constraints and defaults. |
step_id | Yes | string | See the schema below for constraints and defaults. |
step_data | No | object / null | See the schema below for constraints and defaults. |
time_interval | No | integer / null | See the schema below for constraints and defaults. |
step_type | No | string / null | See the schema below for constraints and defaults. |
input_type | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "sequence_id": { "title": "Sequence Id", "type": "string" }, "step_id": { "title": "Step Id", "type": "string" }, "step_data": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Step Data" }, "time_interval": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Time Interval" }, "step_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Step Type" }, "input_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Input Type" } }, "required": [ "sequence_id", "step_id" ], "title": "g8_update_sequence_stepArguments", "type": "object"}g8_update_task
Update an existing task (partial update). Pass only the fields you want to change. At least one field is required. Backed by
PATCH /api/v1/tasks/{task_id}. Read the task first and pass its updated_at as expected_updated_at to avoid overwriting another person’s edit. On conflict, read and reconcile the task before trying again; do not retry using a newer revision blindly. Args: tags: Task labels (up to 20, each 1-50 characters); [] clears labels on update. task_id: Task UUID returned by g8_get_tasks / g8_create_task. title: New title. description: New description. due_date: New due date (ISO 8601). assignee_id: New assignee user ID. clear_due_date: Remove the due date; cannot be combined with due_date. clear_assignee: Unassign the task; cannot be combined with assignee_id. task_type: New activity type. clear_task_type: Remove the activity type; cannot be combined with task_type. expected_updated_at: Revision from the task read before editing. Omit only for legacy callers. status: New status (open, completed). priority: New priority (0=none, 1=high, 2=medium, 3=low; historical 4=low is preserved). parent_task_id: New parent task UUID. Re-parents this task into a subtask of the given parent. Parent must exist and must not itself be a subtask. A task that already has subtasks of its own cannot be demoted into a subtask. subtask_sort_order: New sort position within the parent’s subtasks (reorder). Can be passed alone to reorder without re-parenting.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
task_id | Yes | string | See the schema below for constraints and defaults. |
title | No | string / null | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
tags | No | array / null | See the schema below for constraints and defaults. |
due_date | No | string / null | See the schema below for constraints and defaults. |
assignee_id | No | string / null | See the schema below for constraints and defaults. |
status | No | string / null | See the schema below for constraints and defaults. |
priority | No | integer / null | See the schema below for constraints and defaults. |
parent_task_id | No | string / null | See the schema below for constraints and defaults. |
subtask_sort_order | No | integer / null | See the schema below for constraints and defaults. |
records | No | array / null | See the schema below for constraints and defaults. |
clear_due_date | No | boolean | See the schema below for constraints and defaults. |
clear_assignee | No | boolean | See the schema below for constraints and defaults. |
task_type | No | string / null | See the schema below for constraints and defaults. |
clear_task_type | No | boolean | See the schema below for constraints and defaults. |
expected_updated_at | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "task_id": { "title": "Task Id", "type": "string" }, "title": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Title" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "tags": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Tags" }, "due_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Due Date" }, "assignee_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Assignee Id" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Status" }, "priority": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Priority" }, "parent_task_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Parent Task Id" }, "subtask_sort_order": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "default": null, "title": "Subtask Sort Order" }, "records": { "anyOf": [ { "items": { "additionalProperties": { "type": "string" }, "type": "object" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Records" }, "clear_due_date": { "default": false, "title": "Clear Due Date", "type": "boolean" }, "clear_assignee": { "default": false, "title": "Clear Assignee", "type": "boolean" }, "task_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Task Type" }, "clear_task_type": { "default": false, "title": "Clear Task Type", "type": "boolean" }, "expected_updated_at": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Expected Updated At" } }, "required": [ "task_id" ], "title": "g8_update_taskArguments", "type": "object"}g8_usage_get_usage
Get Usage. Uses the current organization and existing API permissions. API: GET /usage
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_usage_get_usageArguments", "type": "object"}g8_usage_list_usage_transactions
List Usage Transactions. Uses the current organization and existing API permissions. API: GET /usage/transactions
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
page | No | integer / null | Page number (ignored when cursor is supplied) |
limit | No | integer / null | Items per page |
cursor | No | string / null | Opaque pagination cursor from a prior response’s next_cursor. When supplied it takes precedence over page. |
Complete input schema
{ "properties": { "page": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Page number (ignored when `cursor` is supplied)", "title": "Page" }, "limit": { "anyOf": [ { "maximum": 200, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Items per page", "title": "Limit" }, "cursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Opaque pagination cursor from a prior response's `next_cursor`. When supplied it takes precedence over `page`.", "title": "Cursor" } }, "title": "g8_usage_list_usage_transactionsArguments", "type": "object"}g8_webhook_create_webhook
Create Webhook. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /webhooks
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | #/$defs/ApiWebhookCreateRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiWebhookCreateRequest": { "additionalProperties": false, "properties": { "events": { "description": "Event types to subscribe to", "items": { "type": "string" }, "title": "Events", "type": "array" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable name", "title": "Name" }, "url": { "description": "Target URL for webhook delivery", "title": "Url", "type": "string" } }, "required": [ "events", "url" ], "title": "ApiWebhookCreateRequest", "type": "object" } }, "properties": { "body": { "$ref": "#/$defs/ApiWebhookCreateRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_webhook_create_webhookArguments", "type": "object"}g8_webhook_delete_webhook
Delete Webhook. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /webhooks/{webhook_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
webhook_id | Yes | string | Webhook subscription ID |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "webhook_id": { "description": "Webhook subscription ID", "title": "Webhook Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "webhook_id" ], "title": "g8_webhook_delete_webhookArguments", "type": "object"}g8_webhook_get_webhook
Get Webhook. Uses the current organization and existing API permissions. API: GET /webhooks/{webhook_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
webhook_id | Yes | string | Webhook subscription ID |
Complete input schema
{ "properties": { "webhook_id": { "description": "Webhook subscription ID", "title": "Webhook Id", "type": "string" } }, "required": [ "webhook_id" ], "title": "g8_webhook_get_webhookArguments", "type": "object"}g8_webhook_list_webhook_deliveries
List Webhook Deliveries. Uses the current organization and existing API permissions. API: GET /webhooks/{webhook_id}/deliveries
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
webhook_id | Yes | string | Webhook subscription ID |
page | No | integer / null | Page number |
limit | No | integer / null | Items per page |
status | No | string / null | Filter by delivery status |
Complete input schema
{ "properties": { "webhook_id": { "description": "Webhook subscription ID", "title": "Webhook Id", "type": "string" }, "page": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Page number", "title": "Page" }, "limit": { "anyOf": [ { "maximum": 200, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Items per page", "title": "Limit" }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Filter by delivery status", "title": "Status" } }, "required": [ "webhook_id" ], "title": "g8_webhook_list_webhook_deliveriesArguments", "type": "object"}g8_webhook_list_webhook_events
List Webhook Events. Uses the current organization and existing API permissions. API: GET /webhooks/events
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "g8_webhook_list_webhook_eventsArguments", "type": "object"}g8_webhook_list_webhooks
List Webhooks. Uses the current organization and existing API permissions. API: GET /webhooks
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
is_active | No | boolean / null | Filter by active status |
Complete input schema
{ "properties": { "is_active": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Filter by active status", "title": "Is Active" } }, "title": "g8_webhook_list_webhooksArguments", "type": "object"}g8_webhook_rotate_webhook_secret
Rotate Webhook Secret. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /webhooks/{webhook_id}/rotate-secret
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
webhook_id | Yes | string | Webhook subscription ID |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "webhook_id": { "description": "Webhook subscription ID", "title": "Webhook Id", "type": "string" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "webhook_id" ], "title": "g8_webhook_rotate_webhook_secretArguments", "type": "object"}g8_webhook_update_webhook
Update Webhook. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PATCH /webhooks/{webhook_id}
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
webhook_id | Yes | string | Webhook subscription ID |
body | Yes | #/$defs/ApiWebhookUpdateRequest | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "$defs": { "ApiWebhookUpdateRequest": { "additionalProperties": false, "properties": { "events": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "description": "Event types to subscribe to", "title": "Events" }, "is_active": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Whether the webhook is active", "title": "Is Active" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable name", "title": "Name" }, "url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Target URL for webhook delivery", "title": "Url" } }, "title": "ApiWebhookUpdateRequest", "type": "object" } }, "properties": { "webhook_id": { "description": "Webhook subscription ID", "title": "Webhook Id", "type": "string" }, "body": { "$ref": "#/$defs/ApiWebhookUpdateRequest" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "webhook_id", "body" ], "title": "g8_webhook_update_webhookArguments", "type": "object"}g8_work_delete
Delete one graph8 Work message, channel or routine. The three are NOT equally severe and this tool does not pretend otherwise. Deleting a MESSAGE is soft - the author retracts their own words and it is safe to repeat. Deleting a ROUTINE stops a schedule. Deleting a CHANNEL is irreversible: it removes the room for EVERYONE, leaves a non-restorable tombstone, and requires
confirmation_nameto equal the channel’s own slug as a second check. Review the intended change with the user and set confirm=true to execute; otherwise no API request is sent.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
resource | Yes | string | What to delete. |
resource_id | Yes | string | Id of the message, channel or routine to delete. |
confirmation_name | No | string / null | The channel’s own slug, repeated back. REQUIRED for resource=channel. |
confirm | No | boolean | Set true to execute. No API request is sent while this is false. |
Complete input schema
{ "properties": { "resource": { "description": "What to delete.", "enum": [ "message", "channel", "routine" ], "title": "Resource", "type": "string" }, "resource_id": { "description": "Id of the message, channel or routine to delete.", "maxLength": 255, "title": "Resource Id", "type": "string" }, "confirmation_name": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "default": null, "description": "The channel's own slug, repeated back. REQUIRED for resource=channel.", "title": "Confirmation Name" }, "confirm": { "default": false, "description": "Set true to execute. No API request is sent while this is false.", "title": "Confirm", "type": "boolean" } }, "required": [ "resource", "resource_id" ], "title": "g8_work_deleteArguments", "type": "object"}g8_work_manage_channel
Create a graph8 Work channel, change its settings, or assign its purpose. Renaming changes
display_nameonly: a channel’s slug is its room address, so a rename never moves the room.set-purposeTAKES the purpose from whichever channel held it - exactly one channel holds each - and reports the move inreassignedChannelIds. 409 when a new channel’s name is taken, and for a built-in channel’s identity or visibility. 403 when the caller neither owns the channel nor holds admin rights.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action | Yes | string | create opens a channel, update changes its settings, set-purpose assigns the organisation-wide purpose. |
channel_id | No | string / null | The channel to change. Required for update and set-purpose. |
name | No | string / null | Slug for a new channel; normalized to lowercase and hyphens. action=create. |
display_name | No | string / null | Human-readable name. |
description | No | string / null | What the channel is for; 280 characters or fewer. |
visibility | No | string / null | open is self-serve joinable, private is invite only. |
kind | No | string / null | Channel layout. action=create. |
member_user_ids | No | array / null | People seated in the channel; they must be in this organisation. |
participant_agent_ids | No | array / null | Agents seated in the channel. |
template_id | No | string / null | Channel template; seats its specialists and seeds its Canvas. action=create. |
agent_response_policy | No | string / null | When seated agents may answer. action=update. |
archived | No | boolean / null | Archive or unarchive the channel. action=update. |
purpose | No | string / null | One of the organisation’s purposes (work, campaigns, hot, pipeline, customers, wins), or null to clear. action=set-purpose. |
Complete input schema
{ "properties": { "action": { "description": "create opens a channel, update changes its settings, set-purpose assigns the organisation-wide purpose.", "enum": [ "create", "update", "set-purpose" ], "title": "Action", "type": "string" }, "channel_id": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "default": null, "description": "The channel to change. Required for update and set-purpose.", "title": "Channel Id" }, "name": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "default": null, "description": "Slug for a new channel; normalized to lowercase and hyphens. action=create.", "title": "Name" }, "display_name": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "default": null, "description": "Human-readable name.", "title": "Display Name" }, "description": { "anyOf": [ { "maxLength": 1000, "type": "string" }, { "type": "null" } ], "default": null, "description": "What the channel is for; 280 characters or fewer.", "title": "Description" }, "visibility": { "anyOf": [ { "enum": [ "open", "private" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "open is self-serve joinable, private is invite only.", "title": "Visibility" }, "kind": { "anyOf": [ { "enum": [ "stream", "forum" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "Channel layout. action=create.", "title": "Kind" }, "member_user_ids": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 200, "type": "array" }, { "type": "null" } ], "default": null, "description": "People seated in the channel; they must be in this organisation.", "title": "Member User Ids" }, "participant_agent_ids": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 16, "type": "array" }, { "type": "null" } ], "default": null, "description": "Agents seated in the channel.", "title": "Participant Agent Ids" }, "template_id": { "anyOf": [ { "maxLength": 128, "type": "string" }, { "type": "null" } ], "default": null, "description": "Channel template; seats its specialists and seeds its Canvas. action=create.", "title": "Template Id" }, "agent_response_policy": { "anyOf": [ { "enum": [ "mention_required", "proactive" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "When seated agents may answer. action=update.", "title": "Agent Response Policy" }, "archived": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Archive or unarchive the channel. action=update.", "title": "Archived" }, "purpose": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ], "default": null, "description": "One of the organisation's purposes (work, campaigns, hot, pipeline, customers, wins), or null to clear. action=set-purpose.", "title": "Purpose" } }, "required": [ "action" ], "title": "g8_work_manage_channelArguments", "type": "object"}g8_work_manage_message
Edit, forward or react to an existing graph8 Work message.
editonly works on a message this credential authored, and is deliberately not a re-send: no agent turn runs again and nobody is notified.forwardchecks both ends - you must be able to read the original and write into the destination.reacttoggles a single emoji and is safe to repeat.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action | Yes | string | edit rewrites the message, forward copies it into another conversation, react toggles one emoji. |
message_id | Yes | string | The message to act on. |
text | No | string / null | New plain text. action=edit. |
document | No | object / null | New rich-text document. action=edit. |
expected_revision | No | integer / null | Make the edit conditional on the revision you read. action=edit. |
channel | No | string / null | Destination conversation name or id. action=forward. |
emoji | No | string / null | Reaction shortcode, e.g. tada. action=react. |
active | No | boolean / null | True adds the reaction, False removes it. action=react. |
Complete input schema
{ "properties": { "action": { "description": "edit rewrites the message, forward copies it into another conversation, react toggles one emoji.", "enum": [ "edit", "forward", "react" ], "title": "Action", "type": "string" }, "message_id": { "description": "The message to act on.", "maxLength": 128, "title": "Message Id", "type": "string" }, "text": { "anyOf": [ { "maxLength": 20000, "type": "string" }, { "type": "null" } ], "default": null, "description": "New plain text. action=edit.", "title": "Text" }, "document": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "New rich-text document. action=edit.", "title": "Document" }, "expected_revision": { "anyOf": [ { "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Make the edit conditional on the revision you read. action=edit.", "title": "Expected Revision" }, "channel": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "default": null, "description": "Destination conversation name or id. action=forward.", "title": "Channel" }, "emoji": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ], "default": null, "description": "Reaction shortcode, e.g. `tada`. action=react.", "title": "Emoji" }, "active": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "True adds the reaction, False removes it. action=react.", "title": "Active" } }, "required": [ "action", "message_id" ], "title": "g8_work_manage_messageArguments", "type": "object"}g8_work_manage_routine
Create, change or immediately run a graph8 Work routine. A routine is a standing instruction to an agent, delivered into one conversation, on a schedule or on an event.
delivery_conversation_idmust be a conversation the caller can read - otherwise a routine would be a way to post into a room its author cannot see - and re-pointing it later is checked again.run-nowposts the instruction as the caller’s own message and lets the normal turn machinery answer, so it exercises exactly what a live ask would. It returns a receipt with arunId; read the outcome with g8_work_read(resource=“routine-runs”).
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action | Yes | string | create adds a routine, update changes one, run-now runs it immediately. |
routine_id | No | string / null | The routine to act on. Required for update and run-now. |
agent_id | No | string / null | Agent that runs the routine. |
title | No | string / null | What the routine is called. |
instruction | No | string / null | What the agent is asked to do on each run. |
delivery_conversation_id | No | string / null | Conversation the routine posts into; the caller must be able to read it. |
weekdays | No | array / null | Days to run on, 0-6. Schedule routines. |
local_time | No | string / null | Local run time HH:MM. Schedule routines. |
timezone | No | string / null | IANA timezone the local time is read in, e.g. Europe/London. |
enabled | No | boolean / null | Turn the routine on or off. |
trigger_kind | No | string / null | schedule runs on a clock, event runs when something happens. |
trigger | No | object / null | Trigger configuration. Event routines. |
event_policy | No | object / null | Optional event-handling policy. Event routines. |
sample_event | No | object / null | Example event to run an event routine against. action=run-now. |
Complete input schema
{ "properties": { "action": { "description": "create adds a routine, update changes one, run-now runs it immediately.", "enum": [ "create", "update", "run-now" ], "title": "Action", "type": "string" }, "routine_id": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ], "default": null, "description": "The routine to act on. Required for update and run-now.", "title": "Routine Id" }, "agent_id": { "anyOf": [ { "maxLength": 128, "type": "string" }, { "type": "null" } ], "default": null, "description": "Agent that runs the routine.", "title": "Agent Id" }, "title": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "default": null, "description": "What the routine is called.", "title": "Title" }, "instruction": { "anyOf": [ { "maxLength": 20000, "type": "string" }, { "type": "null" } ], "default": null, "description": "What the agent is asked to do on each run.", "title": "Instruction" }, "delivery_conversation_id": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "default": null, "description": "Conversation the routine posts into; the caller must be able to read it.", "title": "Delivery Conversation Id" }, "weekdays": { "anyOf": [ { "items": { "type": "integer" }, "maxItems": 7, "type": "array" }, { "type": "null" } ], "default": null, "description": "Days to run on, 0-6. Schedule routines.", "title": "Weekdays" }, "local_time": { "anyOf": [ { "maxLength": 8, "type": "string" }, { "type": "null" } ], "default": null, "description": "Local run time `HH:MM`. Schedule routines.", "title": "Local Time" }, "timezone": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ], "default": null, "description": "IANA timezone the local time is read in, e.g. Europe/London.", "title": "Timezone" }, "enabled": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Turn the routine on or off.", "title": "Enabled" }, "trigger_kind": { "anyOf": [ { "enum": [ "schedule", "event" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "schedule runs on a clock, event runs when something happens.", "title": "Trigger Kind" }, "trigger": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Trigger configuration. Event routines.", "title": "Trigger" }, "event_policy": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Optional event-handling policy. Event routines.", "title": "Event Policy" }, "sample_event": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Example event to run an event routine against. action=run-now.", "title": "Sample Event" } }, "required": [ "action" ], "title": "g8_work_manage_routineArguments", "type": "object"}g8_work_read
Read the graph8 Work room: channels, conversations, messages, files, search, the activity feed, the All Work board and scheduled routines. Work is the team’s operating room - where people and agents talk, where work is tracked, and where routines post on a schedule. Pick what to read with
resource; it defaults toroom, the whole readable room in one call. An API key is an organisation credential with no channel seat, so it reads the organisation’s built-in channels (#work, #signals) and whatever channels it created. Private channels and channels it has not been seated in are refused by the same rule that governs a person. Direct messages are not reachable through the API at all.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
resource | No | string | What to read. room is the whole Work room in one call; channels lists the channels you can read and channels-available the ones you are not in; messages / events / files page one conversation (send conversation); search finds text across everything you can read (send q); activity is the feed of what happened; work-items, work-items-history and oversight are the All Work board; routines and routine-runs are the scheduled agent instructions. |
conversation | No | string / null | Conversation to read: a channel name (work) or a channel id. Required for messages/events/files. |
channel | No | string / null | Channel name or id. Required for channel-canvas. |
message_id | No | string / null | Message id. Required for resource=message. |
attachment_id | No | string / null | Attachment id. Required for resource=attachment. |
routine_id | No | string / null | Routine id. Required for resource=routine-runs. |
q | No | string / null | Search text, 2-200 characters. Required for resource=search. |
limit | No | integer / null | Row cap. The per-resource maximum differs (50 to 200); the API rejects an over-large value. |
cursor | No | string / null | Opaque cursor from a previous page’s next_cursor. |
actor | No | string / null | Activity filter: human, agent, runner or system. |
category | No | string / null | Activity filter: message, conversation, approval, execution, workflow, canvas or configuration. |
consequence | No | string / null | Activity filter: requested, changed, approved, completed, failed or recorded. |
agent_id | No | string / null | Activity filter: only this agent’s activity. |
date_from | No | string / null | Activity filter: ISO timestamp, inclusive lower bound. |
date_to | No | string / null | Activity filter: ISO timestamp, inclusive upper bound. |
Complete input schema
{ "properties": { "resource": { "default": "room", "description": "What to read. `room` is the whole Work room in one call; `channels` lists the channels you can read and `channels-available` the ones you are not in; `messages` / `events` / `files` page one conversation (send `conversation`); `search` finds text across everything you can read (send `q`); `activity` is the feed of what happened; `work-items`, `work-items-history` and `oversight` are the All Work board; `routines` and `routine-runs` are the scheduled agent instructions.", "enum": [ "room", "channels", "channels-available", "channel-canvas", "messages", "events", "files", "message", "search", "attachment", "activity", "work-items", "work-items-history", "oversight", "routines", "routine-runs" ], "title": "Resource", "type": "string" }, "conversation": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "default": null, "description": "Conversation to read: a channel name (`work`) or a channel id. Required for messages/events/files.", "title": "Conversation" }, "channel": { "anyOf": [ { "maxLength": 255, "type": "string" }, { "type": "null" } ], "default": null, "description": "Channel name or id. Required for channel-canvas.", "title": "Channel" }, "message_id": { "anyOf": [ { "maxLength": 128, "type": "string" }, { "type": "null" } ], "default": null, "description": "Message id. Required for resource=message.", "title": "Message Id" }, "attachment_id": { "anyOf": [ { "maxLength": 128, "type": "string" }, { "type": "null" } ], "default": null, "description": "Attachment id. Required for resource=attachment.", "title": "Attachment Id" }, "routine_id": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ], "default": null, "description": "Routine id. Required for resource=routine-runs.", "title": "Routine Id" }, "q": { "anyOf": [ { "maxLength": 200, "minLength": 2, "type": "string" }, { "type": "null" } ], "default": null, "description": "Search text, 2-200 characters. Required for resource=search.", "title": "Q" }, "limit": { "anyOf": [ { "maximum": 200, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Row cap. The per-resource maximum differs (50 to 200); the API rejects an over-large value.", "title": "Limit" }, "cursor": { "anyOf": [ { "maxLength": 512, "type": "string" }, { "type": "null" } ], "default": null, "description": "Opaque cursor from a previous page's `next_cursor`.", "title": "Cursor" }, "actor": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ], "default": null, "description": "Activity filter: human, agent, runner or system.", "title": "Actor" }, "category": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ], "default": null, "description": "Activity filter: message, conversation, approval, execution, workflow, canvas or configuration.", "title": "Category" }, "consequence": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ], "default": null, "description": "Activity filter: requested, changed, approved, completed, failed or recorded.", "title": "Consequence" }, "agent_id": { "anyOf": [ { "maxLength": 128, "type": "string" }, { "type": "null" } ], "default": null, "description": "Activity filter: only this agent's activity.", "title": "Agent Id" }, "date_from": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ], "default": null, "description": "Activity filter: ISO timestamp, inclusive lower bound.", "title": "Date From" }, "date_to": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ], "default": null, "description": "Activity filter: ISO timestamp, inclusive upper bound.", "title": "Date To" } }, "title": "g8_work_readArguments", "type": "object"}g8_work_send_message
Post a message into a graph8 Work conversation. This is a real message other people and agents will see, so say what the user asked you to say and nothing else. Mentioning an agent via
mention_agent_idsstarts an agent turn: that agent reads the room and answers in it. 403 when the credential is not a member of the channel - an organisation API key holds a seat in the built-in channels (#work, #signals) and in channels it created.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
channel | Yes | string | Conversation to post into: a channel name (work) or id. |
message | No | string / null | Plain text to send. Send this OR document. |
document | No | object / null | Rich-text document; normalized server-side. |
parent_message_id | No | string / null | Reply inside this message’s thread. |
root_message_id | No | string / null | Thread root, when replying deeper than one level. |
mention_agent_ids | No | array / null | Agents to @mention. Mentioning one starts an agent turn that answers in the room. |
mention_user_ids | No | array / null | People to @mention. |
attachment_ids | No | array / null | Already-uploaded attachment ids to carry. |
Complete input schema
{ "properties": { "channel": { "description": "Conversation to post into: a channel name (`work`) or id.", "maxLength": 255, "title": "Channel", "type": "string" }, "message": { "anyOf": [ { "maxLength": 20000, "type": "string" }, { "type": "null" } ], "default": null, "description": "Plain text to send. Send this OR `document`.", "title": "Message" }, "document": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "description": "Rich-text document; normalized server-side.", "title": "Document" }, "parent_message_id": { "anyOf": [ { "maxLength": 128, "type": "string" }, { "type": "null" } ], "default": null, "description": "Reply inside this message's thread.", "title": "Parent Message Id" }, "root_message_id": { "anyOf": [ { "maxLength": 128, "type": "string" }, { "type": "null" } ], "default": null, "description": "Thread root, when replying deeper than one level.", "title": "Root Message Id" }, "mention_agent_ids": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 16, "type": "array" }, { "type": "null" } ], "default": null, "description": "Agents to @mention. Mentioning one starts an agent turn that answers in the room.", "title": "Mention Agent Ids" }, "mention_user_ids": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 64, "type": "array" }, { "type": "null" } ], "default": null, "description": "People to @mention.", "title": "Mention User Ids" }, "attachment_ids": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 20, "type": "array" }, { "type": "null" } ], "default": null, "description": "Already-uploaded attachment ids to carry.", "title": "Attachment Ids" } }, "required": [ "channel" ], "title": "g8_work_send_messageArguments", "type": "object"}