# Additional API operations through MCP

> Complete inputs for CRM, app building, webhook, agent and developer operations.

Source: https://docs.graph8.com/developers/mcp-reference/api-coverage/

These 145 tools extend progressive discovery: 117 arrived in MCP server 0.58.0, five additional reads require 0.59.0, five internal operator reports require 0.60.0, nine app-object operations require 0.61.0, and TLS readiness plus two public-widget calls require 0.62.0. Version 0.63.0 adds two protected credential exchanges, observed build reporting, and a read-only human-approval handoff. Version 0.64.0 adds the human-authorized decision relay and app-record change history. Availability requires that version or later and the appropriate organization permissions and feature enablement. Search with `g8_tool_search`, inspect the returned schema, and call the tool directly or through `g8_execute`.

For changes and actions, the default call returns `confirmation_required` without sending an API request. Set `confirm` to `true` after reviewing the intended operation. API errors, ownership checks, key scopes and billing restrictions still apply. Reads preserve the full response, including pagination.

For example, search for `rotate webhook secret` or the exact name `g8_webhook_rotate_webhook_secret`. Read the schema and obtain the webhook ID from a previous result. Rotating a secret changes webhook verification and requires an explicit confirmed call.

App tools require the app builder to be enabled and the caller to own or administer the app. Sandbox tools require a test-mode key. Browser login, infrastructure control and human approval decisions are not exposed by this extension.

## g8_agency_get_agency_me

> Get Agency Me. Uses the current organization and existing API permissions. API: GET /agency/me

### Inputs

```json
{
  "properties": {},
  "title": "g8_agency_get_agency_meArguments",
  "type": "object"
}
```

## g8_agency_list_agency_clients

> List Agency Clients. Uses the current organization and existing API permissions. API: GET /agency/clients

### Inputs

```json
{
  "properties": {},
  "title": "g8_agency_list_agency_clientsArguments",
  "type": "object"
}
```

## g8_agent_cancel_agent_run

> Cancel Agent Run. 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 /agent/runs/&#123;run_id&#125;/cancel

### Inputs

```json
{
  "properties": {
    "run_id": {
      "description": "Run ID",
      "format": "uuid",
      "title": "Run Id",
      "type": "string"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "run_id"
  ],
  "title": "g8_agent_cancel_agent_runArguments",
  "type": "object"
}
```

## g8_agent_create_agent_run

> Create Agent Run. 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 /agent/runs

### Inputs

```json
{
  "$defs": {
    "ApiCreateAgentRunRequest": {
      "additionalProperties": false,
      "properties": {
        "agent_id": {
          "description": "Which agent drives the loop: 'onboarding', 'dialer_setup', 'sequencer_setup', 'campaign_run', 'voice_setup', 'marketplace', 'dev_setup', or a free-form value for an ad-hoc session.",
          "title": "Agent Id",
          "type": "string"
        },
        "entry_point": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Entry Point"
        },
        "goal": {
          "description": "Free text the planner works from.",
          "minLength": 1,
          "title": "Goal",
          "type": "string"
        },
        "seed_message": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "An opening user turn, rendered as the first message.",
          "title": "Seed Message"
        },
        "session_title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Session Title"
        },
        "skill_mode": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "'web_search' | 'deep_thinking' | 'research'. Unknown values are ignored.",
          "title": "Skill Mode"
        },
        "subject_account_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Bind the run to a company.",
          "title": "Subject Account Id"
        },
        "subject_campaign_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Bind the run to a campaign.",
          "title": "Subject Campaign Id"
        },
        "title": {
          "maxLength": 500,
          "minLength": 1,
          "title": "Title",
          "type": "string"
        },
        "visibility": {
          "default": "private",
          "description": "'private' (default) keeps the run yours. 'shared' lets the organization see it, though only you can cancel it.",
          "pattern": "^(shared|private)$",
          "title": "Visibility",
          "type": "string"
        }
      },
      "required": [
        "agent_id",
        "goal",
        "title"
      ],
      "title": "ApiCreateAgentRunRequest",
      "type": "object"
    }
  },
  "properties": {
    "body": {
      "$ref": "#/$defs/ApiCreateAgentRunRequest"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "body"
  ],
  "title": "g8_agent_create_agent_runArguments",
  "type": "object"
}
```

## g8_agent_get_agent_approval_receipts

> Get Agent Approval Receipts. Uses the current organization and existing API permissions. API: GET /agent/approvals/&#123;approval_id&#125;/receipts

### Inputs

```json
{
  "properties": {
    "approval_id": {
      "description": "Approval ID",
      "format": "uuid",
      "title": "Approval Id",
      "type": "string"
    }
  },
  "required": [
    "approval_id"
  ],
  "title": "g8_agent_get_agent_approval_receiptsArguments",
  "type": "object"
}
```

## g8_agent_get_agent_run

> Get Agent Run. Uses the current organization and existing API permissions. API: GET /agent/runs/&#123;run_id&#125;

### Inputs

```json
{
  "properties": {
    "run_id": {
      "description": "Run ID",
      "format": "uuid",
      "title": "Run Id",
      "type": "string"
    }
  },
  "required": [
    "run_id"
  ],
  "title": "g8_agent_get_agent_runArguments",
  "type": "object"
}
```

## g8_agent_list_agent_approval_history

> List Agent Approval History. Uses the current organization and existing API permissions. API: GET /agent/approvals/history

### Inputs

```json
{
  "properties": {
    "decision": {
      "anyOf": [
        {
          "enum": [
            "approve",
            "reject",
            "edit_and_approve"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional filter on the recorded decision. An unrecognised value is rejected with 422 rather than silently ignored.",
      "title": "Decision"
    }
  },
  "title": "g8_agent_list_agent_approval_historyArguments",
  "type": "object"
}
```

## g8_agent_list_agent_approvals

> List Agent Approvals. Uses the current organization and existing API permissions. API: GET /agent/approvals

### Inputs

```json
{
  "properties": {},
  "title": "g8_agent_list_agent_approvalsArguments",
  "type": "object"
}
```

## g8_agent_list_agent_runs

> List Agent Runs. Uses the current organization and existing API permissions. API: GET /agent/runs

### Inputs

