{
  "connector": "zendesk",
  "label": "Zendesk",
  "vendor_docs": "https://developer.zendesk.com/api-reference/",
  "summary": "A Zendesk Support account that answers the Support API v2, incremental exports and Help Center reads `zenpy` and sync pipelines call, plus an MCP server.",
  "surfaces": [
    {
      "kind": "REST",
      "path": "/api/v2",
      "notes": "tickets, users, organizations, comments, search, views, macros, triggers, webhooks"
    },
    {
      "kind": "REST",
      "path": "/api/v2/incremental",
      "notes": "timestamp and cursor incremental exports, ticket events"
    },
    {
      "kind": "REST",
      "path": "/api/v2/help_center",
      "notes": "Help Center content, read-only"
    },
    {
      "kind": "Webhooks",
      "path": "/api/v2/webhooks",
      "notes": "trigger-driven webhook delivery"
    },
    {
      "kind": "MCP",
      "path": "/mcp",
      "notes": "ticket, user and organization tools with `limit`/`offset` paging"
    }
  ],
  "api_versions": [
    "Support API v2"
  ],
  "supported": [
    {
      "item": "Offset pagination with the vendor's 100-per-page and 100-page depth limits, and cursor pagination with `page[size]`/`page[after]`"
    },
    {
      "item": "Incremental exports of tickets, users and organizations, the cursor ticket export, and ticket events with `include=comment_events`"
    },
    {
      "item": "The official SDK `zenpy`, per the README coverage matrix"
    },
    {
      "item": "OAuth `Bearer` and API-token `Basic` credentials; locally minted OAuth tokens are held to their scopes and `X-On-Behalf-Of` to the user's role"
    },
    {
      "item": "Triggers that fire webhooks on ticket create or update, with Liquid-style `{{ticket.*}}` placeholders"
    },
    {
      "item": "Zendesk's error envelopes"
    }
  ],
  "unsupported": [
    {
      "item": "Help Center, community and Talk authoring (create or update an article, create a post, buy a number)"
    },
    {
      "item": "Guide article translations and theme import or publish"
    },
    {
      "item": "The separate Chat and Sunshine products"
    },
    {
      "item": "Group create, update and delete; groups are read-only"
    },
    {
      "item": "`/channels/voice/calls`, which is not a documented Zendesk route; Talk reporting is `stats/incremental/calls`"
    }
  ],
  "differences": [
    {
      "scenario": "Timestamp incremental export of a ticket you just wrote",
      "difference": "As on Zendesk, tickets and ticket events from the most recent minute are withheld, and the window includes `start_time`, so records on the previous watermark come back.",
      "guidance": "Upsert rather than insert, and do not expect a fresh write in the next delta within a minute. Use the cursor export to resume strictly after the last record."
    },
    {
      "scenario": "Authentication in open mode",
      "difference": "Any credential is accepted and treated as the account owner unless it carries scopes or impersonates a user.",
      "guidance": "Do not test credential rejection in open mode."
    },
    {
      "scenario": "Webhook delivery",
      "difference": "Delivery is best-effort and off the request path; retries use compressed backoff, and a persistently failing webhook is not deactivated. Private and loopback endpoints are refused with 422 by default.",
      "guidance": "Poll your receiver for delivery rather than expecting it before the API call returns; do not test webhook deactivation."
    },
    {
      "scenario": "Write timestamps",
      "difference": "`created_at`/`updated_at` on writes use wall time; seeded data is deterministic.",
      "guidance": "Do not assert that new records sort among the seeded history."
    },
    {
      "scenario": "Rate limits",
      "difference": "There is no real per-account budget; 429s happen only when injected.",
      "guidance": "Inject `throttle` or `quota_limit` to test backoff."
    },
    {
      "scenario": "Restarts",
      "difference": "Durability is opt-in; MCP tool writes are not kept across a restart even when it is on.",
      "guidance": "Treat each run as starting from the seeded account."
    }
  ],
  "faults_supported": [
    {
      "fault": "throttle",
      "behaviour": "429 with `Retry-After` and Zendesk's \"Number of allowed API requests per minute exceeded\" body"
    },
    {
      "fault": "fail_next",
      "behaviour": "The next N calls fail as `throttle` does, then clear"
    },
    {
      "fault": "quota_limit",
      "behaviour": "429, the same body as `throttle`"
    },
    {
      "fault": "error_rate",
      "behaviour": "500 `{\"error\": \"InternalServerError\", \"description\": ...}` for the given fraction of calls"
    },
    {
      "fault": "latency_ms",
      "behaviour": "Fixed added latency on every data-plane request"
    }
  ]
}
