Skip to content
bucker

API reference

grouping

4 operations. Shapes are sketches of the declared schemas, bounded in depth — the authoritative document is linked from the index.

GET/orgs/{orgSlug}/grouping/auto-merge

Requires bearerAuth

Parameters

Parameters for GET /orgs/{orgSlug}/grouping/auto-merge
NameInTypeNotes
orgSlugrequiredpathstringmin length 1

Response 200

{
  policy: {
    orgId: string
    enabled: boolean
    similarityThreshold: number
    precisionAtEnable: number | null
    recallAtEnable: number | null
    decisionsAtEnable: integer | null
    embeddingModel: string | null
    enabledByPrincipalId: string | null
    enabledAt: string | null
    disabledByPrincipalId: string | null
    disabledAt: string | null
  }
  evidence: {
    orgId: string
    embeddingModel: string | null
    projectIds: string[]
    pending: integer
    confirmed: integer
    rejected: integer
    decided: integer
    precision: number | null
    precisionLowerBound: number
    curve: {
      threshold: number
      support: integer
      confirmed: integer
      rejected: integer
      precision: number | null
      precisionLowerBound: number
      recallAtThreshold: number | null
      passes: boolean
    }[]
    recommendedThreshold: number | null
    reversals: {
      autoMerges: integer
      unmerged: integer
      rate: number | null
      significant: boolean
    }
    gate: {
      precisionBar: number
      minDecisions: integer
      minDecisionsAtThreshold: integer
      minAllowedThreshold: number
      maxReversalRate: number
      passes: boolean
      blockedBecause: string[]
    }
    measuredAt: string
  }
}

Response 400 · `bad_request` — the path, query or body failed validation. `details` carries the Zod issues, one per offending field.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 401 · `unauthorized` — no credential, or one that is expired, revoked or not valid for this resource. `mfa_required` when the credential is good but a second factor is owed.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 403 · `forbidden` — the credential is valid and its scopes or this principal’s membership do not reach this resource. Scopes are re-intersected with live memberships on every request, so this can appear for a token that worked yesterday.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 404 · `not_found` — no such resource, OR one this principal cannot see. The two are deliberately one answer: a 403 would confirm the existence of something whose identifier is guessable.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 429 · `rate_limited` or `quota_exceeded` — over a ceiling. `Retry-After` says when to come back, and `x-ratelimit-limit` / `-remaining` / `-reset` describe the bucket.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 500 · `internal_error` — an unhandled failure on this side. The message is always generic; `requestId` is the part worth quoting.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Request

curl https://api.bucker.io/orgs/{orgSlug}/grouping/auto-merge \
  -H 'authorization: Bearer $BUCKER_TOKEN'

POST/orgs/{orgSlug}/grouping/auto-merge/disable

Requires bearerAuth

Parameters

Parameters for POST /orgs/{orgSlug}/grouping/auto-merge/disable
NameInTypeNotes
orgSlugrequiredpathstringmin length 1

Response 200

{
  policy: {
    orgId: string
    enabled: boolean
    similarityThreshold: number
    precisionAtEnable: number | null
    recallAtEnable: number | null
    decisionsAtEnable: integer | null
    embeddingModel: string | null
    enabledByPrincipalId: string | null
    enabledAt: string | null
    disabledByPrincipalId: string | null
    disabledAt: string | null
  }
}

Response 400 · `bad_request` — the path, query or body failed validation. `details` carries the Zod issues, one per offending field.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 401 · `unauthorized` — no credential, or one that is expired, revoked or not valid for this resource. `mfa_required` when the credential is good but a second factor is owed.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 403 · `forbidden` — the credential is valid and its scopes or this principal’s membership do not reach this resource. Scopes are re-intersected with live memberships on every request, so this can appear for a token that worked yesterday.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 404 · `not_found` — no such resource, OR one this principal cannot see. The two are deliberately one answer: a 403 would confirm the existence of something whose identifier is guessable.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 429 · `rate_limited` or `quota_exceeded` — over a ceiling. `Retry-After` says when to come back, and `x-ratelimit-limit` / `-remaining` / `-reset` describe the bucket.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 500 · `internal_error` — an unhandled failure on this side. The message is always generic; `requestId` is the part worth quoting.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Request

curl -X POST https://api.bucker.io/orgs/{orgSlug}/grouping/auto-merge/disable \
  -H 'authorization: Bearer $BUCKER_TOKEN'

POST/orgs/{orgSlug}/grouping/auto-merge/enable

Requires bearerAuth

Parameters

Parameters for POST /orgs/{orgSlug}/grouping/auto-merge/enable
NameInTypeNotes
orgSlugrequiredpathstringmin length 1

