{"openapi":"3.1.0","info":{"version":"1.0.0","title":"CtrlKey web & mobile apps API"},"servers":[{"url":"https://public.api.ctrlkey.dev","description":"Production server"}],"components":{"schemas":{},"parameters":{}},"paths":{"/v1/ceremonies/registration/{registrationCeremonyId}/options":{"get":{"description":"Get options for a credential registration ceremony","parameters":[{"schema":{"type":"string","description":"The unique identifier of a credential registration ceremony"},"required":true,"name":"registrationCeremonyId","in":"path"},{"schema":{"type":"string","description":"The origin of the request, used to verify the request is coming from a trusted source"},"required":true,"name":"origin","in":"header"},{"schema":{"type":"string","description":"The user agent of the client making the request, used to verify the request is coming from a trusted source"},"required":true,"name":"user-agent","in":"header"}],"responses":{"200":{"description":"Credential registration ceremony options to be used in WebAuthn API","content":{"application/json":{"schema":{"type":"object","properties":{"publicKey":{"type":"object","properties":{"rp":{"type":"object","properties":{"name":{"type":"string","description":"The name of the relying party"},"id":{"type":"string","description":"The unique identifier of the relying party, usually a domain name","examples":["example.com","myapp.example.com"]}},"required":["name"]},"user":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the user"},"name":{"type":"string","description":"User name"},"displayName":{"type":"string","description":"Display name of the user"}},"required":["id","name","displayName"]},"challenge":{"type":"string","description":"Base64url-encoded challenge to be used in WebAuthn API"},"pubKeyCredParams":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["public-key"],"description":"Type of the credential"},"alg":{"type":"number","description":"Algorithm identifier for the credential","enum":[-7,-35,-36,-65535,-257,-258,-259,-37,-38,-39,-8,-47]}},"required":["type","alg"]}},"timeout":{"type":"number","description":"Timeout for the credential creation in milliseconds"},"authenticatorSelection":{"type":"object","properties":{"authenticatorAttachment":{"type":"string","enum":["platform","cross-platform"],"description":"The type of the authenticator to be used"},"userVerification":{"type":"string","enum":["required","preferred","discouraged"],"description":"User verification requirement for the registration ceremony"},"residentKey":{"type":"string","enum":["required","preferred","discouraged"],"description":"Resident key requirement for the registration ceremony"},"requireResidentKey":{"type":"boolean"}},"description":"Advanced criteria for restricting the types of authenticators that may be used"},"hints":{"type":"array","items":{"type":"string","enum":["hybrid","security-key","client-device"]},"description":"Hints for the authenticator to be used in the registration ceremony"},"attestation":{"type":"string","enum":["direct","enterprise","indirect","none"],"description":"Attestation conveyance preference for the registration ceremony"},"attestationFormats":{"type":"array","items":{"type":"string","enum":["fido-u2f","packed","android-safetynet","android-key","tpm","apple","none"]},"description":"Attestation formats to be used in the registration ceremony"}},"required":["rp","user","challenge","pubKeyCredParams"]}},"required":["publicKey"],"description":"Credential creation options to be used in WebAuthn API"}}}},"400":{"description":"Validation or invalid state error","content":{"application/problem+json":{"schema":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:validation"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Validation error"},"status":{"type":"number","enum":[400],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"The field 'user.name' must be present"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/d90e3c82-e031-4e64-95d4-7bf832bb3d13"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"The field path with the error","example":"user.name"},"message":{"type":"string","description":"Specific error message for this field","example":"must be present"}},"required":["field","message"],"description":"Specific validation error for a field"},"description":"List of specific validation errors for form-like inputs"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","errors","traceId"],"description":"An error response indicating that the request was invalid"},{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:invalid-state"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Invalid state error"},"status":{"type":"number","enum":[400],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"The field 'user.name' must be present"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/d90e3c82-e031-4e64-95d4-7bf832bb3d13"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","traceId"],"description":"An error response indicating that the request was invalid"}]}}}},"404":{"description":"Resource not found","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:resource-not-found"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"User not found"},"status":{"type":"number","enum":[404],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"User with id 'a4c25888-b721-4784-96a7-21a371634c02' was not found"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/a4c25888-b721-4784-96a7-21a371634c02"},"resourceType":{"type":"string","enum":["tenant","application","user","registration-ceremony","authentication-ceremony","credential"],"description":"Type of resource that was not found","example":"user"},"resourceId":{"type":"string","description":"ID of the resource that was not found","example":"a4c25888-b721-4784-96a7-21a371634c02"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","resourceType","resourceId","traceId"],"description":"Resource not found error"}}}},"500":{"description":"Unexpected error","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:unexpected"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Unexpected Error"},"status":{"type":"number","enum":[500],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"An unexpected error occurred"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/ceremonies/registration"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","traceId"],"description":"An unexpected error"}}}}}}},"/v1/ceremonies/registration/{registrationCeremonyId}/complete":{"post":{"description":"Completes a credential registration ceremony","parameters":[{"schema":{"type":"string","description":"The unique identifier of a credential registration ceremony"},"required":true,"name":"registrationCeremonyId","in":"path"},{"schema":{"type":"string","description":"The origin of the request, used to verify the request is coming from a trusted source"},"required":true,"name":"origin","in":"header"},{"schema":{"type":"string","description":"The user agent of the client making the request, used to verify the request is coming from a trusted source"},"required":true,"name":"user-agent","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the credential"},"rawId":{"type":"string","description":"The raw Base64url encoded ID of the credential"},"type":{"type":"string","enum":["public-key"],"description":"The type of the credential"},"authenticatorAttachment":{"type":"string","enum":["platform","cross-platform"],"description":"The type of the authenticator used to create the credential"},"clientExtensionResults":{"type":"object","properties":{"appid":{"type":"boolean"},"credProps":{"type":"object","properties":{"rk":{"type":"boolean"}}},"hmacCreateSecret":{"type":"boolean"}},"default":{},"description":"Client extension results"},"response":{"type":"object","properties":{"attestationObject":{"type":"string","description":"The Base64url encoded attestation object returned by the WebAuthn API"},"clientDataJSON":{"type":"string","description":"The Base64url encoded client data JSON returned by the WebAuthn API"},"authenticatorData":{"type":"string","description":"The Base64url encoded authenticator data returned by the WebAuthn API"},"transports":{"type":"array","items":{"type":"string","enum":["usb","nfc","ble","smart-card","hybrid","cable","internal"]},"default":[],"description":"Credential transports"},"publicKeyAlgorithm":{"type":"number","description":"Public key algorithm","enum":[-7,-35,-36,-65535,-257,-258,-259,-37,-38,-39,-8,-47]},"publicKey":{"type":"string","description":"Base64url encoded public key"}},"required":["attestationObject","clientDataJSON"]}},"required":["id","rawId","type","authenticatorAttachment","response"],"description":"WebAuthn registration response"}}}},"responses":{"204":{"description":"Credential registration ceremony completed successfully"},"400":{"description":"Request validation error or passkey verification failed","content":{"application/problem+json":{"schema":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:validation"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Validation error"},"status":{"type":"number","enum":[400],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"The field 'user.name' must be present"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/d90e3c82-e031-4e64-95d4-7bf832bb3d13"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"The field path with the error","example":"user.name"},"message":{"type":"string","description":"Specific error message for this field","example":"must be present"}},"required":["field","message"],"description":"Specific validation error for a field"},"description":"List of specific validation errors for form-like inputs"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","errors","traceId"],"description":"An error response indicating that the request was invalid"},{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:passkey:verification-failed"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"PassKey verification failed"},"status":{"type":"number","enum":[400],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"Challenge is invalid or expired"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/ceremonies/registration/iEaD1nEHBzdhCnQ8rDxw1_LUcBwK3bnKxZm7_w/complete"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","traceId"],"description":"An error response indicating that the request was invalid"}]}}}},"404":{"description":"Resource not found","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:resource-not-found"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"User not found"},"status":{"type":"number","enum":[404],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"User with id 'a4c25888-b721-4784-96a7-21a371634c02' was not found"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/a4c25888-b721-4784-96a7-21a371634c02"},"resourceType":{"type":"string","enum":["tenant","application","user","registration-ceremony","authentication-ceremony","credential"],"description":"Type of resource that was not found","example":"user"},"resourceId":{"type":"string","description":"ID of the resource that was not found","example":"a4c25888-b721-4784-96a7-21a371634c02"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","resourceType","resourceId","traceId"],"description":"Resource not found error"}}}},"500":{"description":"Unexpected error","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:unexpected"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Unexpected Error"},"status":{"type":"number","enum":[500],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"An unexpected error occurred"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/ceremonies/registration"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","traceId"],"description":"An unexpected error"}}}}}}},"/v1/ceremonies/authentication":{"post":{"description":"Creates a credential authentication ceremony","parameters":[{"schema":{"type":"string","description":"The origin of the request, used to verify the request is coming from a trusted source"},"required":true,"name":"origin","in":"header"},{"schema":{"type":"string","description":"The user agent of the client making the request, used to verify the request is coming from a trusted source"},"required":true,"name":"user-agent","in":"header"}],"responses":{"201":{"description":"Credential authentication ceremony created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"publicKey":{"type":"object","properties":{"challenge":{"type":"string","description":"Base64url-encoded challenge to be used in WebAuthn API"},"timeout":{"type":"number","description":"Timeout for the credential authentication in milliseconds"},"rpId":{"type":"string","description":"The unique identifier of the relying party, usually a domain name","examples":["example.com","myapp.example.com"]},"allowCredentials":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the credential to be used for authentication"},"type":{"type":"string","enum":["public-key"],"description":"The type of the credential to be used for authentication"},"transports":{"type":"array","items":{"type":"string","enum":["usb","nfc","ble","smart-card","hybrid","cable","internal"]},"description":"The transport methods supported by the credential"}},"required":["id","type"]}},"userVerification":{"type":"string","enum":["required","preferred","discouraged"],"default":"preferred","description":"User verification requirement for the authentication ceremony"}},"required":["challenge"]},"id":{"type":"string","description":"The unique identifier of a credential authentication ceremony"}},"required":["publicKey","id"]}}}},"400":{"description":"Validation or invalid state error","content":{"application/problem+json":{"schema":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:validation"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Validation error"},"status":{"type":"number","enum":[400],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"The field 'user.name' must be present"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/d90e3c82-e031-4e64-95d4-7bf832bb3d13"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"The field path with the error","example":"user.name"},"message":{"type":"string","description":"Specific error message for this field","example":"must be present"}},"required":["field","message"],"description":"Specific validation error for a field"},"description":"List of specific validation errors for form-like inputs"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","errors","traceId"],"description":"An error response indicating that the request was invalid"},{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:invalid-state"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Invalid state error"},"status":{"type":"number","enum":[400],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"The field 'user.name' must be present"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/d90e3c82-e031-4e64-95d4-7bf832bb3d13"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","traceId"],"description":"An error response indicating that the request was invalid"}]}}}},"404":{"description":"Resource not found","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:resource-not-found"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"User not found"},"status":{"type":"number","enum":[404],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"User with id 'a4c25888-b721-4784-96a7-21a371634c02' was not found"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/a4c25888-b721-4784-96a7-21a371634c02"},"resourceType":{"type":"string","enum":["tenant","application","user","registration-ceremony","authentication-ceremony","credential"],"description":"Type of resource that was not found","example":"user"},"resourceId":{"type":"string","description":"ID of the resource that was not found","example":"a4c25888-b721-4784-96a7-21a371634c02"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","resourceType","resourceId","traceId"],"description":"Resource not found error"}}}},"500":{"description":"Unexpected error","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:unexpected"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Unexpected Error"},"status":{"type":"number","enum":[500],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"An unexpected error occurred"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/ceremonies/registration"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","traceId"],"description":"An unexpected error"}}}}}}},"/v1/ceremonies/authentication/{authenticationCeremonyId}/complete":{"post":{"description":"Completes a credential authentication ceremony","parameters":[{"schema":{"type":"string","description":"The unique identifier of a credential authentication ceremony"},"required":true,"name":"authenticationCeremonyId","in":"path"},{"schema":{"type":"string","description":"The origin of the request, used to verify the request is coming from a trusted source"},"required":true,"name":"origin","in":"header"},{"schema":{"type":"string","description":"The user agent of the client making the request, used to verify the request is coming from a trusted source"},"required":true,"name":"user-agent","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the credential"},"rawId":{"type":"string","description":"The raw Base64url encoded ID of the credential"},"type":{"type":"string","enum":["public-key"],"description":"The type of the credential"},"authenticatorAttachment":{"type":"string","enum":["platform","cross-platform"],"description":"The type of the authenticator used to create the credential"},"clientExtensionResults":{"type":"object","properties":{"appid":{"type":"boolean"},"credProps":{"type":"object","properties":{"rk":{"type":"boolean"}}},"hmacCreateSecret":{"type":"boolean"}},"default":{},"description":"Client extension results"},"response":{"type":"object","properties":{"authenticatorData":{"type":"string","description":"The Base64url encoded authenticator data returned by the WebAuthn API"},"clientDataJSON":{"type":"string","description":"The Base64url encoded client data JSON returned by the WebAuthn API"},"signature":{"type":"string","description":"The Base64url encoded signature returned by the WebAuthn API"},"userHandle":{"type":"string","description":"The Base64url encoded user handle returned by the WebAuthn API"}},"required":["authenticatorData","clientDataJSON","signature","userHandle"]}},"required":["id","rawId","type","authenticatorAttachment","response"],"description":"WebAuthn authentication response"}}}},"responses":{"204":{"description":"Credential authentication ceremony completed successfully"},"400":{"description":"Validation error","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:validation"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Validation error"},"status":{"type":"number","enum":[400],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"The field 'user.name' must be present"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/d90e3c82-e031-4e64-95d4-7bf832bb3d13"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"The field path with the error","example":"user.name"},"message":{"type":"string","description":"Specific error message for this field","example":"must be present"}},"required":["field","message"],"description":"Specific validation error for a field"},"description":"List of specific validation errors for form-like inputs"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","errors","traceId"],"description":"An error response indicating that the request was invalid"}}}},"404":{"description":"Resource not found","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:resource-not-found"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"User not found"},"status":{"type":"number","enum":[404],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"User with id 'a4c25888-b721-4784-96a7-21a371634c02' was not found"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/users/a4c25888-b721-4784-96a7-21a371634c02"},"resourceType":{"type":"string","enum":["tenant","application","user","registration-ceremony","authentication-ceremony","credential"],"description":"Type of resource that was not found","example":"user"},"resourceId":{"type":"string","description":"ID of the resource that was not found","example":"a4c25888-b721-4784-96a7-21a371634c02"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","resourceType","resourceId","traceId"],"description":"Resource not found error"}}}},"500":{"description":"Unexpected error","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:unexpected"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Unexpected Error"},"status":{"type":"number","enum":[500],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"An unexpected error occurred"},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem","example":"/ceremonies/registration"},"traceId":{"type":"string","description":"Unique identifier for this error occurrence for support inquiries","example":"abc-xyz-123"},"links":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","example":"https://docs.ctrlkey.dev/errors/route-not-found"},"rel":{"type":"string","example":"help"},"title":{"type":"string","example":"Documentation for this error type"}},"required":["href","rel","title"],"description":"Link to related documentation or resources"},"description":"Links to related documentation or resources"}},"required":["type","title","status","detail","instance","traceId"],"description":"An unexpected error"}}}}}}}}}