```json
{
  "properties": {
    "statuses": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional repeatable status filter: ?statuses=running&statuses=queued",
      "title": "Statuses"
    },
    "agent_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Agent Id"
    },
    "include_shared": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "When true (default), include org-wide shared runs. When false, return only runs this key owns.",
      "title": "Include Shared"
    },
    "limit": {
      "anyOf": [
        {
          "maximum": 500,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Limit"
    },
    "offset": {
      "anyOf": [
        {
          "minimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Offset"
    }
  },
  "title": "g8_agent_list_agent_runsArguments",
  "type": "object"
}
```

## g8_analytics_get_campaign_visitors

> Get Campaign Visitors. Uses the current organization and existing API permissions. API: GET /analytics/campaign-visitors

### Inputs

```json
{
  "properties": {
    "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"
    },
    "days": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Rolling 'last N days from today'. Ignored when start_date/end_date are supplied.",
      "title": "Days"
    },
    "limit": {
      "anyOf": [
        {
          "maximum": 200,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Row cap for the steps + contacts tables",
      "title": "Limit"
    },
    "include_contacts": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Include the Top contacts table (contact name + email \u2014 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_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/&#123;app_id&#125;/domains

### Inputs

```json
{
  "$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/&#123;app_id&#125;/limit

### Inputs

```json
{
  "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/&#123;app_id&#125;/source

### Inputs

```json
{
  "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_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/&#123;app_id&#125;/credentials

### Inputs

```json
{
  "$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 \u2014 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/&#123;app_id&#125;/secrets/&#123;secret_key&#125;

### Inputs

```json
{
  "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_get_active_deployment

> Get Active Deployment. Uses the current organization and existing API permissions. App-builder enablement and ownership gates apply. API: GET /apps/&#123;app_id&#125;/deployments/active

### Inputs

```json
{
  "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/&#123;app_id&#125;/limit

### Inputs

```json
{
  "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/&#123;app_id&#125;/logs

### Inputs

```json
{
  "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/&#123;app_id&#125;/runtime

### Inputs

```json
{
  "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/&#123;app_id&#125;/usage

### Inputs

```json
{
  "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/&#123;app_id&#125;/deployments/&#123;deployment_id&#125;

### Inputs

```json
{
  "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/&#123;app_id&#125;/deployments/&#123;deployment_id&#125;/logs

### Inputs

```json
{
  "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/&#123;app_id&#125;

### Inputs

```json
{
  "properties": {
    "app_id": {
      "title": "App Id",
      "type": "string"
    }
  },
  "required": [
    "app_id"
  ],
  "title": "g8_app_get_installed_appArguments",
  "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/&#123;app_id&#125;/credentials

### Inputs

```json
{
  "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/&#123;app_id&#125;/deployments

### Inputs

```json
{
  "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/&#123;app_id&#125;/domains

### Inputs

```json
{
  "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/&#123;app_id&#125;/installs

### Inputs

```json
{
  "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/&#123;app_id&#125;/secrets

### Inputs

```json
{
  "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

```json
{
  "properties": {},
  "title": "g8_app_list_installed_appsArguments",
  "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/&#123;app_id&#125;/secrets/&#123;secret_key&#125;

### Inputs

```json
{
  "$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/&#123;app_id&#125;/domains/&#123;hostname&#125;

### Inputs

```json
{
  "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_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/&#123;app_id&#125;/credentials/&#123;client_id&#125;

### Inputs

```json
{
  "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/&#123;app_id&#125;/deployments/&#123;deployment_id&#125;/rollback

### Inputs

```json
{
  "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/&#123;app_id&#125;/limit

### Inputs

```json
{
  "$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/&#123;app_id&#125;/source

### Inputs

```json
{
  "$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/&#123;app_id&#125;/status

### Inputs

```json
{
  "$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_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/&#123;app_id&#125;

### Inputs

```json
{
  "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_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/&#123;app_id&#125;/domains/&#123;hostname&#125;/verify

### Inputs

```json
{
  "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_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/&#123;ooo_uuid&#125;

### Inputs

```json
{
  "$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_audit_list_request_logs

> List Request Logs. Uses the current organization and existing API permissions. API: GET /logs

### Inputs

```json
{
  "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_connection_describe_current_key

> Describe Current Key. Uses the current organization and existing API permissions. API: GET /me

### Inputs

```json
{
  "properties": {},
  "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

```json
{
  "properties": {},
  "title": "g8_connection_get_mcp_connectionArguments",
  "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

```json
{
  "$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"
        },
        "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

```json
{
  "$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"
        },
        "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

```json
{
  "$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"
        },
        "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

```json
{
  "$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"
        },
        "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

```json
{
  "$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/&#123;contact_id&#125;/deals/assert

### Inputs

```json
{
  "$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

```json
{
  "$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 \u2014 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 \u2014 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`) \u2014 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 \u2014 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

```json
{
  "$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 \u2014 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 \u2014 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`) \u2014 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 \u2014 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/&#123;company_id&#125;

### Inputs

```json
{
  "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/&#123;column_id&#125;

### Inputs

```json
{
  "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/&#123;contact_id&#125;

### Inputs

```json
{
  "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/&#123;column_id&#125;

### Inputs

```json
{
  "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/&#123;list_id&#125;

### Inputs

```json
{
  "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/&#123;company_id&#125;

### Inputs

```json
{
  "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/&#123;list_id&#125;/contacts

### Inputs

```json
{
  "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

```json
{
  "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

```json
{
  "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/&#123;contact_id&#125;/tasks

### Inputs

```json
{
  "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_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/&#123;list_id&#125;/contacts

### Inputs

```json
{
  "$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_update_company

> Update 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: PATCH /companies/&#123;company_id&#125;

### Inputs

```json
{
  "$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": {
      "$ref": "#/$defs/ApiCompanyUpdateRequest"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "company_id",
    "body"
  ],
  "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/&#123;list_id&#125;

### Inputs

```json
{
  "$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/&#123;quote_id&#125;

### Inputs

```json
{
  "$defs": {
    "ApiQuoteLineItemRequest": {
      "additionalProperties": false,
      "properties": {
        "billing_frequency": {
          "anyOf": [
            {
              "enum": [
                "one_time",
                "month",
                "year",
                "quarter"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Billing Frequency"
        },
        "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"
        },
        "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_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/&#123;page_id&#125;/chat-edit

### Inputs

```json
{
  "$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

```json
{
  "$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/&#123;page_id&#125;

### Inputs

```json
{
  "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/&#123;page_id&#125;/generate

### Inputs

```json
{
  "$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/&#123;page_id&#125;

### Inputs

```json
{
  "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/&#123;page_id&#125;/artifact

### Inputs

```json
{
  "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/&#123;page_id&#125;/status

### Inputs

```json
{
  "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/&#123;page_id&#125;/actions/&#123;alias&#125;/&#123;action_name&#125;

### Inputs

```json
{
  "$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/&#123;page_id&#125;/actions

### Inputs

```json
{
  "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/&#123;page_id&#125;/versions

### Inputs

```json
{
  "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

```json
{
  "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/&#123;page_id&#125;/frame-session

### Inputs

```json
{
  "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/&#123;page_id&#125;/versions/&#123;version_num&#125;/restore

### Inputs

```json
{
  "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_enrichment_list_ai_configs

> List Ai Configs. Uses the current organization and existing API permissions. API: GET /enrichment/ai/configs

### Inputs

```json
{
  "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

```json
{
  "$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

```json
{
  "$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_intent_keywords_create_from_search

> Keywords Create From 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 /intent/keywords/create-from-search

### Inputs

```json
{
  "$defs": {
    "ApiKeywordsCreateFromSearchRequest": {
      "additionalProperties": false,
      "properties": {
        "contact_limit": {
          "default": 50,
          "description": "Max contacts to pre-resolve per keyword.",
          "maximum": 100.0,
          "minimum": 1.0,
          "title": "Contact Limit",
          "type": "integer"
        },
        "keywords": {
          "description": "1-10 free-text keyword queries. Each is searched against the intent page index, contacts/companies are resolved, and a compete-tracking keyword row is saved. Duplicates within the request (case-insensitive, trimmed) are skipped, not re-saved.",
          "items": {
            "type": "string"
          },
          "maxItems": 10,
          "minItems": 1,
          "title": "Keywords",
          "type": "array"
        },
        "page_limit": {
          "default": 20,
          "description": "Max pages to seed per keyword. Deliberately smaller than create-from-domain's 200 default since this runs once per keyword.",
          "maximum": 50.0,
          "minimum": 1.0,
          "title": "Page Limit",
          "type": "integer"
        },
        "search_filters": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Optional intent-search filters applied to EVERY keyword in the batch (audience, page_type, commercial_score_min, etc.). Stored verbatim on each saved keyword row so the daily resolver replays them.",
          "title": "Search Filters"
        },
        "semantic_ratio": {
          "default": 0.0,
          "description": "0 = text search (default, cheapest), 1 = semantic, between = hybrid.",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Semantic Ratio",
          "type": "number"
        }
      },
      "required": [
        "keywords"
      ],
      "title": "ApiKeywordsCreateFromSearchRequest",
      "type": "object"
    }
  },
  "properties": {
    "body": {
      "$ref": "#/$defs/ApiKeywordsCreateFromSearchRequest"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "body"
  ],
  "title": "g8_intent_keywords_create_from_searchArguments",
  "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/&#123;page_id&#125;/agent-sessions

### Inputs

```json
{
  "$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_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/&#123;repo_id&#125;/campaigns

### Inputs

```json
{
  "$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/&#123;repo_id&#125;

### Inputs

```json
{
  "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/&#123;repo_id&#125;/campaigns/&#123;campaign_id&#125;/documents/&#123;document_id&#125;

### Inputs

```json
{
  "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/&#123;repo_id&#125;/campaigns/&#123;campaign_id&#125;/launch

### Inputs

```json
{
  "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

```json
{
  "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/&#123;repo_id&#125;/streams

### Inputs

```json
{
  "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/&#123;repo_id&#125;/rollback

### Inputs

```json
{
  "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/&#123;repo_id&#125;/campaigns/&#123;campaign_id&#125;

### Inputs

```json
{
  "$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_sandbox_sandbox_clear_failure_rules

> Clear failure rules. Uses the current organization and existing API permissions. Test-mode sandbox only; a live key is rejected by the API. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: DELETE /sandbox/failure-injection

### Inputs

```json
{
  "properties": {
    "channel": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Clear one channel only; omit for all",
      "title": "Channel"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "title": "g8_sandbox_sandbox_clear_failure_rulesArguments",
  "type": "object"
}
```

## g8_sandbox_sandbox_list_failure_rules

> List failure rules. Uses the current organization and existing API permissions. Test-mode sandbox only; a live key is rejected by the API. API: GET /sandbox/failure-injection

### Inputs

```json
{
  "properties": {},
  "title": "g8_sandbox_sandbox_list_failure_rulesArguments",
  "type": "object"
}
```

## g8_sandbox_sandbox_outbox

> List simulated outbox. Uses the current organization and existing API permissions. Test-mode sandbox only; a live key is rejected by the API. API: GET /sandbox/outbox

### Inputs

```json
{
  "properties": {
    "channel": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Filter by channel",
      "title": "Channel"
    },
    "limit": {
      "anyOf": [
        {
          "maximum": 200,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Limit"
    },
    "offset": {
      "anyOf": [
        {
          "minimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Offset"
    }
  },
  "title": "g8_sandbox_sandbox_outboxArguments",
  "type": "object"
}
```

## g8_sandbox_sandbox_reset_fixtures

> Reset fixture data. Uses the current organization and existing API permissions. Test-mode sandbox only; a live key is rejected by the API. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /sandbox/fixtures/reset

### Inputs

```json
{
  "properties": {
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "title": "g8_sandbox_sandbox_reset_fixturesArguments",
  "type": "object"
}
```

## g8_sandbox_sandbox_restore

> Restore a snapshot. Uses the current organization and existing API permissions. Test-mode sandbox only; a live key is rejected by the API. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /sandbox/fixtures/restore

### Inputs

```json
{
  "properties": {
    "name": {
      "anyOf": [
        {
          "maxLength": 64,
          "minLength": 1,
          "pattern": "^[A-Za-z0-9_\\-]+$",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Name"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "title": "g8_sandbox_sandbox_restoreArguments",
  "type": "object"
}
```

## g8_sandbox_sandbox_seed_fixtures

> Seed sample data. Uses the current organization and existing API permissions. Test-mode sandbox only; a live key is rejected by the API. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /sandbox/fixtures/seed

### Inputs

```json
{
  "properties": {
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "title": "g8_sandbox_sandbox_seed_fixturesArguments",
  "type": "object"
}
```

## g8_sandbox_sandbox_set_failure_rule

> Set a failure rule. Uses the current organization and existing API permissions. Test-mode sandbox only; a live key is rejected by the API. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: PUT /sandbox/failure-injection

### Inputs

```json
{
  "$defs": {
    "ApiFailureRuleRequest": {
      "additionalProperties": false,
      "properties": {
        "channel": {
          "description": "Channel the injected failure applies to: email, sms, whatsapp, voice, linkedin, crm, ads, calendar, or '*' for every channel.",
          "title": "Channel",
          "type": "string"
        },
        "failure_mode": {
          "description": "One of: hard_bounce, provider_error, timeout, rate_limited, invalid_recipient.",
          "title": "Failure Mode",
          "type": "string"
        },
        "remaining": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Fail this many sends, then auto-clear. Omit to fail until cleared.",
          "title": "Remaining"
        }
      },
      "required": [
        "channel",
        "failure_mode"
      ],
      "title": "ApiFailureRuleRequest",
      "type": "object"
    }
  },
  "properties": {
    "body": {
      "$ref": "#/$defs/ApiFailureRuleRequest"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "body"
  ],
  "title": "g8_sandbox_sandbox_set_failure_ruleArguments",
  "type": "object"
}
```

## g8_sandbox_sandbox_snapshot

> Snapshot fixture tables. Uses the current organization and existing API permissions. Test-mode sandbox only; a live key is rejected by the API. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /sandbox/fixtures/snapshot

### Inputs

```json
{
  "properties": {
    "name": {
      "anyOf": [
        {
          "maxLength": 64,
          "minLength": 1,
          "pattern": "^[A-Za-z0-9_\\-]+$",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Name"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "title": "g8_sandbox_sandbox_snapshotArguments",
  "type": "object"
}
```

## g8_sandbox_sandbox_status

> Sandbox status. Uses the current organization and existing API permissions. Test-mode sandbox only; a live key is rejected by the API. API: GET /sandbox/status

### Inputs

```json
{
  "properties": {},
  "title": "g8_sandbox_sandbox_statusArguments",
  "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

```json
{
  "$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_sequence_get_sequence

> Get Sequence. Uses the current organization and existing API permissions. API: GET /sequences/&#123;sequence_id&#125;

### Inputs

```json
{
  "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/&#123;sequence_id&#125;/contacts

### Inputs

```json
{
  "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/&#123;sequence_id&#125;/run

### Inputs

```json
{
  "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_snippet_get_form_template

> Get Form Template. Uses the current organization and existing API permissions. API: GET /snippet/form

### Inputs

```json
{
  "properties": {},
  "title": "g8_snippet_get_form_templateArguments",
  "type": "object"
}
```

## g8_usage_get_usage

> Get Usage. Uses the current organization and existing API permissions. API: GET /usage

### Inputs

```json
{
  "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

```json
{
  "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

```json
{
  "$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/&#123;webhook_id&#125;

### Inputs

```json
{
  "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/&#123;webhook_id&#125;

### Inputs

```json
{
  "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/&#123;webhook_id&#125;/deliveries

### Inputs

```json
{
  "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

```json
{
  "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

```json
{
  "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/&#123;webhook_id&#125;/rotate-secret

### Inputs

```json
{
  "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/&#123;webhook_id&#125;

### Inputs

```json
{
  "$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_workflow_list_workflow_executions

> List workflow executions for the caller's org (recover a lost execution_id). Uses the current organization and existing API permissions. API: GET /workflows/executions

### Inputs

```json
{
  "properties": {
    "action_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Filter to a single workflow's executions.",
      "title": "Action Id"
    },
    "status_filter": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Filter by execution status (equality match \u2014 one status per call). The backend writes seven values: pending|running|completed|failed|paused|pending_approval|stopped. The four terminal-or-early states are pending, running, completed, failed; paused and pending_approval are resumable, stopped is terminal.",
      "title": "Status Filter"
    },
    "triggered_by": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Filter by the identity that started the run (user email, agent id, 'api', ...).",
      "title": "Triggered By"
    },
    "limit": {
      "anyOf": [
        {
          "maximum": 200,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Page size (1..200).",
      "title": "Limit"
    },
    "offset": {
      "anyOf": [
        {
          "minimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Rows to skip for pagination.",
      "title": "Offset"
    }
  },
  "title": "g8_workflow_list_workflow_executionsArguments",
  "type": "object"
}
```

## g8_workflow_plan_inline_workflow

> Preview a normalized execution plan for an inline workflow graph. 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 /workflows/plan

### Inputs

```json
{
  "properties": {
    "body": {
      "additionalProperties": true,
      "title": "Body",
      "type": "object"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "body"
  ],
  "title": "g8_workflow_plan_inline_workflowArguments",
  "type": "object"
}
```

## g8_workflow_plan_workflow

> Preview a normalized execution plan for a saved workflow. 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 /workflows/&#123;action_id&#125;/plan

### Inputs

```json
{
  "properties": {
    "action_id": {
      "description": "Workflow action_id.",
      "minLength": 1,
      "title": "Action Id",
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Body"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "action_id"
  ],
  "title": "g8_workflow_plan_workflowArguments",
  "type": "object"
}
```

## Additional reads in 0.59.0

Visitor and company signal reads require an API key explicitly granting `intent:read`. Supply the visitor IPv4 or IPv6 address; the server does not infer it from its own connection. Existing browser SDK write-key calls remain supported by the API.

Knowledge export requires the existing knowledge export and MCP access grants. The result is an embedded ZIP resource with a base64 `blob`; decode it to save the archive. Archives above 1 MiB return an error; use the authenticated API download for larger exports.

## g8_app_public_verification_keys

> Read app-token public verification keys (JWKS), not private keys or tokens. Uses the configured graph8 API host. An empty keyset means the backend has no active verification keys; an app-platform gate may return 404.

### Inputs

```json
{
  "properties": {},
  "title": "g8_app_public_verification_keysArguments",
  "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

```json
{
  "properties": {},
  "title": "g8_knowledge_exportArguments",
  "type": "object"
}
```

## g8_company_intent_signals

> Read a company's buying signals from the authenticated organization's visitor events. Requires an API key with explicit intent:read. Supply a company domain such as example.com. No browser Origin or write-key impersonation is used.

### Inputs

```json
{
  "properties": {
    "domain": {
      "maxLength": 253,
      "minLength": 1,
      "title": "Domain",
      "type": "string"
    }
  },
  "required": [
    "domain"
  ],
  "title": "g8_company_intent_signalsArguments",
  "type": "object"
}
```

## g8_visitor_company

> Resolve an explicitly supplied visitor IP to company information. Requires an API key with explicit intent:read. Uses the supplied visitor IP, never the MCP server's outbound IP. Does not accept browser write keys.

### Inputs

```json
{
  "properties": {
    "visitor_ip": {
      "format": "ipvanyaddress",
      "title": "Visitor Ip",
      "type": "string"
    }
  },
  "required": [
    "visitor_ip"
  ],
  "title": "g8_visitor_companyArguments",
  "type": "object"
}
```

## g8_visitor_score

> Read engagement signals for a visitor IP within the authenticated organization. Requires an API key with explicit intent:read. Visitor events remain scoped to that organization; the IP does not select a different tenant.

### Inputs

```json
{
  "properties": {
    "visitor_ip": {
      "format": "ipvanyaddress",
      "title": "Visitor Ip",
      "type": "string"
    }
  },
  "required": [
    "visitor_ip"
  ],
  "title": "g8_visitor_scoreArguments",
  "type": "object"
}
```

## Operator reports in 0.60.0

These five tools are for internal operators with an already-issued operator API key. Configure that key using your MCP client's credential settings and connect in developer or all-tools mode. Never paste the key into a tool argument. Search for the exact tool name with `g8_tool_search`, inspect its schema, then call it directly or with `g8_execute`.

Ordinary customer keys, agency keys and Owner/Admin roles cannot grant operator access. The organization-user bridge refuses these reports and points to the separate MCP connection. If access is denied, verify that the configured key is an existing operator key for the intended backend; no tool creates or upgrades credentials.

Start with `g8_ops_index`. For reports, use a known legacy organization ID or PropelAuth organization UUID. The target is explicit and every report read is audited by the API. Reports can include contact details and rendered messages. They do not send messages, change bindings or start sequences.

All reports return JSON. Actions preserve pagination: use `page` and `limit` (maximum 200), and follow `pagination.has_next`. Missing LinkedIn tables yield empty reports. Null invitation notes are normal for bare invitations; `skipped_too_distant` describes eligibility, not an outage. Webhook summaries report counts and timing, not stored payloads.

## g8_ops_index

> Describe the internal cross-organization LinkedIn operations reports. Requires an existing internally minted operator API key. Ordinary org keys, agency keys, and Owner/Admin roles do not grant this identity. Configure the credential on the MCP connection; never put it in tool arguments. These tools neither mint credentials nor send LinkedIn actions.

### Inputs

```json
{
  "properties": {},
  "title": "g8_ops_indexArguments",
  "type": "object"
}
```

## g8_ops_linkedin_actions

> Read paginated LinkedIn action diagnostics for an explicitly selected organization. Internal operator key required; cross-organization reads are audited by the API. Returns JSON with pagination, including rendered messages and contact details. Use a known legacy org ID or PropelAuth UUID. since and until are ISO timestamps. A null note is normal for bare invitations; skipped_too_distant is an eligibility skip, not a provider outage.

### Inputs

```json
{
  "properties": {
    "org_id": {
      "maxLength": 128,
      "pattern": "^(?:org_[A-Za-z0-9]+|[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$",
      "title": "Org Id",
      "type": "string"
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Status"
    },
    "kind": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Kind"
    },
    "account_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Account Id"
    },
    "sequence_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Sequence Id"
    },
    "since": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Since"
    },
    "until": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Until"
    },
    "page": {
      "default": 1,
      "minimum": 1,
      "title": "Page",
      "type": "integer"
    },
    "limit": {
      "default": 100,
      "maximum": 200,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    }
  },
  "required": [
    "org_id"
  ],
  "title": "g8_ops_linkedin_actionsArguments",
  "type": "object"
}
```

## g8_ops_linkedin_actions_summary

> Read LinkedIn action counts by sequence, sender, kind and status for one organization. Requires an internally minted operator key. Target organization is explicit and audited. Returns the API's JSON report without truncation.

### Inputs

```json
{
  "properties": {
    "org_id": {
      "maxLength": 128,
      "pattern": "^(?:org_[A-Za-z0-9]+|[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$",
      "title": "Org Id",
      "type": "string"
    }
  },
  "required": [
    "org_id"
  ],
  "title": "g8_ops_linkedin_actions_summaryArguments",
  "type": "object"
}
```

## g8_ops_linkedin_sequence_bindings

> Read sequence-to-LinkedIn-sender bindings and unbound live sequences for one organization. Internal operator key required; target organization is explicit and audited. An unbound live sequence cannot send its LinkedIn steps. This report does not change bindings, start sequences or send messages.

### Inputs

```json
{
  "properties": {
    "org_id": {
      "maxLength": 128,
      "pattern": "^(?:org_[A-Za-z0-9]+|[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$",
      "title": "Org Id",
      "type": "string"
    }
  },
  "required": [
    "org_id"
  ],
  "title": "g8_ops_linkedin_sequence_bindingsArguments",
  "type": "object"
}
```

## g8_ops_linkedin_webhook_events

> Read inbound LinkedIn webhook counts and first/last-seen times for one organization. Internal operator key required; target organization is audited. This is a deduplication ledger, not stored webhook payloads. lead.message_received means a tracked lead reply; inbox.message_received does not imply one.

### Inputs

```json
{
  "properties": {
    "org_id": {
      "maxLength": 128,
      "pattern": "^(?:org_[A-Za-z0-9]+|[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$",
      "title": "Org Id",
      "type": "string"
    }
  },
  "required": [
    "org_id"
  ],
  "title": "g8_ops_linkedin_webhook_eventsArguments",
  "type": "object"
}
```

## App-token connection

Use the separate local `g8-app-mcp-server` command with an existing app token. This requires MCP package 0.61.0 or later. It uses stdio; the ordinary hosted MCP connection and organization-user bridge cannot execute these app-token tools. They will explain which connection is required.

Configure the command in your MCP client's local-server settings. For example:

```json
{
  "mcpServers": {
    "graph8-app-objects": {
      "command": "uvx",
      "args": ["--from", "g8-mcp-server==0.61.0", "g8-app-mcp-server"],
      "env": {
        "G8_API_URL": "https://be.graph8.com",
        "G8_APP_TOKEN": "<existing-app-token>"
      }
    }
  }
}
```

Set the backend origin to the environment for that token. It must use HTTPS without an API path, query or embedded credentials. Keep the token in the client's credential configuration; never paste it into a tool argument. This connection does not use `G8_API_KEY` or saved organization login credentials and cannot create or refresh tokens. If a token expires or is revoked, obtain a replacement through the existing authorized app flow and restart the connection.

The token determines the app and tenant. API checks for app scopes, installation, consent, tenant readiness, record references and app metering still apply. The connection exposes only the ten app-object tools, search and dispatch. It does not expose normal organization records, operator reports or credential issuance.

Start with `g8_app_objects_list`, then read the chosen object's attributes. Use returned object slugs and record IDs. Record listing preserves pagination and accepts a returned cursor, which takes precedence over page numbers. History is newest first.

For create, update and restore, the first call produces a review preview without an API request. Check the values and target, then set `confirm` to `true`. On update, omitted attributes remain unchanged and an explicit null clears an allowed nullable attribute. Supply `expected_revision` from a prior record to reject stale edits. Schema, uniqueness or reference errors remain visible instead of being silently dropped.

## g8_app_objects_list

> List the objects declared by the authenticated app for its token's tenant. Requires the separate g8-app-mcp-server stdio connection and an existing app token with objects:read. Installation, consent, tenant readiness and metering stay enforced by the API. Ordinary org-owned objects are separate.

### Inputs

```json
{
  "properties": {},
  "title": "g8_app_objects_listArguments",
  "type": "object"
}
```

## g8_app_object_get

> Get one app-owned object definition. Requires the app-token connection and objects:read. App and tenant are derived from the existing token, never tool arguments.

### Inputs

```json
{
  "properties": {
    "object_slug": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Object Slug",
      "type": "string"
    }
  },
  "required": [
    "object_slug"
  ],
  "title": "g8_app_object_getArguments",
  "type": "object"
}
```

## g8_app_object_attributes

> Read the app object's attribute schema before shaping record values. Requires the separate app-token connection and attributes:read. The API enforces the app's manifest, installation, consent and current schema.

### Inputs

```json
{
  "properties": {
    "object_slug": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Object Slug",
      "type": "string"
    }
  },
  "required": [
    "object_slug"
  ],
  "title": "g8_app_object_attributesArguments",
  "type": "object"
}
```

## g8_app_object_records

> List active app-owned records. Requires the app-token connection and records:read. Preserve pagination and use a cursor from the prior response when present; cursor takes precedence over page. App and tenant come only from the token.

### Inputs

```json
{
  "properties": {
    "object_slug": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Object Slug",
      "type": "string"
    },
    "page": {
      "default": 1,
      "minimum": 1,
      "title": "Page",
      "type": "integer"
    },
    "limit": {
      "default": 50,
      "maximum": 200,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Cursor"
    }
  },
  "required": [
    "object_slug"
  ],
  "title": "g8_app_object_recordsArguments",
  "type": "object"
}
```

## g8_app_object_record_get

> Read an app-owned record's current values. Requires the app-token connection and records:read.

### Inputs

```json
{
  "properties": {
    "object_slug": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Object Slug",
      "type": "string"
    },
    "record_id": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Record Id",
      "type": "string"
    }
  },
  "required": [
    "object_slug",
    "record_id"
  ],
  "title": "g8_app_object_record_getArguments",
  "type": "object"
}
```

## g8_app_object_record_history

> Read an app-owned record's value history, newest first. Requires the app-token connection and records:read.

### Inputs

```json
{
  "properties": {
    "object_slug": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Object Slug",
      "type": "string"
    },
    "record_id": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Record Id",
      "type": "string"
    },
    "limit": {
      "default": 100,
      "maximum": 500,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    }
  },
  "required": [
    "object_slug",
    "record_id"
  ],
  "title": "g8_app_object_record_historyArguments",
  "type": "object"
}
```

## g8_app_object_record_update

> Update supplied app-record attributes after review and confirm=true. Requires the app-token connection and records:write. Omitted attributes remain unchanged; explicit null clears an allowed nullable attribute. Supply expected_revision from the record to reject stale edits with 409.

### Inputs

```json
{
  "properties": {
    "object_slug": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Object Slug",
      "type": "string"
    },
    "record_id": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Record Id",
      "type": "string"
    },
    "values": {
      "additionalProperties": true,
      "title": "Values",
      "type": "object"
    },
    "expected_revision": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Expected Revision"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "object_slug",
    "record_id",
    "values"
  ],
  "title": "g8_app_object_record_updateArguments",
  "type": "object"
}
```

## g8_app_object_record_create

> Create an app-owned record after reviewing its values and setting confirm=true. Requires the separate app-token connection and records:write. Read the attribute schema first. The API rejects unknown attributes and invalid cross-app or cross-tenant references, and applies app metering.

### Inputs

```json
{
  "properties": {
    "object_slug": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Object Slug",
      "type": "string"
    },
    "values": {
      "additionalProperties": true,
      "title": "Values",
      "type": "object"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "object_slug",
    "values"
  ],
  "title": "g8_app_object_record_createArguments",
  "type": "object"
}
```

## g8_app_object_record_restore

> Restore an archived app-owned record under its original ID after review and confirm=true. Requires the app-token connection and records:write. Current schema, uniqueness, reference, installation and consent checks remain authoritative.

### Inputs

```json
{
  "properties": {
    "object_slug": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Object Slug",
      "type": "string"
    },
    "record_id": {
      "maxLength": 256,
      "minLength": 1,
      "pattern": "^[A-Za-z0-9_-]+$",
      "title": "Record Id",
      "type": "string"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "object_slug",
    "record_id"
  ],
  "title": "g8_app_object_record_restoreArguments",
  "type": "object"
}
```

## Public-widget connection

MCP package 0.62.0 or later includes `g8-public-mcp-server`, a separate local stdio connection for the public widget API. Configure an existing write key and the HTTPS origin of a site you are authorized to integrate. The backend checks the site's domain allowlist and selects the organization associated with the write key. An organization API key does not substitute for this connection.

```json
{
  "mcpServers": {
    "graph8-public-widgets": {
      "command": "uvx",
      "args": ["--from", "g8-mcp-server==0.62.0", "g8-public-mcp-server"],
      "env": {
        "G8_API_URL": "https://be.graph8.com",
        "G8_PUBLIC_ORIGIN": "https://your-authorized-site.example",
        "G8_PUBLIC_WRITE_KEY": "YOUR_EXISTING_PUBLIC_WRITE_KEY"
      }
    }
  }
}
```

Use the appropriate backend origin for your environment, without an API path. Keep credentials in your client's protected environment configuration. Neither credentials nor the site origin can be changed in tool arguments. Missing configuration stops startup; an expired or rejected key does not trigger credential exchange or an organization-key fallback.

This connection exposes the two public tools below plus `g8_tool_search` and `g8_execute`. Both calls first return a preview. Review the target and potential usage costs, then call with `confirm: true`. The client makes one request and does not follow redirects or automatically retry. After an uncertain failure, check the result before repeating a potentially billable call. Existing API rate limits apply.

Public enrichment returns fields from the public enrichment endpoint, not an organization CRM record. Public copilot uses the widget's non-streaming knowledge assistant. Its current API accepts but does not consume the `context` field; `session_id` is echoed rather than proof of persisted conversation history.

TLS readiness is available on the ordinary developer/all MCP connection. It reports whether the public edge ask endpoint currently permits TLS for a domain. It does not issue a certificate, verify DNS, or prove an installed certificate is healthy. Unknown and unverified domains both return `tls_eligible: false`; other errors remain errors.

## g8_app_tls_readiness

Check whether the configured edge currently permits TLS for a hostname.

            This read calls the public TLS ask endpoint. It does not issue a
            certificate, verify DNS or prove a deployed certificate is healthy.
            A 404 means not eligible, with unknown and unverified hosts kept
            indistinguishable. Infrastructure outages remain errors.

### Inputs

```json
{
  "properties": {
    "domain": {
      "maxLength": 253,
      "minLength": 1,
      "title": "Domain",
      "type": "string"
    }
  },
  "required": [
    "domain"
  ],
  "title": "g8_app_tls_readinessArguments",
  "type": "object"
}
```

## g8_public_copilot_chat

Ask the public widget copilot using the separate g8-public-mcp-server connection.

        Requires an existing public write key and a configured allowed site origin.
        The API selects the organization from the key; arguments cannot select it.
        Uses the public non-streaming knowledge assistant; context is forwarded as
        supplied but the current API does not consume it. Requires confirmation
        because model usage may be billable. No automatic retry is performed.

### Inputs

```json
{
  "properties": {
    "message": {
      "minLength": 1,
      "title": "Message",
      "type": "string"
    },
    "session_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Session Id"
    },
    "context": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Context"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "message"
  ],
  "title": "g8_public_copilot_chatArguments",
  "type": "object"
}
```

## g8_public_enrich_lookup

Look up known progressive-form contact fields through the public-widget API.

        Requires g8-public-mcp-server with an existing public write key and an
        allowed site origin. Returns the public endpoint's known/missing fields,
        not an organization CRM record. Confirm this potentially billable lookup.
        No automatic retry is performed; API authentication and rate limits apply.

### Inputs

```json
{
  "properties": {
    "email": {
      "minLength": 1,
      "title": "Email",
      "type": "string"
    },
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "required": [
    "email"
  ],
  "title": "g8_public_enrich_lookupArguments",
  "type": "object"
}
```

## Trusted connections

MCP package 0.63.0 adds credential-provider connections for app tokens and a controller connection for observed build reporting. Configure existing credentials through your MCP host's protected environment. Do not put secrets into tool arguments, prompts, screenshots, or shared configuration files.

### App credential providers

Use `g8-browser-app-mcp-server` with an existing authenticated browser session, or `g8-service-app-mcp-server` with existing app client credentials. These are local stdio connections. They do not initiate browser login, create client credentials, grant new scopes, or silently fall back to an organization key.

Both require the following fixed configuration:

| Variable | Value |
| --- | --- |
| `G8_API_URL` | HTTPS backend origin for the environment, without an API path. |
| `G8_APP_ID` | The intended app ID. |
| `G8_APP_ORG_ID` | The intended organization ID. The browser API validates membership; service credentials remain tenant-bound. |
| `G8_APP_AUDIENCE` | The app's exact token audience for this environment, from the app configuration. |
| `G8_APP_SCOPES` | A nonempty JSON array of explicit approved app scopes, such as `["objects:read", "records:read"]`. Wildcards are refused. |

For the browser provider, add `G8_BROWSER_SESSION_TOKEN`, supplied through a protected channel by an already authenticated client. For the service provider, add `G8_APP_CLIENT_ID` and `G8_APP_CLIENT_SECRET`. Configure only credentials you are authorized to use. A browser session expiring or losing access requires the existing sign-in flow; MCP cannot impersonate that session or bypass installation consent.

A service connection can be configured as follows, with placeholders supplied from your protected credential configuration:

```json
{
  "mcpServers": {
    "graph8-service-app": {
      "command": "uvx",
      "args": ["--from", "g8-mcp-server==0.63.0", "g8-service-app-mcp-server"],
      "env": {
        "G8_API_URL": "https://be.graph8.com",
        "G8_APP_ID": "YOUR_APP_ID",
        "G8_APP_ORG_ID": "YOUR_ORGANIZATION_ID",
        "G8_APP_AUDIENCE": "YOUR_APP_AUDIENCE",
        "G8_APP_SCOPES": "[\"objects:read\",\"records:read\"]",
        "G8_APP_CLIENT_ID": "YOUR_EXISTING_CLIENT_ID",
        "G8_APP_CLIENT_SECRET": "YOUR_EXISTING_CLIENT_SECRET"
      }
    }
  }
}
```

For a browser connection, change the command argument to `g8-browser-app-mcp-server` and replace the two client-credential variables with `G8_BROWSER_SESSION_TOKEN`.

Each connection exposes its single acquisition tool, ten app-object tools, search and dispatch. First call the acquisition tool without confirmation to review the fixed app, tenant, audience and scopes. Call again with `confirm: true` to acquire the token. Only grant metadata is returned. The token stays in memory and is used by app-object calls on the same connection; it is never returned to the agent or written to disk.

API installation, consent, revocation, scope ceilings, rate limits and token verification remain authoritative. Unexpected token app, tenant, audience or scopes are refused. An exchange failure clears the prior token. Expiry does not trigger automatic acquisition; explicitly review a new acquisition. The existing `g8-app-mcp-server` remains available when an authorized caller already has an app token.

### Build-controller connection

Run `g8-controller-mcp-server` as an isolated stdio process inside the authorized controller environment, with an explicit HTTPS `G8_API_URL` and existing `APP_BUILD_CONTROLLER_TOKEN` of at least 32 characters. It also requires the standard Kubernetes service-account token and CA mounts, and authorized read access to build Jobs. The cluster API address and credential mount locations are fixed; tools cannot supply replacement addresses or files.

`g8_app_report_observed_build` accepts only app ID, deployment ID and confirmation. It derives the namespace and Job name from validated IDs and verifies the returned Job identity. A running Job reports `building`, a completed Job reports `promoting`, and a failed Job reports `failed`. Missing, unreadable, mismatched or contradictory evidence does not update progress. No image digest or user-supplied error text is invented.

The API retains controller authentication, app/deployment binding and legal state transitions. A 409 is returned for an out-of-order report; the tool does not force intermediate transitions or retry. This operation does not promote an app to live traffic, create Jobs or configure cluster access.

### Human approval handoff

Set `G8_APP_URL` on the ordinary MCP connection to the HTTPS frontend origin matching its backend environment. `g8_agent_human_approval_handoff` accepts an approval UUID and searches caller-visible pending approvals and the latest 100 decisions. An exact match produces a review link that selects only that approval in the existing authenticated human UI. Missing or older records are reported as unavailable; a different approval is never selected.

The human review screen retains its access guard and existing decision controls. Expired approvals remain expired. Call the handoff tool again after review to inspect the recorded decision and available receipts. A decision is not proof that the action executed. The tool has no decision, edit, actor or confirmation argument and never sends the decision POST. MCP elicitation is not treated as proof of a human decision.

## g8_app_exchange_browser_session

Acquire an app token from this connection's existing authenticated browser session.

            Requires g8-browser-app-mcp-server with a protected existing session
            token and fixed app, tenant, audience and scope configuration. This
            is not a login flow. The API validates user identity, organization
            membership, app installation and consent. Confirm the grant first.
            The issued token stays in connection memory for app-object calls.
            No secrets, tenant or scope overrides are accepted as arguments.

### Inputs

```json
{
  "properties": {
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "title": "g8_app_exchange_browser_sessionArguments",
  "type": "object"
}
```

## g8_app_issue_service_token

Acquire an app token with this connection's existing service client credentials.

            Requires g8-service-app-mcp-server with fixed app, tenant, audience
            and explicit scopes. Confirm the grant first. API credential
            validity, revocation, scope ceilings and tenant clamp remain
            authoritative. Returns grant metadata only; secrets and issued
            tokens remain inside the connection for app-object calls. No
            automatic retries, refresh or organization-key fallback.

### Inputs

```json
{
  "properties": {
    "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
    }
  },
  "title": "g8_app_issue_service_tokenArguments",
  "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

```json
{
  "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_agent_human_approval_handoff

Open an exact approval for human review, or inspect a recorded decision.

        Requires G8_APP_URL configured to this connection's frontend origin.
        Reads caller-visible pending approvals and the most recent 100 decisions.
        A missing result does not prove deletion or denial. Follow the review URL
        in an authenticated browser; the human UI alone makes the decision.
        Call again after review to inspect recorded status and available receipts.
        This tool never approves, rejects, edits, or treats MCP elicitation as
        proof of a human decision. A decision does not prove downstream execution.

### Inputs

```json
{
  "properties": {
    "approval_id": {
      "format": "uuid",
      "title": "Approval Id",
      "type": "string"
    }
  },
  "required": [
    "approval_id"
  ],
  "title": "g8_agent_human_approval_handoffArguments",
  "type": "object"
}
```

## Human-authorized decision relay

`g8_agent_submit_human_decision` requires MCP server 0.64.0, a personal API key with `workflows:write` and approval permissions, and `G8_APP_URL` set to the graph8 HTTPS origin. Discover it with `g8_tool_search` or invoke it through `g8_execute` after checking its schema.

| Input | Required | Type | Description |
| --- | --- | --- | --- |
| `approval_id` | Yes | UUID | Exact approval ID returned by the approval listing or handoff. |

Call with the approval ID. If authorization is missing, the tool returns an exact review link. The human signs into graph8, reviews the action and explicitly authorizes approval, rejection or edited approval. Call the tool again within five minutes with the personal key belonging to that human. The one-use authorization remains on the server; do not copy a token into chat.

The tool accepts no decision, edit, actor or confirmation arguments. It refuses expired, changed or already-consumed authorizations. Organization keys cannot substitute for a personal identity. On an uncertain response, inspect approval status before trying again. Success records a decision; it does not prove execution. The read-only `g8_agent_human_approval_handoff` remains available to inspect status and available receipts.

## App-record change history

`g8_app_object_record_changes` reads mutation history through the separate app-token connection with `records:read`. Supply `object_slug` and `record_id` from prior app results. Optional `limit` is 1–200 (default 100); pass the API-returned `cursor` unchanged for the next page. App, tenant, installation and metering remain controlled by the API. This is separate from the existing attribute-value history call. See the [complete input schema](https://docs.graph8.com/developers/mcp-reference/crm/#g8_app_object_record_changes).
