Skip to content
bucker

API reference

transparency

The public transparency register and its Merkle proofs. 8 operations. Shapes are sketches of the declared schemas, bounded in depth — the authoritative document is linked from the index.

GET/transparency/consistency-proof

No declared credential scheme

Reachable without a Bucker session token. A proof an outsider cannot check is not a proof.

Parameters

Parameters for GET /transparency/consistency-proof
NameInTypeNotes
oldSizerequiredqueryintegermin 0

Response 200

{
  oldSize: integer
  oldRoot: string
  newSize: integer
  newRoot: string
  proof: string[]
  verified: boolean
  disclosures: 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 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/transparency/consistency-proof

POST/transparency/injection-trials

Requires bearerAuth

Request body (required) · application/json

{
  campaignId: string
  mode: "SINGLE_ATTEMPT" | "ADAPTIVE"
  family?: string
  payload: string
}

Response 201

{
  id: string
  campaignId: string
  mode: "SINGLE_ATTEMPT" | "ADAPTIVE"
  attemptIndex: integer
  family: string
  payloadDigest: string
  evaded: boolean
  rule: string | null
  severity: string | null
  depth: integer | null
  note: 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 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/transparency/injection-trials \
  -H 'authorization: Bearer $BUCKER_TOKEN' \
  -H 'content-type: application/json' \
  -d '{ … }'

POST/transparency/publish

Requires bearerAuth

Request body (required) · application/json

{
  force?: boolean
}

Response 200

{
  snapshot: {
    id: string
    leafIndex: integer
    generatedAt: string
    digest: string
    leafHash: string
    rootHash: string
    treeSize: integer
    signature: string
    algorithm: string
    keyId: string
    publishedByPrincipalId: string | null
    register: {
      version: string
      generatedAt: string
      coverage: object
      rejectedPatches: object
      rejectionsByCategory: object[]
      regressionsCausedByOurFixes: object
      regressionKinds: object[]
      firstAttemptFailureOverall: object
      firstAttemptFailureByLanguage: object[]
      injection: object
      notMeasured: string[]
      provenanceNote: string
      suppression: object
      disclosures: string[]
    }
  }
  unchanged: boolean
  disclosures: 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 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/transparency/publish \
  -H 'authorization: Bearer $BUCKER_TOKEN' \
  -H 'content-type: application/json' \
  -d '{ … }'

GET/transparency/register

No declared credential scheme

Reachable without a Bucker session token. Transparency register read — deliberately public.

Response 200

{
  version: string
  generatedAt: string
  coverage: {
    firstObservationAt: string | null
    lastObservationAt: string | null
  }
  rejectedPatches: {
    label: string
    definition: string
    sources: string[]
    numerator: integer
    denominator: integer
    rate: number | null
    confidence: {
      lower: number
      upper: number
      level: number
    } | null
    sufficient: boolean
    publishable: boolean
    statement: string
  }
  rejectionsByCategory: {
    category: string
    count: integer
  }[]
  regressionsCausedByOurFixes: {
    label: string
    definition: string
    sources: string[]
    numerator: integer
    denominator: integer
    rate: number | null
    confidence: {
      lower: number
      upper: number
      level: number
    } | null
    sufficient: boolean
    publishable: boolean
    statement: string
  }
  regressionKinds: {
    kind: string
    count: integer
  }[]
  firstAttemptFailureOverall: {
    label: string
    definition: string
    sources: string[]
    numerator: integer
    denominator: integer
    rate: number | null
    confidence: {
      lower: number
      upper: number
      level: number
    } | null
    sufficient: boolean
    publishable: boolean
    statement: string
  }
  firstAttemptFailureByLanguage: {
    label: string
    definition: string
    sources: string[]
    numerator: integer
    denominator: integer
    rate: number | null
    confidence: {
      lower: number
      upper: number
      level: number
    } | null
    sufficient: boolean
    publishable: boolean
    statement: string
    language: string
  }[]
  injection: {
    singleAttempt: {
      label: string
      definition: string
      sources: string[]
      numerator: integer
      denominator: integer
      rate: number | null
      confidence: object | null
      sufficient: boolean
      publishable: boolean
      statement: string
    }
    adaptiveCampaign: {
      label: string
      definition: string
      sources: string[]
      numerator: integer
      denominator: integer
      rate: number | null
      confidence: object | null
      sufficient: boolean
      publishable: boolean
      statement: string
    }
    adaptivePerAttempt: {
      label: string
      definition: string
      sources: string[]
      numerator: integer
      denominator: integer
      rate: number | null
      confidence: object | null
      sufficient: boolean
      publishable: boolean
      statement: string
    }
    campaigns: {
      single: integer
      adaptive: integer
    }
    note: string
  }
  notMeasured: string[]
  provenanceNote: string
  suppression: {
    available: false
    note: string
  }
  disclosures: 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/transparency/register

GET/transparency/snapshots

No declared credential scheme

Reachable without a Bucker session token. Transparency register read — deliberately public.

Parameters

Parameters for GET /transparency/snapshots
NameInTypeNotes
limitqueryintegerdefault 50, min 1, max 200

Response 200

{
  treeSize: integer
  rootHash: string
  snapshots: {
    id: string
    leafIndex: integer
    generatedAt: string
    digest: string
    rootHash: string
    treeSize: integer
    keyId: string
  }[]
  disclosures: 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 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/transparency/snapshots

GET/transparency/snapshots/{leafIndex}

No declared credential scheme

Reachable without a Bucker session token. Transparency register read — deliberately public.

Parameters

Parameters for GET /transparency/snapshots/{leafIndex}
NameInTypeNotes
leafIndexrequiredpathintegermin 0

Response 200

{
  snapshot: {
    id: string
    leafIndex: integer
    generatedAt: string
    digest: string
    leafHash: string
    rootHash: string
    treeSize: integer
    signature: string
    algorithm: string
    keyId: string
    publishedByPrincipalId: string | null
    register: {
      version: string
      generatedAt: string
      coverage: object
      rejectedPatches: object
      rejectionsByCategory: object[]
      regressionsCausedByOurFixes: object
      regressionKinds: object[]
      firstAttemptFailureOverall: object
      firstAttemptFailureByLanguage: object[]
      injection: object
      notMeasured: string[]
      provenanceNote: string
      suppression: object
      disclosures: string[]
    }
  }
  disclosures: 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 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/transparency/snapshots/{leafIndex}

GET/transparency/snapshots/{leafIndex}/audit

No declared credential scheme

Reachable without a Bucker session token. A proof an outsider cannot check is not a proof.

Parameters

Parameters for GET /transparency/snapshots/{leafIndex}/audit
NameInTypeNotes
leafIndexrequiredpathintegermin 0

Response 200

{
  leafIndex: integer
  valid: boolean
  failures: {
    code: string
    message: string
  }[]
  disclosures: 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 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/transparency/snapshots/{leafIndex}/audit

GET/transparency/snapshots/{leafIndex}/inclusion-proof

No declared credential scheme

Reachable without a Bucker session token. A proof an outsider cannot check is not a proof.

Parameters

Parameters for GET /transparency/snapshots/{leafIndex}/inclusion-proof
NameInTypeNotes
leafIndexrequiredpathintegermin 0
treeSizequeryintegermin 1

Response 200

{
  leafIndex: integer
  leafHash: string
  treeSize: integer
  rootHash: string
  proof: string[]
  verified: boolean
  disclosures: 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 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/transparency/snapshots/{leafIndex}/inclusion-proof