Request body (required) · application/json

{
  similarityThreshold?: number
  embeddingModel?: string
}

Response 200

{
  policy: {
    orgId: string
    enabled: boolean
    similarityThreshold: number
    precisionAtEnable: number | null
    recallAtEnable: number | null
    decisionsAtEnable: integer | null
    embeddingModel: string | null
    enabledByPrincipalId: string | null
    enabledAt: string | null
    disabledByPrincipalId: string | null
    disabledAt: string | null
  }
  evidence: {
    orgId: string
    embeddingModel: string | null
    projectIds: string[]
    pending: integer
    confirmed: integer
    rejected: integer
    decided: integer
    precision: number | null
    precisionLowerBound: number
    curve: {
      threshold: number
      support: integer
      confirmed: integer
      rejected: integer
      precision: number | null
      precisionLowerBound: number
      recallAtThreshold: number | null
      passes: boolean
    }[]
    recommendedThreshold: number | null
    reversals: {
      autoMerges: integer
      unmerged: integer
      rate: number | null
      significant: boolean
    }
    gate: {
      precisionBar: number
      minDecisions: integer
      minDecisionsAtThreshold: integer
      minAllowedThreshold: number
      maxReversalRate: number
      passes: boolean
      blockedBecause: string[]
    }
    measuredAt: string
  }
}

Response 400 · `bad_request` — the path, query or body failed validation. `details` carries the Zod issues, one per offending field.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 401 · `unauthorized` — no credential, or one that is expired, revoked or not valid for this resource. `mfa_required` when the credential is good but a second factor is owed.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 403 · `forbidden` — the credential is valid and its scopes or this principal’s membership do not reach this resource. Scopes are re-intersected with live memberships on every request, so this can appear for a token that worked yesterday.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 404 · `not_found` — no such resource, OR one this principal cannot see. The two are deliberately one answer: a 403 would confirm the existence of something whose identifier is guessable.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 429 · `rate_limited` or `quota_exceeded` — over a ceiling. `Retry-After` says when to come back, and `x-ratelimit-limit` / `-remaining` / `-reset` describe the bucket.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 500 · `internal_error` — an unhandled failure on this side. The message is always generic; `requestId` is the part worth quoting.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Request

curl -X POST https://api.bucker.io/orgs/{orgSlug}/grouping/auto-merge/enable \
  -H 'authorization: Bearer $BUCKER_TOKEN' \
  -H 'content-type: application/json' \
  -d '{ … }'

POST/orgs/{orgSlug}/grouping/auto-merge/run

Requires bearerAuth

Parameters

Parameters for POST /orgs/{orgSlug}/grouping/auto-merge/run
NameInTypeNotes
orgSlugrequiredpathstringmin length 1

Request body (required) · application/json

{
  limit?: integer
}

Response 200

{
  orgId: string
  enabled: boolean
  threshold: number | null
  considered: integer
  merged: {
    mergeId: string
    projectId: string
    sourceIssueId: string
    targetIssueId: string
    kind: "MANUAL" | "AUTO"
    movedEvents: integer
    target: {
      eventCount: integer
      userCount: integer
      firstSeen: string
      lastSeen: string
    }
  }[]
  skipped: {
    suggestionId: string
    similarity: number
    reason: string
  }[]
  refusedBecause: string[]
}

Response 400 · `bad_request` — the path, query or body failed validation. `details` carries the Zod issues, one per offending field.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 401 · `unauthorized` — no credential, or one that is expired, revoked or not valid for this resource. `mfa_required` when the credential is good but a second factor is owed.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 403 · `forbidden` — the credential is valid and its scopes or this principal’s membership do not reach this resource. Scopes are re-intersected with live memberships on every request, so this can appear for a token that worked yesterday.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 404 · `not_found` — no such resource, OR one this principal cannot see. The two are deliberately one answer: a 403 would confirm the existence of something whose identifier is guessable.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 429 · `rate_limited` or `quota_exceeded` — over a ceiling. `Retry-After` says when to come back, and `x-ratelimit-limit` / `-remaining` / `-reset` describe the bucket.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Response 500 · `internal_error` — an unhandled failure on this side. The message is always generic; `requestId` is the part worth quoting.

{
  error: {
    code: "bad_request" | "conflict" | "forbidden" | "internal_error" | "mfa_required" | "not_found" | "payload_too_large" | "quota_exceeded" | … 6 more
    message: string
    details?: unknown
    requestId?: string
  }
}

Request

curl -X POST https://api.bucker.io/orgs/{orgSlug}/grouping/auto-merge/run \
  -H 'authorization: Bearer $BUCKER_TOKEN' \
  -H 'content-type: application/json' \
  -d '{ … }'