Skip to main content
POST
Signed curl (wire shape)
Mints a §9.3(b) bound-resolver label for one child and returns the label, a binding_id, and a connect_secretall three returned exactly once. The caller must be an accredited resolver with a valid RFC 9421 signature, and there must be an active consent_attestation for (audience_did, child_ref) — the §4.2.2 precondition. No consent → 403.
endpoint_id_label and connect_secret are secret credentials returned once. Presenting the label as the {endpoint_id} path segment on a profile GET is the authentication — store both immediately and never log them.

Worked example

In the sandbox you satisfy the consent precondition with a single self-serve call (mint test consent), then bind. This runs end-to-end against the hosted sandbox:
The signer (sign_request / SignRequest) is defined once in the request-signing guide — copy it in, or use the @openchildsafety/ocss SDK’s signRequest. That guide’s Python, Go, and curl+openssl recipes were each run end-to-end against this sandbox and returned a real 201.
Real 201 response (captured from the hosted sandbox):
Next: poll the signed profile with the endpoint_id_label, and rotate using the binding_id.

Body

application/json

Binding-leg mint request. Source: endpointMintBody in internal/ocsshttp/handler_endpoints.go. Required: audience_did, child_ref, window_seconds >= 1.

audience_did
string
required

DID of the resolving platform (e.g. "did:ocss:snaptr").

Example:

"did:ocss:snaptr"

child_ref
string
required

"child:" — the child the resolver is binding to.

Example:

"child:11111111-1111-4111-8111-111111111111"

window_seconds
integer<int64>
required

Profile validity window in seconds. The census mints a window of this duration and increments rotation_epoch accordingly.

Required range: x >= 1
request_id
string<uuid>

Optional canonical lowercase non-nil UUID selecting the durable Phosra Link lane. A faithful retry reuses this ID with the exact same request authority and receives 200 + OCSS-Replay: original with the byte-identical first result. Reuse with changed authority returns 409. Omit only for the legacy cleartext-once lane.

statutory_fail_closed
string[]

Optional list of category slugs the deployment declares fail-closed (§9.1 floor 3 / §9.2). fail_mode="closed" appears on those CategoryEntry rows.

standing_ref
string

Consent standing backing the binding. Required by the durable Link lane and formatted as consent:attestation:.

enforceable_categories
string[]

Closed-registry rule categories the platform can enforce.

Response

Endpoint bound. Store endpoint_id_label and connect_secret immediately.

Binding mint result. Source: EndpointHandlers.Mint response in internal/ocsshttp/handler_endpoints.go. Legacy calls receive the three credential fields once. Durable request-ID calls also receive request_id and can recover the byte-identical original result on a faithful retry; the replay cache is AES-256-GCM encrypted and authority-bound at rest.

endpoint_id_label
string
required

High-entropy §9.3(b) bound-resolver label. Presenting it as the {endpoint_id} path segment in GET /enforcement-profiles/{endpoint_id} IS the authentication credential — treat as a secret, never log.

binding_id
string<uuid>
required

UUID of the persisted binding row (for rotation).

connect_secret
string
required

HMAC-SHA256 secret for verifying X-Phosra-Signature on inbound connect-leg deliveries (feed into gk.config({ connectSecret })). Store it immediately. Legacy calls disclose it once; authenticated durable retries can recover the encrypted original result.

request_id
string<uuid>

Echoed exactly when the request selected the durable lane.