{
  "schemaVersion": "aip-docs/twenty-capabilities/v1",
  "reviewedSourceRevision": "97be86e9efedf07ecf1783b03800f683f107fb04",
  "upstreamRevision": "96a24563674313a3071d359bfccaf33d5e130ab8",
  "connectorId": "twenty",
  "connectorProfile": "aip.connector.twenty.v1",
  "capabilityPrefix": "cap:twenty:",
  "generatedFrom": [
    "crates/aip-connector-twenty/src/lib.rs"
  ],
  "operationCount": 22,
  "familyCounts": {
    "record-query-and-aggregation": 4,
    "record-create-update-and-batch-upsert": 4,
    "record-delete-restore-and-merge": 7,
    "workspace-metadata": 5,
    "openapi-documents": 2
  },
  "methodCounts": {
    "GET": 7,
    "POST": 4,
    "PATCH": 6,
    "DELETE": 5
  },
  "kindCounts": {
    "tool": 20,
    "resource": 2
  },
  "riskCounts": {
    "low": 8,
    "high": 9,
    "critical": 5
  },
  "readCount": 8,
  "mutationCount": 14,
  "approvalCount": 14,
  "idempotencyRequiredCount": 14,
  "retrySupportedCount": 11,
  "contractDefaults": {
    "approvalTtlMs": 900000,
    "approvalEvidence": [
      "reason",
      "input_snapshot",
      "policy_decision"
    ],
    "idempotencyTtlMs": 604800000,
    "idempotencyKeyScope": "external_account",
    "collisionBehavior": "revalidate_input_hash",
    "execution": {
      "sync": true,
      "async": false,
      "streaming": false,
      "cancellation": false
    },
    "dataSensitivity": "confidential",
    "containsPii": true,
    "redactionRequired": true,
    "mutationCompensation": "rollback_not_supported"
  },
  "capabilities": [
    {
      "index": 1,
      "capabilityId": "cap:twenty:record.list",
      "operation": "record.list",
      "family": "record-query-and-aggregation",
      "providerMethod": "GET",
      "providerPathTemplate": "/rest/{object}",
      "kind": "tool",
      "risk": "low",
      "mutation": false,
      "requiresApproval": false,
      "idempotency": {
        "requirement": "optional",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe"
      },
      "input": "object; optional limit, order_by, depth, filter, starting_after, ending_before",
      "sideEffects": [
        "external_network",
        "read"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": null
    },
    {
      "index": 2,
      "capabilityId": "cap:twenty:record.get",
      "operation": "record.get",
      "family": "record-query-and-aggregation",
      "providerMethod": "GET",
      "providerPathTemplate": "/rest/{object}/{id}",
      "kind": "tool",
      "risk": "low",
      "mutation": false,
      "requiresApproval": false,
      "idempotency": {
        "requirement": "optional",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe"
      },
      "input": "object and RFC 4122 id; optional depth",
      "sideEffects": [
        "external_network",
        "read"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": null
    },
    {
      "index": 3,
      "capabilityId": "cap:twenty:record.find_duplicates",
      "operation": "record.find_duplicates",
      "family": "record-query-and-aggregation",
      "providerMethod": "POST",
      "providerPathTemplate": "/rest/{object}/duplicates",
      "kind": "tool",
      "risk": "low",
      "mutation": false,
      "requiresApproval": false,
      "idempotency": {
        "requirement": "optional",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe"
      },
      "input": "object and exactly one of 1..200 data objects or 1..200 ids; optional depth",
      "sideEffects": [
        "external_network",
        "read"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": null
    },
    {
      "index": 4,
      "capabilityId": "cap:twenty:record.group_by",
      "operation": "record.group_by",
      "family": "record-query-and-aggregation",
      "providerMethod": "GET",
      "providerPathTemplate": "/rest/{object}/groupBy",
      "kind": "tool",
      "risk": "low",
      "mutation": false,
      "requiresApproval": false,
      "idempotency": {
        "requirement": "optional",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe"
      },
      "input": "object; optional aggregation, grouping, filter, order, view, and sample query",
      "sideEffects": [
        "external_network",
        "read"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": null
    },
    {
      "index": 5,
      "capabilityId": "cap:twenty:record.create",
      "operation": "record.create",
      "family": "record-create-update-and-batch-upsert",
      "providerMethod": "POST",
      "providerPathTemplate": "/rest/{object}?upsert=true",
      "kind": "tool",
      "risk": "high",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe_with_idempotency_key"
      },
      "input": "object and record body; connector injects deterministic id when absent",
      "sideEffects": [
        "external_network",
        "write"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 6,
      "capabilityId": "cap:twenty:record.create_many",
      "operation": "record.create_many",
      "family": "record-create-update-and-batch-upsert",
      "providerMethod": "POST",
      "providerPathTemplate": "/rest/batch/{object}?upsert=true",
      "kind": "tool",
      "risk": "high",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe_with_idempotency_key"
      },
      "input": "object and 1..200 record bodies; connector injects deterministic ids when absent",
      "sideEffects": [
        "external_network",
        "write"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 7,
      "capabilityId": "cap:twenty:record.update",
      "operation": "record.update",
      "family": "record-create-update-and-batch-upsert",
      "providerMethod": "PATCH",
      "providerPathTemplate": "/rest/{object}/{id}",
      "kind": "tool",
      "risk": "high",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe_with_idempotency_key"
      },
      "input": "object, RFC 4122 id, record body, and optional depth",
      "sideEffects": [
        "external_network",
        "write"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 8,
      "capabilityId": "cap:twenty:record.update_many",
      "operation": "record.update_many",
      "family": "record-create-update-and-batch-upsert",
      "providerMethod": "PATCH",
      "providerPathTemplate": "/rest/{object}?filter=...",
      "kind": "tool",
      "risk": "high",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "object, non-empty filter query, record body, and optional depth",
      "sideEffects": [
        "external_network",
        "write"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 9,
      "capabilityId": "cap:twenty:record.soft_delete",
      "operation": "record.soft_delete",
      "family": "record-delete-restore-and-merge",
      "providerMethod": "DELETE",
      "providerPathTemplate": "/rest/{object}/{id}?soft_delete=true",
      "kind": "tool",
      "risk": "high",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "object and RFC 4122 id",
      "sideEffects": [
        "external_network",
        "delete"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 10,
      "capabilityId": "cap:twenty:record.soft_delete_many",
      "operation": "record.soft_delete_many",
      "family": "record-delete-restore-and-merge",
      "providerMethod": "DELETE",
      "providerPathTemplate": "/rest/{object}?filter=...&soft_delete=true",
      "kind": "tool",
      "risk": "high",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "object and non-empty filter query",
      "sideEffects": [
        "external_network",
        "delete"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 11,
      "capabilityId": "cap:twenty:record.destroy",
      "operation": "record.destroy",
      "family": "record-delete-restore-and-merge",
      "providerMethod": "DELETE",
      "providerPathTemplate": "/rest/{object}/{id}?soft_delete=false",
      "kind": "tool",
      "risk": "critical",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "object and RFC 4122 id",
      "sideEffects": [
        "external_network",
        "delete"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 12,
      "capabilityId": "cap:twenty:record.destroy_many",
      "operation": "record.destroy_many",
      "family": "record-delete-restore-and-merge",
      "providerMethod": "DELETE",
      "providerPathTemplate": "/rest/{object}?filter=...&soft_delete=false",
      "kind": "tool",
      "risk": "critical",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "object and non-empty filter query",
      "sideEffects": [
        "external_network",
        "delete"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 13,
      "capabilityId": "cap:twenty:record.restore",
      "operation": "record.restore",
      "family": "record-delete-restore-and-merge",
      "providerMethod": "PATCH",
      "providerPathTemplate": "/rest/restore/{object}?filter=id[eq]:{id}",
      "kind": "tool",
      "risk": "high",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "object and RFC 4122 id; connector uses filtered collection route",
      "sideEffects": [
        "external_network",
        "write"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 14,
      "capabilityId": "cap:twenty:record.restore_many",
      "operation": "record.restore_many",
      "family": "record-delete-restore-and-merge",
      "providerMethod": "PATCH",
      "providerPathTemplate": "/rest/restore/{object}?filter=...",
      "kind": "tool",
      "risk": "high",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "object, non-empty filter query, and optional depth",
      "sideEffects": [
        "external_network",
        "write"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 15,
      "capabilityId": "cap:twenty:record.merge",
      "operation": "record.merge",
      "family": "record-delete-restore-and-merge",
      "providerMethod": "PATCH",
      "providerPathTemplate": "/rest/{object}/merge",
      "kind": "tool",
      "risk": "high",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "object, 2..9 unique ids, conflictPriorityIndex, and optional dryRun",
      "sideEffects": [
        "external_network",
        "write"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 16,
      "capabilityId": "cap:twenty:metadata.list",
      "operation": "metadata.list",
      "family": "workspace-metadata",
      "providerMethod": "GET",
      "providerPathTemplate": "/rest/metadata/{resource}",
      "kind": "tool",
      "risk": "low",
      "mutation": false,
      "requiresApproval": false,
      "idempotency": {
        "requirement": "optional",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe"
      },
      "input": "resource and resource-specific optional or required query",
      "sideEffects": [
        "external_network",
        "read"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": null
    },
    {
      "index": 17,
      "capabilityId": "cap:twenty:metadata.get",
      "operation": "metadata.get",
      "family": "workspace-metadata",
      "providerMethod": "GET",
      "providerPathTemplate": "/rest/metadata/{resource}/{id}",
      "kind": "tool",
      "risk": "low",
      "mutation": false,
      "requiresApproval": false,
      "idempotency": {
        "requirement": "optional",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe"
      },
      "input": "resource and RFC 4122 id",
      "sideEffects": [
        "external_network",
        "read"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": null
    },
    {
      "index": 18,
      "capabilityId": "cap:twenty:metadata.create",
      "operation": "metadata.create",
      "family": "workspace-metadata",
      "providerMethod": "POST",
      "providerPathTemplate": "/rest/metadata/{resource}",
      "kind": "tool",
      "risk": "critical",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "resource and metadata body; webhook secret is host-injected",
      "sideEffects": [
        "external_network",
        "write"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 19,
      "capabilityId": "cap:twenty:metadata.update",
      "operation": "metadata.update",
      "family": "workspace-metadata",
      "providerMethod": "PATCH",
      "providerPathTemplate": "/rest/metadata/{resource}/{id}",
      "kind": "tool",
      "risk": "critical",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "resource, RFC 4122 id, and metadata body",
      "sideEffects": [
        "external_network",
        "write"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 20,
      "capabilityId": "cap:twenty:metadata.delete",
      "operation": "metadata.delete",
      "family": "workspace-metadata",
      "providerMethod": "DELETE",
      "providerPathTemplate": "/rest/metadata/{resource}/{id}",
      "kind": "tool",
      "risk": "critical",
      "mutation": true,
      "requiresApproval": true,
      "idempotency": {
        "requirement": "required",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": false,
        "retrySafety": "unsafe"
      },
      "input": "resource and RFC 4122 id",
      "sideEffects": [
        "external_network",
        "delete"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": "rollback_not_supported"
    },
    {
      "index": 21,
      "capabilityId": "cap:twenty:openapi.core",
      "operation": "openapi.core",
      "family": "openapi-documents",
      "providerMethod": "GET",
      "providerPathTemplate": "/rest/open-api/core",
      "kind": "resource",
      "risk": "low",
      "mutation": false,
      "requiresApproval": false,
      "idempotency": {
        "requirement": "optional",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe"
      },
      "input": "empty object",
      "sideEffects": [
        "external_network",
        "read"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": null
    },
    {
      "index": 22,
      "capabilityId": "cap:twenty:openapi.metadata",
      "operation": "openapi.metadata",
      "family": "openapi-documents",
      "providerMethod": "GET",
      "providerPathTemplate": "/rest/open-api/metadata",
      "kind": "resource",
      "risk": "low",
      "mutation": false,
      "requiresApproval": false,
      "idempotency": {
        "requirement": "optional",
        "keyScope": "external_account",
        "ttlMs": 604800000,
        "collisionBehavior": "revalidate_input_hash"
      },
      "execution": {
        "sync": true,
        "async": false,
        "streaming": false,
        "cancellation": false,
        "retry": true,
        "retrySafety": "safe"
      },
      "input": "empty object",
      "sideEffects": [
        "external_network",
        "read"
      ],
      "data": {
        "sensitivity": "confidential",
        "containsPii": true,
        "redactionRequired": true
      },
      "compensation": null
    }
  ]
}

