Platform API

Endpoints

Reference for the eight /v1/sdk/* routes — discovery, session exchange, planning, registration, and evidence ingestion. Request and response shapes for each.

Every Platform API operation is one of eight routes under /v1/sdk/*. This page documents each one: purpose, auth requirements, request body, and response body.

The same authenticated caller — tenant, principal, subject, scopes — resolves under caller in every response. That block is documented once in Authentication → Caller identity on every response and omitted from per-route response tables.

All routes return application/json. Error responses use the envelope documented under Platform API → Error envelope.

Discovery routes

capabilities

GET /v1/sdk/capabilities

Returns the resolved caller identity, active authentication mode, deployment-default scopes, and configured public platform domains. Call this at startup to discover what scopes each route requires.

Auth: BearerAuth or TrustedHeaders.

Response fields:

FieldTypeNotes
servicestringService name.
statusstringTypically ok.
auth_modeenumtrusted_headers, bearer_token, or bearer_token_or_trusted_headers.
callerobjectResolved caller identity.
default_required_scopesstring[]Deployment default scopes required on every route.
routesarrayPer-route capability: route, domain, configured, required_scopes.

whoami

GET /v1/sdk/whoami

Returns the resolved caller identity — tenant, principal, subject, scopes. Use it as a lightweight check that credentials are working.

Auth: BearerAuth or TrustedHeaders.

Response fields:

FieldTypeNotes
servicestringService name.
statusstringTypically ok.
callerobjectResolved caller identity.

bootstrap

GET /v1/sdk/bootstrap

Describes the embedded-enforcement model. Call this once at application startup, cache the result, and use it to select operations and artifact profiles your deployment supports.

Auth: BearerAuth or TrustedHeaders.

Response fields:

FieldTypeNotes
service, status, auth_mode, callerSee above.
enforcement_modelstringThe embedded-enforcement mode this deployment operates in.
plaintext_to_platformbooleanAlways false on supported deployments.
policy_resolution_modestringHow this deployment resolves policy (for example, local or remote-resolve).
supported_operationsProtectionOperation[]Subset of protect, access, rewrap.
supported_artifact_profilesArtifactProfile[]Subset of tdf, envelope, detached_signature.
platform_domainsarrayPer-domain status: domain, configured, reason.

Session

session exchange

POST /v1/sdk/session

Exchanges SDK client credentials for a short-lived bearer token. Only needed in deployments configured for SDK client credentials; skip this route if you are using pre-issued bearer tokens. See Authentication → SDK client credentials.

Auth: none; credentials in the request body.

Request fields:

FieldTypeNotes
tenant_idstringTenant the credentials belong to.
client_idstringSDK client identifier.
client_secretstringSDK client secret.
requested_scopesstring[]Scopes to request for this session.

Response fields:

FieldTypeNotes
access_tokenstringShort-lived bearer token. Attach as Authorization: Bearer ....
token_typestringTypically Bearer.
expires_inintegerSeconds until expiry. SDKs refresh proactively before this.
scopestringGranted scopes.
tenant_id, client_id, subjectstringResolved identity of the token holder.

Rate limits: 429 responses include Retry-After (seconds).

Protection routes

All protection routes share a common request shape that describes a workload and the resource being acted on. The platform returns a decision (allow / deny, required scopes) and an execution or handling block the caller uses to enforce locally.

Common request components:

ComponentFields
WorkloadDescriptorapplication (required), optional environment and component.
ResourceDescriptorkind (required), optional id, mime_type.
labelsString array of caller-declared tags.
attributes{ string: string } map of caller-declared attributes.

protection plan

POST /v1/sdk/protection-plan

Returns a local-enforcement plan for a proposed protect / access / rewrap operation. Metadata only; plaintext is explicitly out of contract.

Auth: BearerAuth or TrustedHeaders.

Request fields:

FieldTypeNotes
operationProtectionOperationprotect, access, or rewrap.
workloadWorkloadDescriptorRequired.
resourceResourceDescriptorRequired.
preferred_artifact_profileArtifactProfileOptional preference; platform may override in execution.
content_digeststringOptional; e.g. sha256:.... Absence is signalled on the response.
content_size_bytesintegerOptional.
purposestringOptional free-text purpose.
labelsstring[]Caller tags.
attributesstring mapCaller attributes.

Response fields:

FieldTypeNotes
request_summaryobjectNormalized, sanitized view of the request the platform evaluated.
decision.allowbooleanWhether the operation is authorized.
decision.required_scopesstring[]Scopes that were required to authorize this operation.
decision.handling_modestringCaller-facing handling mode.
decision.plaintext_transportstringTypically a "local-only" marker.
execution.protect_locallybooleanWhether the SDK should perform the protection operation on the workload.
execution.local_enforcement_librarystringThe enforcement library the SDK should invoke locally.
execution.send_plaintext_to_platformbooleanAlways false under the metadata-only stance.
execution.send_onlystring[]Metadata fields the SDK is expected to emit to the platform after local work.
execution.artifact_profileArtifactProfileProfile to use when producing the artifact.
execution.key_strategystringCaller-facing key-handling strategy descriptor.
execution.policy_resolutionstringCaller-facing policy-resolution descriptor.
platform_domainsarrayPer-domain configured/reason flags.
warningsstring[]Non-fatal advisories.

policy resolve

POST /v1/sdk/policy-resolve

Resolves authorization and handling guidance from metadata only. Useful when the caller wants a policy decision decoupled from a specific artifact profile or key workflow.

Auth: BearerAuth or TrustedHeaders.

Request fields:

Same as protection plan except preferred_artifact_profile is not used.

Response fields:

FieldTypeNotes
request_summaryobjectNormalized view of the request.
decision.allowbooleanAllow or deny.
decision.enforcement_modestringLocal enforcement mode descriptor.
decision.required_scopesstring[]Scopes required for this decision.
decision.policy_inputsstring[]Caller-facing list of policy inputs considered.
decision.required_actionsstring[]Required post-decision actions.
handling.protect_locallybooleanWhether the caller should enforce locally.
handling.plaintext_transportstringTransport marker for plaintext (always local-only).
handling.bind_policy_tostring[]Identifiers the caller should bind the policy decision to.
handling.evidence_expectedstring[]Evidence events the caller should emit after enforcement.
platform_domains, warningsAs above.

key access plan

POST /v1/sdk/key-access-plan

Returns guidance for a wrap / unwrap / rewrap flow. The platform authorizes key use; the SDK performs the cryptographic work locally against the key access service.

Auth: BearerAuth or TrustedHeaders.

Request fields:

FieldTypeNotes
operationKeyAccessOperationwrap, unwrap, or rewrap.
workload, resourcedescriptorsRequired.
artifact_profileArtifactProfileOptional.
key_referencestringOptional caller-provided reference to an existing key binding.
content_digeststringOptional.
purpose, labels, attributesOptional.

Response fields:

FieldTypeNotes
request_summaryobjectNormalized view of the request.
decision.allowbooleanAllow or deny.
decision.operationKeyAccessOperationEcho of the requested operation.
decision.required_scopesstring[]Scopes required.
decision.key_reference_presentbooleanWhether the caller supplied a key reference.
execution.local_cryptographic_operationbooleanThe SDK performs the cryptographic step locally.
execution.platform_rolestringCaller-facing platform role descriptor.
execution.send_plaintext_to_platformbooleanAlways false.
execution.send_onlystring[]Metadata the SDK is expected to emit.
execution.artifact_profileArtifactProfileProfile to operate against.
execution.authorization_strategystringCaller-facing authorization-strategy descriptor.
platform_domains, warningsAs above.

Registration

artifact register

POST /v1/sdk/artifact-register

After the SDK has produced a protected artifact locally, this route registers its metadata with the platform. The platform tracks lifecycle without ever seeing the payload.

Auth: BearerAuth or TrustedHeaders.

Request fields:

FieldTypeNotes
operationProtectionOperationTypically protect or rewrap.
workload, resourcedescriptorsRequired.
artifact_profileArtifactProfileThe profile used to produce the artifact. Required.
artifact_digeststringCryptographic digest of the protected artifact. Required.
artifact_locatorstringOptional pointer to where the artifact is stored.
decision_idstringOptional reference to the earlier decision this registration is bound to.
key_referencestringOptional key binding reference.
purpose, labels, attributesOptional.

Response fields:

FieldTypeNotes
request_summaryobjectNormalized view of the registration.
registration.acceptedbooleanWhether the registration was accepted.
registration.required_scopesstring[]Scopes required.
registration.artifact_transportstringCaller-facing transport descriptor.
registration.send_plaintext_to_platformbooleanAlways false.
registration.catalog_actionsstring[]Downstream catalog actions the platform will perform.
registration.evidence_expectedstring[]Evidence events the caller should emit after registration.
platform_domains, warningsAs above.

Evidence ingestion

evidence

POST /v1/sdk/evidence

Records metadata-only evidence events associated with protected artifacts, policy decisions, and local enforcement outcomes. Ingested events land on the Immutable Ledger.

Auth: BearerAuth or TrustedHeaders.

Request fields:

FieldTypeNotes
event_typeEvidenceEventTypeprotect, access, rewrap, or deny.
workload, resourcedescriptorsRequired.
artifact_profileArtifactProfileOptional.
artifact_digeststringOptional digest of the artifact this event concerns.
decision_idstringOptional reference to the decision this event ties back to.
outcomestringOptional caller-facing outcome descriptor.
occurred_atstringOptional RFC 3339 timestamp.
purpose, labels, attributesOptional.

Response fields:

FieldTypeNotes
request_summaryobjectNormalized view of the event.
ingestion.acceptedbooleanWhether the event was accepted.
ingestion.required_scopesstring[]Scopes required.
ingestion.plaintext_transportstringAlways a local-only marker.
ingestion.send_onlystring[]Fields the event is expected to carry.
ingestion.correlate_bystring[]Correlation keys the platform will use to link this event to related records.
platform_domains, warningsAs above.

Enumerations

The contract uses four enumeration types:

EnumValues
ProtectionOperationprotect, access, rewrap
KeyAccessOperationwrap, unwrap, rewrap
ArtifactProfiletdf, envelope, detached_signature
EvidenceEventTypeprotect, access, rewrap, deny

All enum values are lowercase snake_case. Unknown values are rejected at request validation; the OpenAPI document is authoritative.

Relationship to other pages