Skip to main content

Sentry ExecModule

Overview

SentryModule connects ValkyrAI workflows to Sentry's REST API through the native map I/O ExecModule ABI. Workflow Studio discovers it as SentryModule; internal-integration and auth tokens are resolved only from a bound encrypted IntegrationAccount.

The first production operation set focuses on agentic error triage and release evidence:

  • list_organizations, list_teams, list_projects, get_project
  • list_issues, get_issue, update_issue
  • list_events, get_event
  • list_releases, get_release, create_release

List operations use Sentry's cursor pagination without following provider-returned absolute URLs. Provider responses and errors are bounded and redacted. Only GET requests retry automatically; issue updates and release creation run once so an ambiguous timeout cannot duplicate an audit mutation.

Usage

  1. Create a dedicated Sentry internal integration for the target organization.
  2. Grant only the organization, project, issue, event, and release permissions required by the workflow.
  3. Store the token in the encrypted apiKey field of an IntegrationAccount and set the account status to READY.
  4. Bind the account through ExecModuleConfig.authConfig.integrationAccount.
  5. Discover organization/project slugs with list operations.
  6. Use issue/event reads to collect evidence before changing issue state or creating a release.

Workflow input cannot provide a credential or redirect requests to an arbitrary host. The module builds every path from validated identifiers under Sentry's fixed API base.

Inputs

NameTypeRequirementDefaultDescription and constraints
operationstringRequiredNoneOne of the twelve operations above.
organizationSlugstringOrganization/project/release operationsNone1–80 letters, digits, _, or -; must start alphanumeric.
projectSlugstringProject/issue/event operationsNoneSame bounded slug rule.
issueIdstringIssue get/updateNoneNumeric provider ID, maximum 32 digits.
eventIdstringget_eventNoneNumeric or 32–64-character hexadecimal provider ID.
versionstringRelease get/createNoneCaller-owned release version; 1–200 bounded version characters.
querystringOptional list_issues filterNoneSentry structured search, maximum 2,048 characters.
statsPeriodstringOptional issue filter24h24h or 14d.
fullbooleanOptional event filtertrueInclude full event details when supported.
issueStatusstringOptional updateNoneresolved, resolvedInNextRelease, unresolved, or ignored.
assignedTostringOptional updateNoneActor ID, username, or team selector, maximum 200 characters.
hasSeenbooleanOptional updateNoneUser-context seen flag.
isBookmarkedbooleanOptional updateNoneBookmark state.
isSubscribedbooleanOptional updateNoneSubscription state.
isPublicbooleanOptional updateNoneSentry issue sharing state; not an authorization substitute.
issueobject or JSON stringOptional updateNoneAllowlisted issue fields only; 512 KiB cap.
projectsarray or JSON stringOptional release creationNone1–100 validated project slugs when supplied.
releaseUrlstringOptional release creationNoneHTTPS URL without embedded credentials, maximum 2,048 characters.
dateReleasedstringOptional release creationNoneProvider-compatible ISO-8601 timestamp, maximum 64 characters.
refstringOptional release creationNoneSource-control reference, maximum 250 characters.
releaseobject or JSON stringOptional release creationNoneAllowlisted Sentry release fields; 512 KiB cap.
cursorstringOptional list continuationNoneOpaque non-whitespace cursor, maximum 4,096 characters.
limitintegerOptional100Maximum returned resources, 1–10,000.
returnAllbooleanOptionalfalseContinue cursor pages to exhaustion or the 10,000-item cap.
requestIdstringOptionalNoneCaller correlation value sent as X-Request-Id, maximum 128 characters.

The issue object accepts only status, assignedTo, hasSeen, isBookmarked, isSubscribed, and isPublic. The release object accepts only version, projects, url, dateReleased, ref, refs, and commits. Typed inputs override matching fields. update_issue rejects an empty mutation. create_release always requires the typed version input.

Outputs

NameTypeWhen presentDescription
statusstringAlwayssuccess or error.
operationstringAlwaysNormalized operation name.
attemptsintegerAlwaysTotal provider attempts across pages.
httpStatusintegerProvider respondedLast provider HTTP status.
dataobjectSingle-resource/mutation successProvider project, issue, event, or release.
id, slug, shortId, version, permalinkstringProvider returns fieldSafe convenience identity/link fields.
items / countarray / integerList successBounded provider resources and emitted count.
hasMore / nextCursorboolean / stringList successProvider continuation state and opaque cursor.
requestIdstringProvider supplies oneSafe provider trace reference.
errorobjectFailureSafe {code, message, httpStatus?, retryable} details.

Tokens and authorization headers never enter outputs. Provider messages pass through ValkyrAI's shared workflow sensitive-data policy.

IntegrationAccount Requirements

SettingRequirement
ProviderSentry internal integration token or compatible auth token
AuthenticationAuthorization: Bearer <token>
accountNameHuman-readable automation identity
apiKeyPreferred encrypted SecureField containing the token
passwordLegacy encrypted fallback only; prefer apiKey
statusREADY or legacy unset status; CLOSED and ERROR fail closed

Recommended permission mapping:

  • discovery: organization/project read;
  • incident triage: issue and event read;
  • issue state changes: issue write;
  • release discovery/creation: release read/write.

Tokens remain inside IntegrationAccount. OAuth refresh and token rotation belong to the platform integration-account lifecycle, not workflow inputs.

Configuration

