kapable-sdk (0.9.0)
Installation
[registries.forgejo]
index = "sparse+ " # Sparse index
# index = " " # Git
[net]
git-fetch-with-cli = truecargo add kapable-sdk@0.9.0 --registry forgejoAbout this package
kapable-sdk
Typed Rust SDK for the Kapable v2 platform API. The single, typed, audited mirror
of every customer-tier capability on the platform, scoped to the correct
security token. The Rust twin of the TypeScript @kapable/sdk, kept at method
parity by a shared coverage manifest.
Version 0.2.0 — customer-tier coverage 74.7% (up from 50.6% at the 2026-06-08 audit). 11 modules, 315 methods. See CHANGELOG.md.
Install
Published to the Kapable Forgejo cargo registry (anonymous read). One-time registry setup in .cargo/config.toml (project or ~/.cargo):
[registries.kapable]
index = "sparse+https://git.kapable.dev/api/packages/kapable/cargo/"
Then:
[dependencies]
kapable-sdk = { registry = "kapable", version = "0.2" }
Quick start
use kapable_sdk::KapableClient;
#[tokio::main]
async fn main() -> Result<(), kapable_sdk::KapableError> {
let client = KapableClient::new("https://api.kapable.ai")
.api_key("my-api-key")
.build();
let stories = client.board().list_stories(Default::default()).await?;
println!("Found {} stories (total {})", stories.data.len(), stories.total);
let buckets = client.store().list_buckets().await?;
for bucket in &buckets {
println!("Bucket: {}", bucket.name);
}
Ok(())
}
Auth
Two authentication methods:
// API key (x-api-key header)
let client = KapableClient::new("https://api.kapable.ai")
.api_key("sk_live_...")
.build();
// Bearer token (JWT / session)
let client = KapableClient::new("https://api.kapable.ai")
.token("eyJ...")
.build();
Picking the right token
The SDK never enforces authorization — the server does — but it ships a typed
description of the platform's RBAC / token model so you can pick the right
credential. See kapable_sdk::security (Permission, TokenType, Scope,
AuthRequirement, and the tier presets):
use kapable_sdk::security::{tier, Permission};
let billing_req = tier::owner_with(Permission::BillingManage);
assert!(tier::OWNER.token_types.contains(&kapable_sdk::TokenType::Session));
- Token tiering & contribution rules:
../kapable-sdk/CONTRIBUTING.md(shared, both languages) - Full RBAC / token-tiering matrix + gap analysis:
../docs/sdk-surface-matrix.md - Operator/admin endpoints (berth, foreman, host, gateway, …) are deliberately excluded — they belong in the planned ops SDK, never this crate.
Workspace scoping
Workspace-scoped data (workspaces module, workspace_scoped data tables) is
resolved server-side from the X-Workspace-Id header (membership-validated by
kapable-auth; a workspace-bound credential always wins over the header).
The SDK sets the header natively — no header plumbing needed:
// Builder scope: every request carries X-Workspace-Id
let client = KapableClient::new("https://api.kapable.ai")
.token("eyJ...")
.workspace_id("a4d3…")
.build();
// Derive re-scoped clients — sub-clients carry the new scope
let other = client.with_workspace_id("other-ws"); // different workspace
let org_wide = client.without_workspace_id(); // org-wide opt-out (no header)
Real-time (SSE)
Several modules expose text/event-stream endpoints (board events, data row
changes, comms room/agent/anomaly feeds, AI proxy streaming). They return a
Stream of typed events backed by the sse module
(parse_sse_buffer / SseEvent), usable directly against any Kapable SSE
endpoint.
Modules
11 customer-tier modules. Method counts are Rust / TS (kept at parity by the
drift gate). The lists below are generated from
../kapable-sdk/coverage-manifest.json — the source of truth for the wrapped
surface.
| Module | Methods (Rust / TS) | Service | Description |
|---|---|---|---|
ai |
6 / 6 | kapable-ai | Provider catalog, per-org config, upstream proxy (SSE) |
auth |
109 / 115 | kapable-auth | Login, signup, orgs, members, API keys, apps, deployments, lanes, workspaces |
billing |
3 / 3 | kapable-billing | Org subscription summary, Stripe checkout, customer portal |
board |
41 / 42 | kapable-board | Stories, sprints, plans, products, comments, closures, Routa coordination |
comms |
43 / 43 | kapable-comms | Agents, mailboxes, rooms, messages, email, bridges, SSE feeds |
data |
17 / 18 | kapable-data | Tables CRUD, rows CRUD, search, bulk ops, CSV, SSE row changes |
harbor |
11 / 11 | harbor | Runtime licensing + release store (public + org-scoped reads) |
knowledge |
37 / 38 | kapable-knowledge | Claims, edges, predicates, perspectives, entities, tensions |
secrets |
7 / 7 | strongbox | Org-scoped secrets vault: CRUD, rotate, audit |
store |
10 / 10 | kapable-store | Buckets, objects, presigned URLs |
wiki |
31 / 31 | kv2-wiki | Pages/collections/tags/projects CRUD, prompt-gen, agent-tools |
Plus security (Permission / TokenType / Scope / AuthRequirement),
sse (event-stream parser + connector), error, and types (ListResponse,
ListParams).
Method index
Accessed via client.<module>().<method>(...).
- ai —
configure_provider,get_provider,list_providers,proxy,proxy_stream,remove_provider_config - auth —
login,signup,logout,logout_everywhere,refresh,me,validate,validate_header,session_info,magic_link_request,magic_link_verify,create_api_key,list_api_keys,revoke_api_key,create_service_token,get_org,rename_org,get_org_caps,list_org_members,assign_member_role,deactivate_member,reactivate_member,create_invitation,list_invitations,revoke_invitation,accept_invitation,list_roles,create_role,update_role,delete_role,list_permissions,list_org_apps,get_app_detail,get_app_choice,create_app_choice,fork_app_choice,rename_app,delete_app,pause_app,resume_app,request_deploy,rebuild_app, … (full list in the manifest;admin_create_org/admin_create_org_api_keyare admin-tier and now live inkapable-ops-sdk-rs; the 3 internalX-Callback-Tokendeployment/owner-email callbacks were dropped from both SDKs — they are internal service-to-service, intentionally in no SDK) - billing —
get,init,portal - board —
list_stories,get_story,create_story,update_story,delete_story,transition_story,search_stories,list_sprints,get_sprint,create_sprint,start_sprint,complete_sprint,attach_story,detach_story,get_closure,upsert_closure,list_plans,get_plan,create_plan,update_plan,list_revisions,create_revision,list_products,get_product,create_product,update_product,list_comments,create_comment,update_comment,delete_comment,get_lanes,set_lanes,post_evidence,get_verdict,list_worktrees,agent_report,list_story_repos,add_story_repo,remove_story_repo,list_repos,stream_events - comms —
create_agent,list_agents,delete_agent,mint_agent_key,list_agent_keys,revoke_agent_key,create_mailbox,list_agent_mailboxes,delete_mailbox,list_mailbox_channels,create_channel,get_message,list_messages,send_email,create_room,list_rooms,get_room,room_presence,heartbeat,join_room,invite_agent_to_room,revoke_room_agent,create_invite,list_invites,revoke_invite,post_room_message,list_room_messages,mint_app_token,list_app_tokens,revoke_app_token,post_annotations,upsert_mailbox_quota,get_mailbox_quotas,delete_mailbox_quota,mailbox_rate_limit_hits,list_org_send_audit,link_telegram_bridge,telegram_setup_url,list_bridges,revoke_bridge,stream_room,stream_agent,stream_anomaly_feed - data —
list_tables,create_table,drop_table,migrate_table,list_rows,get_row,create_rows,update_row,patch_row,delete_row,search_rows,bulk_update,bulk_delete,import_csv,export_data,stream_changes,stream_org_changes - harbor —
activate,validate,verify_release,get_org_public_key,get_release_manifest,get_latest_release_compat,download_release_artifact,download_artifact,get_license,get_license_usage,list_org_keys - knowledge —
create_claim,get_claim,list_claims,search_claims,list_claims_by_perspective,retract_claim,create_claim_confidence_evidence,list_claim_confidence_evidence,create_claim_meta,list_claim_meta,create_claim_derivations,list_claim_derivations,create_edge,list_edges,list_predicates,predicate_ontology,create_source,list_sources,delete_source,create_page,list_pages,merge_pages,create_corpus,get_corpus,list_corpora,get_perspective,list_perspectives,list_canonical_entities,resolve_canonical_entity,list_merge_candidates,decide_merge_candidate,unmerge_merge_candidate,list_source_provenance,source_provenance_graph,list_invariants,list_assay_runs,detect_tensions - secrets —
create,get,list,update,delete,rotate,audit - store —
list_buckets,create_bucket,list_objects,paginate_objects,upload_object,download_object,head_object,delete_object,presign_upload,presign_download - wiki —
create_page,list_pages,update_page,delete_page,get_raw_page,create_entity_page,create_prompt_page,update_prompt,regenerate,generate_narrative,page_generation_history,create_collection,list_collections,get_collection,update_collection,delete_collection,add_page_to_collection,remove_page_from_collection,update_page_in_collection,create_tag,list_tags,add_tags_to_page,remove_tag_from_page,delete_tag,create_project,list_projects,search_claims,get_canonical_entity,list_predicates,read_page_tool,list_pages_tool
Coverage & drift gate
Coverage is measured against the customer-tier, SDK-eligible endpoint inventory.
The TypeScript package owns the manifest and the gate
(cd ../kapable-sdk && bun run check-drift); this crate is kept at method
parity by the same manifest. Current: 74.7% customer-tier coverage, 0 phantom
methods.
License
MIT
Dependencies
| ID | Version |
|---|---|
| bytes | ^1 |
| chrono | ^0.4 |
| futures-util | ^0.3 |
| reqwest | ^0.12 |
| serde | ^1 |
| serde_json | ^1 |
| thiserror | ^2 |
| tokio | ^1 |
| url | ^2 |
| uuid | ^1 |
| futures-util | ^0.3 |
| tokio | ^1 |
| wiremock | ^0.6 |