Budibase/budibase · error · HTTPError

Slack app creation response was incomplete

Error message

Slack app creation response was incomplete

What it means

After provisioning the Slack app for the agent, the code validates the response fields (clientId, clientSecret, signingSecret, appId, oauthAuthorizeUrl). If any of these are missing or empty, it throws this 400 HTTPError because the OAuth flow cannot proceed with an incomplete Slack app manifest.

Source

Thrown at packages/server/src/api/controllers/ai/agents.ts:531

  })
  const created = await sdk.ai.deployments.slack.createSlackAppFromManifest({
    configToken: await sdk.ai.slackAppConfig.fetchConfigToken(),
    manifest,
  })

  const clientId = created.credentials?.client_id?.trim()
  const clientSecret = created.credentials?.client_secret?.trim()
  const signingSecret = created.credentials?.signing_secret?.trim()
  const appId = created.app_id?.trim()
  const oauthAuthorizeUrl = created.oauth_authorize_url?.trim()
  if (
    !clientId ||
    !clientSecret ||
    !signingSecret ||
    !appId ||
    !oauthAuthorizeUrl
  ) {
    throw new HTTPError("Slack app creation response was incomplete", 400)
  }

  const state = utils.newid()
  await cache.store(
    getSlackOAuthStateCacheKey(state),
    {
      agentId,
      workspaceId,
    } satisfies SlackOAuthState,
    SLACK_OAUTH_STATE_TTL_SECONDS,
    { useTenancy: false }
  )

  await sdk.ai.agents.update({
    ...agent,
    slackIntegration: {
      ...agent.slackIntegration,
      appId,

View on GitHub (pinned to a81a902e9a)

Solutions

  1. Inspect the raw response from the Slack app creation service to see which field was absent
  2. Retry app creation — transient upstream failures often resolve on a second attempt
  3. Verify the Slack app creation service/env configuration (manifest, scopes, credentials) is correct
  4. Check Slack API status / auth for the workspace being provisioned
Defensive patterns

Strategy: validation

Validate before calling

const response = await createSlackAppRemotely(...)
const required = ["clientId","clientSecret","signingSecret","appId","oauthAuthorizeUrl"] as const
const missing = required.filter(k => !response[k])
if (missing.length) {
  throw new Error(`Slack provisioning response missing: ${missing.join(", ")}`)
}

Type guard

function isCompleteSlackAppResponse(r: Partial<Record<string, string>>): r is Required<Pick<Record<string,string>, "clientId"|"clientSecret"|"signingSecret"|"appId"|"oauthAuthorizeUrl">> {
  return !!(r.clientId && r.clientSecret && r.signingSecret && r.appId && r.oauthAuthorizeUrl)
}

Try / catch

try {
  await createAgentSlackApp(ctx)
} catch (err) {
  if (err instanceof HTTPError && err.message.includes("Slack app creation response was incomplete")) {
    // inspect upstream provisioning logs / retry creation
  } else { throw err }
}

Prevention

When it happens

Trigger: The Slack app creation service/deployment returns a payload missing one or more of clientId, clientSecret, signingSecret, appId, or oauthAuthorizeUrl — e.g. upstream provisioning partially failed or returned an error body shaped like a success.

Common situations: Slack API outage or partial provisioning; wrong/legacy Slack manifest template; credentials service returning empty secrets; misconfigured Slack app creation endpoint env vars.

Related errors


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/c3a7c97f74d2bab8. Report an issue: GitHub.