---
updatedAt: 2026-09-02T17:35:26.000Z
agentTools:
  projectIndex: https://docs.go.v7labs.com/llms.txt
---

# Setup trigger source

Sets up the trigger source (provider configuration) and activates the trigger.

When enabled, webhooks create entities in the backing project automatically.

## Provider Configuration Options

1. **Pipedream source**: `{"provider": "pipedream", "provider_metadata": {...}}`
   - Requires `component_key`, `configured_props`, and `integration_connection_id`
   - `dynamic_props_id` is optional (nullable)
   - Automatically deploys trigger to Pipedream
   - If a trigger is already deployed, it will be removed and redeployed

2. **Other/Custom source**: `{"provider": "other"}`
   - No metadata required for custom webhooks


# OpenAPI definition

````json
{
  "components": {
    "schemas": {
      "TriggersInbound.TriggerAction": {
        "enum": [
          "create_entity",
          "update_entity",
          "upsert_entity"
        ],
        "title": "TriggersInbound.TriggerAction",
        "type": "string",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerAction",
        "x-validate": null
      },
      "TriggersInbound.SetupSourceWithOther": {
        "additionalProperties": false,
        "description": "Setup source with other/custom provider",
        "properties": {
          "provider": {
            "enum": [
              "other"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "provider"
        ],
        "title": "TriggersInbound.SetupSourceWithOther",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SetupSourceWithOther",
        "x-validate": null
      },
      "TriggersInbound.NativePollingSourceMetadata": {
        "additionalProperties": false,
        "description": "Native polling source configuration",
        "properties": {
          "config": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TriggersInbound.NativePollingSourceConfig"
              },
              {
                "$ref": "#/components/schemas/TriggersInbound.NativePollingSourceConfigLegacy"
              }
            ],
            "x-struct": null,
            "x-validate": null
          },
          "integration_id": {
            "description": "Native integration this trigger talks to (e.g. \"affinity\").",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "type": {
            "enum": [
              "polling"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "type",
          "integration_id",
          "config"
        ],
        "title": "TriggersInbound.NativePollingSourceMetadata",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.NativePollingSourceMetadata",
        "x-validate": null
      },
      "TriggersInbound.PipedreamMetadata": {
        "additionalProperties": false,
        "description": "Pipedream provider metadata",
        "properties": {
          "auth_provision_props": {
            "additionalProperties": true,
            "description": "Authentication provision properties",
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "component_key": {
            "description": "Pipedream component key",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "configured_props": {
            "additionalProperties": true,
            "description": "User-configured properties",
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "dynamic_props_id": {
            "description": "Dynamic props ID for editing",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "external_user_id": {
            "description": "External user ID",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "trigger_id": {
            "description": "Pipedream trigger ID",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "trigger_id",
          "external_user_id",
          "component_key"
        ],
        "title": "TriggersInbound.PipedreamMetadata",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.PipedreamMetadata",
        "x-validate": null
      },
      "Common.APIErrorDetails": {
        "description": "Additional structured error context. Shape varies by error code.\n\n- For conflict errors: contains a `conflicts` array with conflicting resources\n- For other errors: may contain arbitrary error-specific context",
        "nullable": true,
        "oneOf": [
          {
            "$ref": "#/components/schemas/Common.ConflictErrorDetails"
          },
          {
            "additionalProperties": true,
            "description": "Generic error details for non-conflict errors",
            "type": "object",
            "x-struct": null,
            "x-validate": null
          }
        ],
        "title": "Common.APIErrorDetails",
        "x-struct": "Elixir.AgiDbWeb.Schemas.Common.APIErrorDetails",
        "x-validate": null
      },
      "TriggersInbound.SetupSourceRequest": {
        "description": "Setup source request. Must specify provider configuration explicitly:\n- `{\"provider\": \"pipedream\", \"provider_metadata\": {...}}` - Pipedream source (will deploy trigger)\n- `{\"provider\": \"other\"}` - Custom webhook source\n- `{\"provider\": \"scheduled\", \"provider_metadata\": {...}}` - Scheduled cron trigger\n- `{\"provider\": \"native\", \"provider_metadata\": {...}}` - Native integration source\n\nFor Pipedream sources, if a trigger is already deployed, it will be removed and redeployed.\nThe trigger is always set to active status after successful setup.\n",
        "oneOf": [
          {
            "$ref": "#/components/schemas/TriggersInbound.SetupSourceWithPipedream"
          },
          {
            "$ref": "#/components/schemas/TriggersInbound.SetupSourceWithOther"
          },
          {
            "$ref": "#/components/schemas/TriggersInbound.SetupSourceWithScheduled"
          },
          {
            "$ref": "#/components/schemas/TriggersInbound.SetupSourceWithNativeWebhook"
          },
          {
            "$ref": "#/components/schemas/TriggersInbound.SetupSourceWithNativePolling"
          }
        ],
        "title": "TriggersInbound.SetupSourceRequest",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SetupSourceRequest",
        "x-validate": null
      },
      "TriggersInbound.TriggerInputMappingProperty": {
        "additionalProperties": false,
        "description": "Input mapping property configuration for extracting values from webhook payload.\n\nEach property can independently use code or LLM for extraction.\n",
        "properties": {
          "extraction_instructions": {
            "description": "Instructions for extracting the property value from the webhook payload.\n\nFor type: json_path - A JSONPath expression that specifies the path to extract from the webhook payload.\nJSONPath is a query language for JSON, similar to XPath for XML. The expression should point to the value(s)\nto extract. If the path matches multiple values, only the first match will be used.\n\nJSONPath syntax examples:\n- `$.user.email` - Extract the email field from a nested user object\n- `$.items[0].name` - Extract the name from the first item in an items array\n- `$.data.price` - Extract the price from a nested data object\n- `$['user-name']` - Extract a field with special characters (use brackets notation)\n\nFor type: code - Python code that:\n- Reads from the `data` variable (the webhook payload)\n- Sets the extracted value to the `result` variable\n- Returns None if the value cannot be extracted\n- The `data` variable is deep-copied for each extraction, so mutations are safe\n- For update/upsert actions on non-primary-key fields: `current_value` variable is available\n  containing the existing entity's current value for this property (None if entity doesn't exist or value wasn't set before)\n\n## Available Variables\n\n- `data`: The webhook payload (dict/object)\n- `current_value`: Current entity value (only for non-primary-key fields in update/upsert)\n- `property`: Target property metadata (dict) always contains:\n  - `name`: Property name (str)\n  - `type`: Property type (str) - \"text\", \"number\", \"select\", \"json\", \"file\", \"url\", etc.\n  - `subtype`: Property subtype (str or None) - \"single_select\", \"multi_select\", etc.\n  - `config`: Property configuration (dict, empty for most types)\n    - For select properties: `options` (list[str]) - available option values\n    - For select properties: `max_selected` (int or None) - maximum selectable options\n\n## Return Format by Property Type\n\n### Text, Number, URL Properties\n```python\n# Return as string or None\nresult = data.get('user_name')  # \"John Doe\"\nresult = data.get('price')      # \"42.5 USD\"\nresult = data.get('url')        # \"https://example.com\"\n```\n\n### JSON Property\n```python\n# Return as dict/list/primitive or None\nresult = data.get('metadata')   # {\"key\": \"value\"}\nresult = data.get('items')      # [1, 2, 3]\n# System will automatically stringify to JSON\n```\n\n### Select Property\n```python\n# Return as list of strings or None\nresult = [\"Option1\", \"Option2\"]\n# For single value: [\"Option1\"]\n# String format also accepted: \"Option1\"\n```\n\n### File Property\n```python\n# Return as dict with file_url or file_base64, or as string URL\nresult = {\"file_url\": \"https://example.com/doc.pdf\", \"file_name\": \"doc.pdf\"}\n# Or simpler: result = \"https://example.com/doc.pdf\"\n```\n\nExamples (code):\n```python\n# Simple field access\nresult = data.get('user_name')\n\n# Nested field access\nresult = data.get('user', {}).get('email')\n\n# Array access\nresult = data.get('items', [])[0].get('id') if data.get('items') else None\n\n# Conditional extraction\nif data.get('status') == 'active':\n    result = data.get('user_id')\nelse:\n    result = None\n\n# Using current_value for updates (only available for non-primary-key fields in update/upsert actions)\n# Preserve existing value if new value is not provided\nresult = data.get('description') if data.get('description') is not None else current_value\n\n# Append to existing value\nnew_tag = data.get('tag')\nif new_tag and current_value:\n    result = f\"{current_value}, {new_tag}\"\nelif new_tag:\n    result = new_tag\nelse:\n    result = current_value\n\n# Using property metadata - fuzzy matching for select properties\n# property = {\"name\": \"Status\", \"type\": \"select\", \"subtype\": \"single_select\",\n#             \"config\": {\"options\": [\"Pending\", \"Approved\", \"Rejected\"]}}\nstatus_input = data.get('status', '').lower()\nif property.get('type') == 'select':\n    # Fuzzy match input to available options (case-insensitive)\n    available_options = property.get('config', {}).get('options', [])\n    for option in available_options:\n        if option.lower() == status_input:\n            result = [option]\n            break\n    else:\n        # No match found\n        result = None\nelse:\n    result = data.get('status')\n\n# Multi-select with max_selected validation\n# property = {\"type\": \"select\", \"subtype\": \"multi_select\",\n#             \"config\": {\"options\": [...], \"max_selected\": 3}}\n# Note: max_selected can be None (no limit)\ntags_input = data.get('tags', [])\nif property.get('type') == 'select':\n    available = property['config']['options']\n    max_opts = property['config']['max_selected']\n\n    # Filter to only valid options\n    valid_tags = [tag for tag in tags_input if tag in available]\n\n    # Respect max_selected limit if set\n    if max_opts and len(valid_tags) > max_opts:\n        valid_tags = valid_tags[:max_opts]\n\n    result = valid_tags if valid_tags else None\n```\n\nFor type: llm - Natural language prompt describing what to extract, e.g.:\n\"Extract the user's email address from the payload\"\n\nFor type: json_path - Examples:\n```\n$.user.email\n$.items[0].id\n$.data.nested.value\n$['field-with-dash']\n```\n",
            "example": "result = data.get('user', {}).get('email')",
            "minLength": 3,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "primary_key": {
            "description": "Whether to use the values of that property to find pre-existing entities for update or upsert operations.\n\nIMPORTANT for update_entity actions:\n- Primary key properties can be non-manual (computed) properties - they're used for matching existing entities only\n- Non-manual primary keys are automatically excluded from the update payload (their values won't be changed)\n- All other properties (non-primary keys and all properties in create_entity/upsert_entity) must be manual\n",
            "type": "boolean",
            "x-struct": null,
            "x-validate": null
          },
          "target_property_id": {
            "$ref": "#/components/schemas/Common.UUID"
          },
          "type": {
            "description": "Extraction method: code (Python), llm (natural language prompt), or json_path (JSONPath expression)",
            "enum": [
              "code",
              "llm",
              "json_path"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "target_property_id",
          "primary_key",
          "type",
          "extraction_instructions"
        ],
        "title": "TriggersInbound.TriggerInputMappingProperty",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerInputMappingProperty",
        "x-validate": null
      },
      "TriggersInbound.ScheduledMetadataResponse": {
        "additionalProperties": false,
        "description": "Scheduled provider metadata (stored format)",
        "properties": {
          "cron_expression": {
            "description": "Cron expression defining the schedule (5-field format: minute hour day month weekday)",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "last_run_at": {
            "description": "Last run time in UTC, null if never run",
            "format": "date-time",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "next_run_at": {
            "description": "Next scheduled run time in UTC",
            "format": "date-time",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "timezone": {
            "description": "IANA timezone name",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "cron_expression",
          "timezone",
          "next_run_at",
          "last_run_at"
        ],
        "title": "TriggersInbound.ScheduledMetadataResponse",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.ScheduledMetadataResponse",
        "x-validate": null
      },
      "TriggersInbound.NativeWebhookSourceMetadata": {
        "additionalProperties": false,
        "description": "Native webhook source configuration",
        "properties": {
          "config": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TriggersInbound.NativeWebhookSourceConfig"
              },
              {
                "$ref": "#/components/schemas/TriggersInbound.NativeWebhookSourceConfigLegacy"
              }
            ],
            "x-struct": null,
            "x-validate": null
          },
          "integration_id": {
            "description": "Native integration this trigger talks to (e.g. \"affinity\").",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "type": {
            "enum": [
              "webhook"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "type",
          "integration_id",
          "config"
        ],
        "title": "TriggersInbound.NativeWebhookSourceMetadata",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.NativeWebhookSourceMetadata",
        "x-validate": null
      },
      "TriggersInbound.TriggerResponse": {
        "additionalProperties": false,
        "description": "An inbound trigger with webhook URL",
        "properties": {
          "backing_project_id": {
            "$ref": "#/components/schemas/Common.UUID"
          },
          "created_at": {
            "$ref": "#/components/schemas/Common.DateTime"
          },
          "deployment_definition": {
            "description": "Last deployed configuration (null if never deployed)",
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/TriggersInbound.TriggerDeploymentDefinition"
              },
              {
                "$ref": "#/components/schemas/TriggersInbound.TriggerSimplifiedDeploymentDefinition"
              }
            ],
            "x-struct": null,
            "x-validate": null
          },
          "id": {
            "$ref": "#/components/schemas/Common.UUID"
          },
          "metadata": {
            "additionalProperties": true,
            "description": "Arbitrary user metadata",
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "name": {
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "provider": {
            "description": "Provider type (set when enabled)",
            "enum": [
              "pipedream",
              "other",
              "scheduled",
              "native"
            ],
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "provider_metadata": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TriggersInbound.PipedreamMetadata"
              },
              {
                "$ref": "#/components/schemas/TriggersInbound.ScheduledMetadataResponse"
              },
              {
                "$ref": "#/components/schemas/TriggersInbound.NativeMetadataResponse"
              },
              {
                "nullable": true,
                "type": "object",
                "x-struct": null,
                "x-validate": null
              }
            ],
            "description": "Provider-specific metadata",
            "nullable": true,
            "x-struct": null,
            "x-validate": null
          },
          "status": {
            "description": "Trigger status: `ready` (WebSocket) or `active` (creates entities)",
            "enum": [
              "ready",
              "active"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "system_property_ids": {
            "description": "System property IDs created during deployment (null if never deployed)",
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/TriggersInbound.SystemPropertyIds.Legacy"
              },
              {
                "$ref": "#/components/schemas/TriggersInbound.SystemPropertyIds.Simplified"
              }
            ],
            "x-struct": null,
            "x-validate": null
          },
          "target_project_id": {
            "$ref": "#/components/schemas/Common.UUID"
          },
          "updated_at": {
            "$ref": "#/components/schemas/Common.DateTime"
          },
          "webhook_url": {
            "description": "Secure webhook URL for receiving data",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "workspace_id": {
            "$ref": "#/components/schemas/Common.UUID"
          }
        },
        "required": [
          "id",
          "workspace_id",
          "backing_project_id",
          "target_project_id",
          "webhook_url",
          "status",
          "created_at",
          "updated_at"
        ],
        "title": "TriggersInbound.TriggerResponse",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerResponse",
        "x-validate": null
      },
      "TriggersInbound.NativeMetadataResponse": {
        "additionalProperties": false,
        "description": "Native provider metadata (stored format)",
        "properties": {
          "config": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TriggersInbound.NativeWebhookConfigResponse"
              },
              {
                "$ref": "#/components/schemas/TriggersInbound.NativePollingConfigResponse"
              }
            ],
            "x-struct": null,
            "x-validate": null
          },
          "integration_connection_id": {
            "description": "Tenant-routed native integration connection used when executing this trigger.",
            "format": "uuid",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "integration_id": {
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "tenant_id": {
            "description": "Entra tenant GUID the trigger is pinned to. When set, the connection is re-routed by tenant at execution time, surviving connection deletion and re-authentication within the same tenant.",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "type": {
            "enum": [
              "webhook",
              "polling"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "type",
          "integration_id",
          "config"
        ],
        "title": "TriggersInbound.NativeMetadataResponse",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.NativeMetadataResponse",
        "x-validate": null
      },
      "TriggersInbound.PipedreamSourceMetadata": {
        "additionalProperties": false,
        "description": "Pipedream source configuration for setup_source endpoint",
        "properties": {
          "component_key": {
            "description": "Pipedream component key",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "configured_props": {
            "additionalProperties": true,
            "description": "User-configured properties",
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "dynamic_props_id": {
            "description": "Dynamic props ID for editing (required but nullable)",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "integration_connection_id": {
            "description": "Integration connection ID for auth resolution",
            "format": "uuid",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "component_key",
          "configured_props",
          "dynamic_props_id",
          "integration_connection_id"
        ],
        "title": "TriggersInbound.PipedreamSourceMetadata",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.PipedreamSourceMetadata",
        "x-validate": null
      },
      "Common.APIError": {
        "additionalProperties": false,
        "properties": {
          "code": {
            "example": "bad_request",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "details": {
            "$ref": "#/components/schemas/Common.APIErrorDetails"
          },
          "message": {
            "example": "Bad Request",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "code",
          "message"
        ],
        "title": "Common.APIError",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.Common.APIError",
        "x-validate": null
      },
      "Common.DateTime": {
        "description": "DateTime in RFC3339 format",
        "example": "2020-01-20T14:00:00Z",
        "format": "date-time",
        "title": "Common.DateTime",
        "type": "string",
        "x-struct": "Elixir.AgiDbWeb.Schemas.Common.DateTime",
        "x-validate": null
      },
      "TriggersInbound.SystemPropertyIds.Simplified": {
        "additionalProperties": false,
        "description": "System property IDs for simplified trigger deployment.\n\n## Architecture Overview\n\nThe simplified deployment creates a property pipeline across three projects:\n\n- **Backing Project**: Receives webhook payloads and contains the row collection\n- **Pipeline Project**: Child project of the collection - processes individual rows\n- **Target Project**: The user's project where entities are created/updated\n\n## Property Flow\n\n```\nBACKING PROJECT              PIPELINE PROJECT              TARGET PROJECT\n═══════════════              ════════════════              ══════════════\nwebhook_payload ──► row_collection ─► row_webhook_payload\n                    (splits payload)         │\n                                       ┌─────┴─────┐\n                                       ▼           ▼\n                                  match_keys  source_actions\n                                  (if matchers) (from source)\n                                       │\n                                       ▼\n                                  linked_targets ───────► target_trigger_source\n                                       │                 (ref to Pipeline)\n                                       ▼\n                                  target_reference_value ► target_match_keys\n                                       │                  (hidden, stores values)\n                                       ▼\n                                    action ──────────────► (creates/updates entity)\nstatus ◄───────────────────────────────┘\n```\n",
        "properties": {
          "action": {
            "description": "Action property that performs create/update/upsert operations on target project entities.\nExecutes after all extraction properties have computed their values.\nFor update/upsert, uses linked_targets to find existing entities.\nLocated in: Pipeline Project.\n",
            "nullable": true,
            "properties": {
              "project_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "property_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "public": {
                "type": "boolean",
                "x-struct": null,
                "x-validate": null
              }
            },
            "required": [
              "property_id",
              "project_id",
              "public"
            ],
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "linked_targets": {
            "description": "Reference property that finds existing target entities by comparing match keys.\nQueries target project entities where target_match_keys match extracted match_keys values.\nReturns matching entity IDs to the action property for update/upsert operations.\nOnly created for update_entity and upsert_entity actions.\nLocated in: Pipeline Project.\n",
            "nullable": true,
            "properties": {
              "project_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "property_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "public": {
                "type": "boolean",
                "x-struct": null,
                "x-validate": null
              }
            },
            "required": [
              "property_id",
              "project_id",
              "public"
            ],
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "match_keys": {
            "description": "Extraction properties that extract matcher values from the webhook payload.\nEach corresponds to a matcher_definition in the deployment configuration.\nValues are wrapped as {\"value\": X} or {\"value\": null} if extraction fails.\nUsed only for update_entity and upsert_entity actions.\nLocated in: Pipeline Project.\n",
            "items": {
              "$ref": "#/components/schemas/TriggersInbound.SystemPropertyIds.PropertyRef"
            },
            "type": "array",
            "x-struct": null,
            "x-validate": null
          },
          "row_collection": {
            "description": "Collection property that splits the webhook payload into rows.\nEach row becomes a child entity in the pipeline project.\nSupports three splitting modes: none (passthrough), code, or LLM.\nLocated in: Backing Project.\n",
            "nullable": true,
            "properties": {
              "project_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "property_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "public": {
                "type": "boolean",
                "x-struct": null,
                "x-validate": null
              }
            },
            "required": [
              "property_id",
              "project_id",
              "public"
            ],
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "row_webhook_payload": {
            "description": "Trigger raw data property for a single row in the pipeline project.\nContains the payload for one row after the row_collection splits the webhook payload.\nFor no-splitter mode, this is the full payload wrapped as a single item.\nLocated in: Pipeline Project (child of row_collection).\n",
            "nullable": true,
            "properties": {
              "project_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "property_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "public": {
                "type": "boolean",
                "x-struct": null,
                "x-validate": null
              }
            },
            "required": [
              "property_id",
              "project_id",
              "public"
            ],
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "source_actions": {
            "description": "Properties deployed from an enriched trigger source's template.\nCreated using the source's import_properties_request when the trigger uses a Pipedream source.\nEach property can extract, transform, or compute values from the webhook payload.\nLocated in: Pipeline Project.\n",
            "items": {
              "$ref": "#/components/schemas/TriggersInbound.SystemPropertyIds.PropertyRef"
            },
            "type": "array",
            "x-struct": null,
            "x-validate": null
          },
          "status": {
            "description": "Status property showing the result of the action execution.\nDisplays success/failure state of entity creation/update operations.\nLocated in: Backing Project.\n",
            "nullable": true,
            "properties": {
              "project_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "property_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "public": {
                "type": "boolean",
                "x-struct": null,
                "x-validate": null
              }
            },
            "required": [
              "property_id",
              "project_id",
              "public"
            ],
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "target_match_keys": {
            "description": "Hidden properties on target entities that store matcher values.\nSet when entities are created/updated via target_reference_value.\nUsed by linked_targets to find existing entities on subsequent webhooks.\nThese properties are automatically removed from all views.\nLocated in: Target Project.\n",
            "items": {
              "$ref": "#/components/schemas/TriggersInbound.SystemPropertyIds.PropertyRef"
            },
            "type": "array",
            "x-struct": null,
            "x-validate": null
          },
          "target_reference_value": {
            "description": "JSON action property that sets values on target entities.\nSets the target_trigger_source reference and target_match_keys values.\nFor append mode, reads existing IDs through linked_targets before appending.\nLocated in: Pipeline Project.\n",
            "nullable": true,
            "properties": {
              "project_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "property_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "public": {
                "type": "boolean",
                "x-struct": null,
                "x-validate": null
              }
            },
            "required": [
              "property_id",
              "project_id",
              "public"
            ],
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "target_trigger_source": {
            "description": "Reference property in the target project pointing back to the pipeline project entity.\nAllows target entities to access the source webhook payload via this reference.\nThis is a public property visible in views.\nLocated in: Target Project.\n",
            "nullable": true,
            "properties": {
              "project_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "property_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "public": {
                "type": "boolean",
                "x-struct": null,
                "x-validate": null
              }
            },
            "required": [
              "property_id",
              "project_id",
              "public"
            ],
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "webhook_payload": {
            "description": "Raw webhook payload property in the backing project.\nReceives the full JSON payload from incoming webhook requests.\nLocated in: Backing Project.\n",
            "properties": {
              "project_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "property_id": {
                "$ref": "#/components/schemas/Common.UUID"
              },
              "public": {
                "type": "boolean",
                "x-struct": null,
                "x-validate": null
              }
            },
            "required": [
              "property_id",
              "project_id",
              "public"
            ],
            "type": "object",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "webhook_payload"
        ],
        "title": "TriggersInbound.SystemPropertyIds.Simplified",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SystemPropertyIds.Simplified",
        "x-validate": null
      },
      "TriggersInbound.SetupSourceWithNativePolling": {
        "additionalProperties": false,
        "description": "Setup source with a native integration polling trigger",
        "properties": {
          "provider": {
            "enum": [
              "native"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "provider_metadata": {
            "$ref": "#/components/schemas/TriggersInbound.NativePollingSourceMetadata"
          }
        },
        "required": [
          "provider",
          "provider_metadata"
        ],
        "title": "TriggersInbound.SetupSourceWithNativePolling",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SetupSourceWithNativePolling",
        "x-validate": null
      },
      "Common.ConflictErrorDetails": {
        "additionalProperties": false,
        "description": "Details for conflict errors",
        "properties": {
          "conflicts": {
            "description": "List of conflicting resources",
            "items": {
              "additionalProperties": true,
              "type": "object",
              "x-struct": null,
              "x-validate": null
            },
            "type": "array",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "conflicts"
        ],
        "title": "Common.ConflictErrorDetails",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.Common.ConflictErrorDetails",
        "x-validate": null
      },
      "TriggersInbound.TriggerRowSplitter.None": {
        "additionalProperties": false,
        "description": "None row splitter - process entire webhook payload as single row",
        "properties": {
          "type": {
            "enum": [
              "none"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "type"
        ],
        "title": "TriggersInbound.TriggerRowSplitter.None",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerRowSplitter.None",
        "x-validate": null
      },
      "TriggersInbound.TriggerRowSplitter.WithInstructions": {
        "additionalProperties": false,
        "description": "Row splitter with instructions - split webhook payload into multiple rows using code or LLM.\n\nFor code type: Python code that reads from `data` (the webhook payload) and assigns to `result` an array of payloads.\nEach item in the result array represents one row and should be a dictionary/object with the same structure as the original payload.\n\nFor llm type: Natural language prompt describing how to split the payload.\n",
        "properties": {
          "instructions": {
            "description": "For type: code - Python code that:\n- Reads from the `data` variable (the webhook payload)\n- Sets `result` to a list of dictionaries (one per row)\n- Each dictionary should have the same structure as the original payload\n- Returns empty list if no rows should be created\n\nIMPORTANT: Keep the payload structure identical to the original. This allows you to add or remove\nthe row splitter later without updating downstream property extraction code. Copy shared data\n(like metadata, timestamps, etc.) into each row, and only vary the row-specific data.\n\nExample (code) - Splitting spreadsheet cell updates into separate rows:\n```python\n# Input payload structure:\n# {\n#   \"updates\": [\n#     {\"cell\": \"A1\", \"value\": \"John\", \"sheet\": \"Contacts\"},\n#     {\"cell\": \"A2\", \"value\": \"Jane\", \"sheet\": \"Contacts\"}\n#   ],\n#   \"spreadsheet\": {\"id\": \"abc123\", \"name\": \"CRM Data\"},\n#   \"timestamp\": \"2024-01-15T10:30:00Z\"\n# }\n\nresult = []\nfor update in data.get('updates', []):\n    # Create a row with the same structure, varying only the update-specific data\n    row = {\n        'updates': [update],  # Single update per row\n        'spreadsheet': data.get('spreadsheet'),  # Copy shared metadata\n        'timestamp': data.get('timestamp')  # Copy shared timestamp\n    }\n    result.append(row)\n\n# Result: Each row maintains the original structure, downstream extraction code\n# like \"result = data.get('updates', [])[0].get('value')\" works with or without splitter\n```\n\nExample (code) - Simple array splitting:\n```python\n# If payload is just an array of items\nresult = data.get('items', [])\n```\n\nFor type: llm - Natural language prompt describing how to split the payload, e.g.:\n\"Split the payload into separate rows, one for each update in the 'updates' array\"\n",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "type": {
            "enum": [
              "code",
              "llm"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "type",
          "instructions"
        ],
        "title": "TriggersInbound.TriggerRowSplitter.WithInstructions",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerRowSplitter.WithInstructions",
        "x-validate": null
      },
      "TriggersInbound.ScheduledSourceMetadata": {
        "additionalProperties": false,
        "description": "Scheduled source configuration with cron expression",
        "properties": {
          "cron_expression": {
            "description": "Cron expression defining the schedule (5-field format: minute hour day month weekday), e.g. \"0 9 * * MON-FRI\"",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "timezone": {
            "default": "Etc/UTC",
            "description": "IANA timezone name, e.g. \"America/New_York\". Defaults to \"Etc/UTC\".",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "cron_expression"
        ],
        "title": "TriggersInbound.ScheduledSourceMetadata",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.ScheduledSourceMetadata",
        "x-validate": null
      },
      "TriggersInbound.NativeWebhookConfigResponse": {
        "additionalProperties": false,
        "description": "Stored webhook configuration for a native trigger. Mirrors the input\n`NativeWebhookSourceConfig` and adds substrate-only fields populated by\nthe webhook registrar during `setup_source`.\n",
        "properties": {
          "client_state": {
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "cursor": {
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "external_subscription_id": {
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "fetch_skill_id": {
            "format": "uuid",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_args": {
            "additionalProperties": true,
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "subscription_expires_at": {
            "format": "date-time",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "fetch_skill_id",
          "polling_skill_args"
        ],
        "title": "TriggersInbound.NativeWebhookConfigResponse",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.NativeWebhookConfigResponse",
        "x-validate": null
      },
      "TriggersInbound.SystemPropertyIds.Legacy": {
        "additionalProperties": false,
        "description": "Legacy system property IDs (simple UUIDs)",
        "properties": {
          "action": {
            "format": "uuid",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "id_mapping": {
            "format": "uuid",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "reference": {
            "format": "uuid",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "row_collection": {
            "format": "uuid",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "row_webhook_payload": {
            "format": "uuid",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "status": {
            "format": "uuid",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "value_extractions": {
            "description": "Extraction properties mapping target properties to extraction properties",
            "items": {
              "$ref": "#/components/schemas/TriggersInbound.SystemPropertyIds.ExtractionPropertyMapping"
            },
            "type": "array",
            "x-struct": null,
            "x-validate": null
          },
          "webhook_payload": {
            "$ref": "#/components/schemas/Common.UUID"
          }
        },
        "required": [
          "webhook_payload",
          "value_extractions"
        ],
        "title": "TriggersInbound.SystemPropertyIds.Legacy",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SystemPropertyIds.Legacy",
        "x-validate": null
      },
      "TriggersInbound.SetupSourceWithNativeWebhook": {
        "additionalProperties": false,
        "description": "Setup source with a native integration webhook trigger",
        "properties": {
          "provider": {
            "enum": [
              "native"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "provider_metadata": {
            "$ref": "#/components/schemas/TriggersInbound.NativeWebhookSourceMetadata"
          }
        },
        "required": [
          "provider",
          "provider_metadata"
        ],
        "title": "TriggersInbound.SetupSourceWithNativeWebhook",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SetupSourceWithNativeWebhook",
        "x-validate": null
      },
      "TriggersInbound.SystemPropertyIds.PropertyRef": {
        "additionalProperties": false,
        "description": "Property reference with metadata",
        "properties": {
          "project_id": {
            "$ref": "#/components/schemas/Common.UUID"
          },
          "property_id": {
            "$ref": "#/components/schemas/Common.UUID"
          },
          "public": {
            "description": "Whether this property is publicly accessible",
            "type": "boolean",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "property_id",
          "project_id",
          "public"
        ],
        "title": "TriggersInbound.SystemPropertyIds.PropertyRef",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SystemPropertyIds.PropertyRef",
        "x-validate": null
      },
      "TriggersInbound.SetupSourceWithPipedream": {
        "additionalProperties": false,
        "description": "Setup source with Pipedream provider",
        "properties": {
          "provider": {
            "enum": [
              "pipedream"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "provider_metadata": {
            "$ref": "#/components/schemas/TriggersInbound.PipedreamSourceMetadata"
          }
        },
        "required": [
          "provider",
          "provider_metadata"
        ],
        "title": "TriggersInbound.SetupSourceWithPipedream",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SetupSourceWithPipedream",
        "x-validate": null
      },
      "TriggersInbound.TriggerDeploymentDefinition": {
        "additionalProperties": false,
        "description": "Trigger deployment definition",
        "properties": {
          "property_mappings": {
            "description": "List of property mappings for extraction",
            "items": {
              "$ref": "#/components/schemas/TriggersInbound.TriggerInputMappingProperty"
            },
            "type": "array",
            "x-struct": null,
            "x-validate": null
          },
          "row_splitter": {
            "$ref": "#/components/schemas/TriggersInbound.TriggerRowSplitter"
          },
          "target_action": {
            "$ref": "#/components/schemas/TriggersInbound.TriggerAction"
          }
        },
        "required": [
          "target_action",
          "property_mappings",
          "row_splitter"
        ],
        "title": "TriggersInbound.TriggerDeploymentDefinition",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerDeploymentDefinition",
        "x-validate": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerDeploymentDefinitionValidator"
      },
      "TriggersInbound.SystemPropertyIds.ExtractionPropertyMapping": {
        "additionalProperties": false,
        "description": "Mapping of target property ID to extraction property ID",
        "properties": {
          "extraction_property_id": {
            "$ref": "#/components/schemas/Common.UUID"
          },
          "target_property_id": {
            "$ref": "#/components/schemas/Common.UUID"
          }
        },
        "required": [
          "target_property_id",
          "extraction_property_id"
        ],
        "title": "TriggersInbound.SystemPropertyIds.ExtractionPropertyMapping",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SystemPropertyIds.ExtractionPropertyMapping",
        "x-validate": null
      },
      "TriggersInbound.TriggerRowSplitter": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/TriggersInbound.TriggerRowSplitter.Default"
          },
          {
            "$ref": "#/components/schemas/TriggersInbound.TriggerRowSplitter.None"
          },
          {
            "$ref": "#/components/schemas/TriggersInbound.TriggerRowSplitter.WithInstructions"
          }
        ],
        "title": "TriggersInbound.TriggerRowSplitter",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerRowSplitter",
        "x-validate": null
      },
      "TriggersInbound.SetupSourceWithScheduled": {
        "additionalProperties": false,
        "description": "Setup source with scheduled/cron provider",
        "properties": {
          "provider": {
            "enum": [
              "scheduled"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "provider_metadata": {
            "$ref": "#/components/schemas/TriggersInbound.ScheduledSourceMetadata"
          }
        },
        "required": [
          "provider",
          "provider_metadata"
        ],
        "title": "TriggersInbound.SetupSourceWithScheduled",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.SetupSourceWithScheduled",
        "x-validate": null
      },
      "TriggersInbound.TriggerSimplifiedDeploymentDefinition.MatcherDefinition": {
        "additionalProperties": false,
        "description": "Matcher definition for identifying existing entities in update/upsert actions.\n\nMatchers extract values from the webhook payload and compare them against stored values\non target entities to find matches. When a match is found, the entity is updated instead\nof creating a new one.\n\nMultiple matchers are combined with AND logic - all matchers must match for an entity to be found.\nIf a matcher extracts `null` (value not found in payload), that matcher is skipped during matching.\nIf ALL matchers extract `null`, no entity will be matched.\n",
        "properties": {
          "extraction_instructions": {
            "description": "Instructions for extracting the matcher value from the webhook payload.\n\n## For type: json_path\n\nA JSONPath expression that specifies the path to extract from the webhook payload.\nJSONPath is a query language for JSON, similar to XPath for XML. If the path matches\nmultiple values, only the first match will be used.\n\nJSONPath syntax examples:\n- `$.order_id` - Extract the order_id field from root\n- `$.user.email` - Extract the email from a nested user object\n- `$.items[0].id` - Extract the id from the first item in an array\n- `$.data.customer.id` - Extract deeply nested value\n- `$['field-with-dash']` - Extract a field with special characters (use brackets notation)\n\n## For type: code\n\nPython code that extracts a value from the webhook payload.\n\n### Available Variables\n\n- `data`: The webhook payload (dict/object) - a deep copy, so mutations are safe\n\n### How to Extract\n\nSet the `result` variable to the extracted value. The system automatically wraps your\nresult - you just need to extract the raw value:\n\n```python\n# Simple field access\nresult = data.get('order_id')\n\n# Nested field access\nresult = data.get('customer', {}).get('id')\n\n# Array access with safety\nitems = data.get('items', [])\nresult = items[0].get('sku') if items else None\n\n# Conditional extraction\nif data.get('type') == 'order':\n    result = data.get('order_number')\nelse:\n    result = data.get('reference_id')\n\n# Combining multiple fields\nfirst = data.get('first_name', '')\nlast = data.get('last_name', '')\nresult = f\"{first} {last}\".strip() if (first or last) else None\n\n# Extract from nested arrays\nresult = None\nfor item in data.get('line_items', []):\n    if item.get('primary'):\n        result = item.get('product_id')\n        break\n```\n\nIf `result` is `None` or not set, the matcher is skipped during entity matching.\n\n## For type: llm\n\nNatural language prompt describing what value to extract from the payload.\nThe AI will analyze the payload structure and extract the requested value.\n\nExamples:\n- \"Extract the customer's unique identifier\"\n- \"Find the order reference number\"\n- \"Get the primary email address from the contact information\"\n- \"Extract the transaction ID or reference code\"\n",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "type": {
            "description": "Extraction method:\n- `json_path`: JSONPath expression for direct value extraction\n- `code`: Python code for complex extraction logic\n- `llm`: Natural language description for AI-powered extraction\n",
            "enum": [
              "code",
              "llm",
              "json_path"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "type",
          "extraction_instructions"
        ],
        "title": "TriggersInbound.TriggerSimplifiedDeploymentDefinition.MatcherDefinition",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerSimplifiedDeploymentDefinition.MatcherDefinition",
        "x-validate": null
      },
      "TriggersInbound.TriggerRowSplitter.Default": {
        "additionalProperties": false,
        "description": "Default row splitter - uses TriggerSource splitter if available, otherwise no splitting",
        "properties": {
          "type": {
            "enum": [
              "default"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "type"
        ],
        "title": "TriggersInbound.TriggerRowSplitter.Default",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerRowSplitter.Default",
        "x-validate": null
      },
      "TriggersInbound.NativePollingSourceConfig": {
        "additionalProperties": false,
        "description": "Polling configuration for a native trigger",
        "properties": {
          "cursor": {
            "description": "Optional initial cursor handed to the skill on first run.",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "fetch_skill_id": {
            "description": "ID of the skill V7 invokes on a cron to fetch new payloads.",
            "format": "uuid",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "poll_interval_seconds": {
            "default": 60,
            "description": "Cadence in seconds. Defaults to 60 if omitted.",
            "minimum": 1,
            "type": "integer",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_args": {
            "additionalProperties": true,
            "default": {},
            "description": "Arguments passed to the polling skill on each run.",
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_id": {
            "deprecated": true,
            "description": "Deprecated alias for `fetch_skill_id`; accepted for backwards compatibility.",
            "format": "uuid",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "fetch_skill_id"
        ],
        "title": "TriggersInbound.NativePollingSourceConfig",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.NativePollingSourceConfig",
        "x-validate": null
      },
      "TriggersInbound.TriggerSimplifiedDeploymentDefinition": {
        "additionalProperties": false,
        "description": "Simplified trigger deployment definition.\n\nThis deployment type creates entities in the target project with a reference back to\nthe webhook payload in the backing project. No field-by-field extraction is performed -\nthe entire payload is accessible via the reference.\n\n## Actions\n\n- `create_entity`: Always creates new entities. Matchers are NOT allowed.\n- `update_entity`: Updates existing entities matched by matchers. If no match found, skips.\n  At least one matcher is REQUIRED.\n- `upsert_entity`: Updates if match found, creates if not.\n  At least one matcher is REQUIRED.\n\n## Matching Behavior\n\nFor update/upsert actions, matchers extract values from the webhook payload and compare\nthem against stored values on target entities. The extracted values are also stored on\ntarget entities (in hidden properties) so future payloads can match against them.\n\nIf a matcher extracts `null` (value not found in payload), that matcher is skipped\nfor matching purposes. If ALL matchers extract `null`, no entity will be matched\n(for update_entity this means the payload is skipped; for upsert_entity, a new entity\nis created without matcher values).\n\n## Update Methods\n\n- `replace`: Each webhook payload replaces any previous reference (default)\n- `append`: Webhook references are appended to existing ones (entity tracks all source payloads)\n",
        "properties": {
          "matcher_definitions": {
            "description": "List of matcher definitions for identifying existing entities.\n\nRequired for `update_entity` and `upsert_entity` actions (at least one matcher).\nMust be empty or omitted for `create_entity` action.\n\nMultiple matchers are combined with AND logic - all must match for an entity to be found.\n",
            "items": {
              "$ref": "#/components/schemas/TriggersInbound.TriggerSimplifiedDeploymentDefinition.MatcherDefinition"
            },
            "type": "array",
            "x-struct": null,
            "x-validate": null
          },
          "row_splitter": {
            "$ref": "#/components/schemas/TriggersInbound.TriggerRowSplitter"
          },
          "target_action": {
            "description": "Action to perform on target entities:\n- `create_entity`: Always create new entity (matchers NOT allowed)\n- `update_entity`: Update existing entity found by matchers (matchers REQUIRED, skips if no match)\n- `upsert_entity`: Update if found, create if not (matchers REQUIRED)\n",
            "enum": [
              "create_entity",
              "update_entity",
              "upsert_entity"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "update_method": {
            "default": "replace",
            "description": "How to handle references when updating existing entities:\n- `replace`: New payload reference replaces any existing reference\n- `append`: New payload reference is appended to existing references\n",
            "enum": [
              "replace",
              "append"
            ],
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "target_action",
          "matcher_definitions",
          "row_splitter"
        ],
        "title": "TriggersInbound.TriggerSimplifiedDeploymentDefinition",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.TriggerSimplifiedDeploymentDefinition",
        "x-validate": null
      },
      "TriggersInbound.NativeWebhookSourceConfig": {
        "additionalProperties": false,
        "description": "Webhook configuration for a native trigger.\n\nMirrors `NativePollingSourceConfig` so `:delta_fetch` integrations stay on\na single shape across delivery transports. The `fetch_skill_id` is run by\nthe webhook controller after each provider notification.\n",
        "properties": {
          "cursor": {
            "description": "Optional warm-start delta cursor handed to the skill on the first webhook notification.",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "fetch_skill_id": {
            "description": "ID of the skill V7 invokes after each webhook notification (same skill the polling cron uses).",
            "format": "uuid",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_args": {
            "additionalProperties": true,
            "default": {},
            "description": "Arguments passed to the fetch skill on each notification. The webhook registrar skill also derives the provider-side resource path (e.g. `sites/{site_id}/drives/{drive_id}/root`) from these.",
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_id": {
            "deprecated": true,
            "description": "Deprecated alias for `fetch_skill_id`; accepted for backwards compatibility.",
            "format": "uuid",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "fetch_skill_id"
        ],
        "title": "TriggersInbound.NativeWebhookSourceConfig",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.NativeWebhookSourceConfig",
        "x-validate": null
      },
      "TriggersInbound.NativeWebhookSourceConfigLegacy": {
        "additionalProperties": false,
        "description": "Legacy webhook configuration for a native trigger.",
        "properties": {
          "cursor": {
            "description": "Optional warm-start delta cursor handed to the skill on the first webhook notification.",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_args": {
            "additionalProperties": true,
            "default": {},
            "description": "Arguments passed to the fetch skill on each notification. The webhook registrar skill also derives the provider-side resource path (e.g. `sites/{site_id}/drives/{drive_id}/root`) from these.",
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_id": {
            "deprecated": true,
            "description": "Deprecated alias for `fetch_skill_id`; accepted for backwards compatibility.",
            "format": "uuid",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "polling_skill_id"
        ],
        "title": "TriggersInbound.NativeWebhookSourceConfigLegacy",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.NativeWebhookSourceConfigLegacy",
        "x-validate": null
      },
      "TriggersInbound.NativePollingConfigResponse": {
        "additionalProperties": false,
        "description": "Stored polling configuration for a native trigger",
        "properties": {
          "cursor": {
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "fetch_skill_id": {
            "format": "uuid",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "last_polled_at": {
            "format": "date-time",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "next_poll_at": {
            "format": "date-time",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "poll_interval_seconds": {
            "type": "integer",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_args": {
            "additionalProperties": true,
            "type": "object",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "fetch_skill_id",
          "polling_skill_args",
          "poll_interval_seconds",
          "last_polled_at",
          "next_poll_at"
        ],
        "title": "TriggersInbound.NativePollingConfigResponse",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.NativePollingConfigResponse",
        "x-validate": null
      },
      "Common.UUID": {
        "example": "e23ff3f3-8f77-4e78-9e81-fdb25abfb781",
        "format": "uuid",
        "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
        "title": "Common.UUID",
        "type": "string",
        "x-struct": null,
        "x-validate": null
      },
      "TriggersInbound.NativePollingSourceConfigLegacy": {
        "additionalProperties": false,
        "description": "Legacy polling configuration for a native trigger",
        "properties": {
          "cursor": {
            "description": "Optional initial cursor handed to the skill on first run.",
            "nullable": true,
            "type": "string",
            "x-struct": null,
            "x-validate": null
          },
          "poll_interval_seconds": {
            "default": 60,
            "description": "Cadence in seconds. Defaults to 60 if omitted.",
            "minimum": 1,
            "type": "integer",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_args": {
            "additionalProperties": true,
            "default": {},
            "description": "Arguments passed to the polling skill on each run.",
            "type": "object",
            "x-struct": null,
            "x-validate": null
          },
          "polling_skill_id": {
            "deprecated": true,
            "description": "Deprecated alias for `fetch_skill_id`; accepted for backwards compatibility.",
            "format": "uuid",
            "type": "string",
            "x-struct": null,
            "x-validate": null
          }
        },
        "required": [
          "polling_skill_id"
        ],
        "title": "TriggersInbound.NativePollingSourceConfigLegacy",
        "type": "object",
        "x-struct": "Elixir.AgiDbWeb.Schemas.TriggersInbound.NativePollingSourceConfigLegacy",
        "x-validate": null
      }
    },
    "securitySchemes": {
      "ApiKeyAuth": {
        "in": "header",
        "name": "X-API-KEY",
        "type": "apiKey"
      },
      "BearerAuth": {
        "scheme": "bearer",
        "type": "http"
      }
    }
  },
  "info": {
    "title": "V7 Go API",
    "version": "0.1.0"
  },
  "openapi": "3.0.0",
  "paths": {
    "/api/workspaces/{workspace_id}/projects/{project_id}/triggers/inbound/{inbound_trigger_id}/source": {
      "post": {
        "callbacks": {},
        "description": "Sets up the trigger source (provider configuration) and activates the trigger.\n\nWhen enabled, webhooks create entities in the backing project automatically.\n\n## Provider Configuration Options\n\n1. **Pipedream source**: `{\"provider\": \"pipedream\", \"provider_metadata\": {...}}`\n   - Requires `component_key`, `configured_props`, and `integration_connection_id`\n   - `dynamic_props_id` is optional (nullable)\n   - Automatically deploys trigger to Pipedream\n   - If a trigger is already deployed, it will be removed and redeployed\n\n2. **Other/Custom source**: `{\"provider\": \"other\"}`\n   - No metadata required for custom webhooks\n",
        "operationId": "inbound-trigger-setup-source",
        "parameters": [
          {
            "description": "",
            "in": "path",
            "name": "workspace_id",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.UUID"
            }
          },
          {
            "description": "",
            "in": "path",
            "name": "project_id",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.UUID"
            }
          },
          {
            "description": "",
            "in": "path",
            "name": "inbound_trigger_id",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggersInbound.SetupSourceRequest"
              }
            }
          },
          "description": "TriggersInbound.SetupSourceRequest",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TriggersInbound.TriggerResponse"
                }
              }
            },
            "description": "TriggersInbound.TriggerResponse"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.APIError"
                }
              }
            },
            "description": "Common.APIError"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.APIError"
                }
              }
            },
            "description": "Common.APIError"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.APIError"
                }
              }
            },
            "description": "Common.APIError"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.APIError"
                }
              }
            },
            "description": "Common.APIError"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.APIError"
                }
              }
            },
            "description": "Common.APIError"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.APIError"
                }
              }
            },
            "description": "Common.APIError"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.APIError"
                }
              }
            },
            "description": "Common.APIError"
          }
        },
        "summary": "Setup trigger source",
        "tags": [
          "TriggersInbound"
        ]
      }
    }
  },
  "security": [
    {
      "BearerAuth": []
    },
    {
      "ApiKeyAuth": []
    }
  ],
  "servers": [
    {
      "description": "EU",
      "url": "https://go.v7labs.com",
      "variables": {}
    },
    {
      "description": "US",
      "url": "https://go.us.v7labs.com",
      "variables": {}
    },
    {
      "description": "UAE",
      "url": "https://go.uae.v7labs.com",
      "variables": {}
    }
  ]
}
````