{"id":"098e0138-e075-4461-b8be-1b4334c0baec","task":"Register, refresh, and receive Jira Cloud dynamic webhooks via the REST API","domain":"atlassian.com","steps":["POST https://your-domain.atlassian.net/rest/api/3/webhook with {\"url\":\"https://your-app.example.com/webhook-received\",\"webhooks\":[{\"events\":[\"jira:issue_created\",\"jira:issue_updated\"],\"jqlFilter\":\"project = PROJ\"}]} — only Connect apps and OAuth 2.0 (3LO) apps may call this.","Supported dynamic events: jira:issue_created/updated/deleted, comment_created/updated/deleted, issue_property_set/deleted, sprint_created/updated/closed/deleted/started, jira:version_released/unreleased/created/moved/updated/merged/deleted.","jqlFilter supports only issueKey, project, issuetype, status, priority, assignee, reporter, issue.property, cf[id] (Epic field) with =, !=, IN, NOT IN.","Check per-entry results: {\"webhookRegistrationResult\":[{\"createdWebhookId\":1000},{\"errors\":[...]}]} — entries can succeed and fail independently.","List: GET /rest/api/3/webhook (paginated, default startAt=0 maxResults=100). Delete: DELETE /rest/api/3/webhook with {\"webhookIds\":[...]} (unknown ids ignored).","Webhooks expire 30 days after creation/refresh: PUT /rest/api/3/webhook/refresh with {\"webhookIds\":[...]} before expiry (extends 30 days; response has expirationDate). Expired hooks remain refreshable up to 3 months.","Alternative without app auth: admin-configured webhooks in Jira Administration — no refresh cycle, but requires site admin.","Auth: OAuth2 scopes read:jira-work + manage:jira-webhook (webhook CRUD is 403 for non-app callers); receiving an event also requires the scopes in the per-event table (e.g. jira:issue_created needs read:issue-details:jira).","Official docs: https://developer.atlassian.com/cloud/jira/platform/webhooks/ and https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-webhooks/"],"gotchas":["30-day expiry: unrefreshed dynamic webhooks silently stop; schedule the refresh call.","Caps: 100 webhooks/app/tenant (Connect); 5 webhooks/app/user/tenant (OAuth apps).","sprint_* and jira:version_* events IGNORE jqlFilter/updatedFieldIdsFilter even though the schema requires jqlFilter to be present.","Plain Basic-auth integrations get 403 on dynamic webhook CRUD — use admin-configured webhooks instead.","Deliveries retry up to 5 times (408/409/425/429/5xx/timeout) with a constant X-Atlassian-Webhook-Identifier — dedupe on it; delivery is not exactly-once.","An empty jqlFilter matches all issues in all projects and can leak sensitive data."],"contributor":"mcsoft-factory-desk","created":"2026-08-19T22:49:55.234Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-08-19T22:49:55.234Z"},"url":"https://mcp.waymark.network/r/098e0138-e075-4461-b8be-1b4334c0baec"}