{
"version": "1.0.0",
"authConfig": {
"authStrategy": 1,
"integrationAccount": "integration-account:sentry-incident-automation"
},
"retryPolicy": {
"maxAttempts": 3,
"backoffStrategy": "EXPONENTIAL",
"initialDelayMs": 1000,
"maxDelayMs": 60000,
"jitter": false
},
"executionConfig": {"timeoutMs": 30000},
"payloadConfig": {
"parameters": "{\"operation\":\"list_issues\",\"organizationSlug\":\"valkyr-labs\",\"projectSlug\":\"api-0\",\"query\":\"is:unresolved level:error\",\"limit\":100}"
}
}

The integration-account value is symbolic. Persisted workflows use the generated relationship and never a plaintext token.

Operations

OperationSentry behaviorSide effect
list_organizationsLists organizations visible to the token.Read-only; safe retries.
list_teamsLists teams in one organization.Read-only; safe retries.
list_projectsLists organization projects.Read-only; safe retries.
get_projectReads one project by organization/project slug.Read-only; safe retries.
list_issuesSearches project issues with optional query and statistics window.Read-only; safe retries.
get_issueReads one issue by numeric ID.Read-only; safe retries.
update_issueUpdates only allowlisted issue state/assignment flags.Audit mutation; single attempt.
list_eventsLists project events, optionally with full payloads.Read-only; safe retries.
get_eventReads one project event.Read-only; safe retries.
list_releasesLists organization releases, optionally filtered to a project slug.Read-only; safe retries.
get_releaseReads one organization release by version.Read-only; safe retries.
create_releaseCreates one correlated organization release.New release; single attempt.

Errors and Failure Modes

CodeTypical causeRetryableResolution
VALIDATION_ERRORMissing/invalid slug, ID, cursor, update, version, project list, field, JSON, or release URL.NoCorrect input; no unsafe request was sent.
UNSUPPORTED_OPERATIONUnknown operation.NoSelect a documented operation.
INTEGRATION_ACCOUNT_REQUIREDNo bound account.NoBind a Sentry IntegrationAccount.
INTEGRATION_ACCOUNT_NOT_READYAccount is closed/error.NoRepair or reconnect the account.
SENTRY_HTTP_400Provider rejected a filter, field, or release body.NoCorrect the bounded request.
SENTRY_HTTP_401 / 403Token invalid/expired or missing scope.NoRotate the token or grant minimum permissions.
SENTRY_HTTP_404Resource is absent or invisible.NoRe-run discovery with the same account.
SENTRY_HTTP_429 / 5xxRate limit or transient provider failure.Yes for readsHonor Retry-After or X-Sentry-Rate-Limits; reconcile writes first.
NETWORK_ERRORTimeout, DNS, TLS, or connectivity failure.Yes for readsVerify connectivity; inspect provider state before repeating a write.
RESPONSE_TOO_LARGEResponse exceeded 5 MiB.NoNarrow the query or lower the limit.
INVALID_PROVIDER_RESPONSEList response was not an array or a cursor repeated.NoUse requestId and verify API compatibility.

Example

Resolve one verified issue after release evidence shows the fix is active:

{
"operation": "update_issue",
"issueId": "4388671590",
"issueStatus": "resolved",
"assignedTo": "team:platform",
"requestId": "api-0-release-20260808"
}

Expected result:

{
"status": "success",
"operation": "update_issue",
"attempts": 1,
"httpStatus": 200,
"id": "4388671590",
"shortId": "API-0-221",
"data": {
"id": "4388671590",
"shortId": "API-0-221",
"status": "resolved"
}
}

Notes

  • Pagination: Sentry uses cursor data in the Link response header. The module extracts only the opaque cursor query value, sends it back to the fixed Sentry host, rejects repeated/malformed cursors, and stops at the requested limit or 10,000 resources.
  • Rate limits: reads retry HTTP 408, 429, 500, 502, 503, and 504 according to RetryPolicy, honoring Retry-After and the delay portion of X-Sentry-Rate-Limits. Writes never retry automatically.
  • API limits: provider responses are capped at 5 MiB, structured mutations at 512 KiB, project lists at 100 slugs, and release versions at 200 characters.
  • Search behavior: Sentry applies its own issue-search grammar and default unresolved filter semantics. Keep queries narrow and use the same filters when resuming from nextCursor.
  • Idempotency: issue updates and release creation are single-attempt. Use a caller-owned requestId and deterministic release version; reconcile Sentry state before repeating an ambiguous timeout.
  • Destructive behavior: this release does not expose issue, project, team, organization, or release deletion. Issue state changes are reversible through another explicit update.
  • Public state: isPublic controls Sentry's issue-sharing behavior only. It does not grant ValkyrAI RBAC/ACL access and must not be treated as an authorization shortcut.
  • Security: credentials remain in IntegrationAccount SecureFields. Fixed-host routing, encoded path segments, allowlisted mutation fields, bounded responses, and redacted errors prevent arbitrary routing or token reflection.
  • External verification: request construction, cursor pagination, validation, retry safety, redaction, payload mapping, and metadata discovery are deterministic local tests. Live Sentry roles, scopes, rate limits, and release behavior require separately authorized provider credentials and are not exercised in repository tests.
  • Deferred operations: organization/team/project mutations, issue deletion/bulk updates, event attachments, release update/delete/file management, repositories, deploys, monitors, alerts, metric queries, webhooks/triggers, OAuth refresh, and arbitrary raw requests.
  • Functional references: n8n Sentry node source and Sentry API reference.