Buckets and Management membership
A Document bucket contains conversion jobs and document-operation records.
Select one bucket for an operation and retain its bucket_id when polling,
reading, cancelling or deleting jobs. Jobs are shared within the authorized
bucket; a job identifier alone grants no access.
Authentication and capabilities
All routes use POST with an admitted Bearer access token and JSON body.
Membership is evaluated through the bucket's active pinned Management group,
active membership and active association. Other groups confer no authority.
Use the returned context's capabilities to enable actions rather than inferring
access from a token or a service role.
| Bucket role | Default bucket actions |
|---|---|
owner |
Read, conversion/document/job operations, rename, membership changes, privileged role assignments, and bucket deletion. |
admin |
Read, conversion/document/job operations, rename, and manage ordinary member memberships. |
member |
Read and conversion/document/job operations, including cancelling or deleting jobs within the bucket. |
Every role can leave. The final active owner cannot leave, be removed, disabled or demoted. Organization workspaces additionally intersect these capabilities with live organization Management grants. Context is a current decision; membership and capability changes affect subsequent requests.
Routes and fields
bucket_id, principal_id and member_id are non-nil dashed UUIDs. name
is trimmed text of 1–191 bytes. Caller-supplied ownership overrides are rejected
on creation. Optional organization transport is separate
from bucket fields.
| Route | Required fields | Result and conditions |
|---|---|---|
/v1/bucket/list |
None | data.items contains accessible bucket contexts, with principal_capabilities (bucket.list, bucket.create). No pagination fields apply. |
/v1/bucket/create |
name |
Creates a bucket and returns context. Requires an admitted user or authorized organization with bucket.create. |
/v1/bucket/get |
bucket_id |
Returns context for an accessible bucket. |
/v1/bucket/save |
bucket_id, name |
Requires bucket.save; returns the saved bucket record. |
/v1/bucket/delete |
bucket_id, confirmed: true |
Requires bucket.delete; returns bucket_id, deleted: true, and children_deleted counts. |
/v1/bucket/member/list |
bucket_id |
Requires member.list; returns items plus bucket context. |
/v1/bucket/member/save |
bucket_id, principal_id |
Optional member_id, role, status; requires member.save. |
/v1/bucket/member/remove |
bucket_id, principal_id, member_id |
Requires member.remove; removes the exact membership and returns its prior summary. |
/v1/bucket/member/leave |
bucket_id |
Requires member.leave; removes only the caller's membership and returns its prior summary. |
For member/save, omit member_id to add a new active membership (default
role member); supply the existing member ID to edit. An existing membership
without its ID is a conflict. Roles are owner, admin, and member; editable
statuses are active and disabled. New or reactivated members must reference
an existing active Document receiving principal. Role changes, privileged
membership creation, and changes/removal affecting owner/admin memberships
require member.assign_roles. Admins can manage only ordinary members and
cannot promote them. Removal deletes the membership; add it again to establish
a new membership. Departure rejects target/member/role/status overrides.
Create and select a bucket
curl -sS https://api.document.service.m7.org/v1/bucket/create \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"name":"Example documents"}'
data contains the bucket context:
{
"bucket": {"id":"BUCKET_UUID","name":"Example documents","created_by":"ACTOR_UUID"},
"member": {"id":"MEMBER_UUID","principal":"PRINCIPAL_UUID","role":"owner","status":"active"},
"capabilities": ["bucket.get", "convert.async", "job.result", "bucket.delete"],
"principal_id": "PRINCIPAL_UUID",
"actor_principal_id": "ACTOR_UUID",
"workspace": null
}
The example abbreviates bucket fields and action lists. Bucket records also
have created and modified timestamps. Member summaries contain id,
principal, role, status, created, and modified. For an organization,
workspace is { "org_id": "ORG_UUID", "org_name": "Example organization" },
principal_id is its receiving principal, and actor_principal_id remains the
authenticated caller.
Use the returned bucket.id in a conversion request:
{"bucket_id":"BUCKET_UUID","source":"# Example","input_format":"markdown","output_format":"html"}
Deletion and errors
Bucket deletion removes all its jobs and retained inputs, source metadata,
results and pickup payloads as one cascade, including pending and running jobs.
Processing and deletion share the bucket lock; partial child deletion is not a
successful result. Explicit confirmed: true is required and cannot be supplied
as a string. Fetch current context before offering deletion.
Invalid input returns 400, unavailable admission 401, denied membership or
capability 403, missing bucket 404, and concurrent/busy membership changes
409. On 409, reload membership/context before retrying. A missing or invalid
capability catalogue can return 503; do not substitute broad client-side
defaults. See Authorization.