{"openapi":"3.1.0","info":{"version":"1.0.0","title":"CtrlKey server-to-server API"},"security":[{"ApiKey":[]}],"servers":[{"url":"https://private.api.ctrlkey.dev","description":"Production server"}],"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"X-Api-Key"}},"schemas":{},"parameters":{}},"paths":{"/v1/ceremonies/registration":{"post":{"description":"Start a credential registration ceremony","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"intent":{"type":"string","enum":["initial"]},"user":{"type":"object","properties":{"name":{"type":"string","description":"User name","examples":["john.doe","john.doe@example.com"]},"displayName":{"type":"string","description":"Display name of the user","examples":["John Doe","John"]}},"required":["name"]}},"required":["intent","user"],"description":"Initial user registration details"},{"type":"object","properties":{"intent":{"type":"string","enum":["additional"]},"user":{"type":"object","properties":{"handle":{"type":"string","description":"The user handle returned from the initial registration"}},"required":["handle"]}},"required":["intent","user"],"description":"Additional user credential registration details"}]}}}},"responses":{"201":{"description":"Credential registration ceremony details","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the registration ceremony","example":"1234567890abcdef"}},"required":["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"}}}},"409":{"description":"User already registered","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:conflict"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Conflict error"},"status":{"type":"number","enum":[409],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"User 'd90e3c82-e031-4e64-95d4-7bf832bb3d13' already exists"},"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 error response indicating that the request was invalid"}}}},"500":{"description":"An unexpected error occurred","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}/verify":{"post":{"description":"Verify a credential registration ceremony","parameters":[{"schema":{"type":"string","description":"The unique identifier of a credential registration ceremony"},"required":true,"name":"registrationCeremonyId","in":"path"}],"responses":{"200":{"description":"Registered user details","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier of the user of the application (also used as Webauthn user handle)."},"appId":{"type":"string","description":"The unique identifier of the application"},"enabled":{"type":"boolean","description":"Indicates if the user is enabled (not banned)"},"name":{"type":"string","description":"User name","examples":["john.doe","john.doe@example.com"]},"displayName":{"type":"string","description":"Display name of the user","examples":["John Doe","John"]},"credentials":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier of the credential"},"counter":{"type":"number","description":"Counter of the authenticator"},"publicKey":{"type":"string","description":"Base64url encoded public key of the credential"},"transports":{"type":"array","items":{"type":"string","enum":["usb","nfc","ble","smart-card","hybrid","cable","internal"]},"description":"Transport methods supported by the authenticator"},"authenticator":{"type":"object","properties":{"aaguid":{"type":"string","description":"Unique identifier of the authenticator"},"model":{"type":"string","description":"Model of the authenticator"}},"required":["aaguid"],"description":"Authenticator information"},"userVerified":{"type":"boolean","description":"Indicates if the user was identified with biometric or PIN during registration"},"deviceType":{"type":"string","enum":["singleDevice","multiDevice"],"description":"Type of the credential"},"backedUp":{"type":"boolean","description":"Indicates if the credential is backed up to the cloud and can be synchronized across user devices"},"origin":{"type":"string","description":"The origin of the website that the credential was registered on"},"attestationFormat":{"type":"string","enum":["fido-u2f","packed","android-safetynet","android-key","tpm","apple","none"],"description":"Format of the attestation"}},"required":["id","counter","publicKey","authenticator","userVerified","deviceType","backedUp","origin","attestationFormat"],"description":"User credential"},"description":"List of credentials associated with the user"},"sessions":{"type":"array","items":{"type":"object","properties":{"ceremonyId":{"type":"string","description":"Session ID"},"credential":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier of the credential"},"counter":{"type":"number","description":"Counter of the authenticator"},"publicKey":{"type":"string","description":"Base64url encoded public key of the credential"},"transports":{"type":"array","items":{"type":"string","enum":["usb","nfc","ble","smart-card","hybrid","cable","internal"]},"description":"Transport methods supported by the authenticator"},"authenticator":{"type":"object","properties":{"aaguid":{"type":"string","description":"Unique identifier of the authenticator"},"model":{"type":"string","description":"Model of the authenticator"}},"required":["aaguid"],"description":"Authenticator information"},"userVerified":{"type":"boolean","description":"Indicates if the user was identified with biometric or PIN during registration"},"deviceType":{"type":"string","enum":["singleDevice","multiDevice"],"description":"Type of the credential"},"backedUp":{"type":"boolean","description":"Indicates if the credential is backed up to the cloud and can be synchronized across user devices"},"origin":{"type":"string","description":"The origin of the website that the credential was registered on"},"attestationFormat":{"type":"string","enum":["fido-u2f","packed","android-safetynet","android-key","tpm","apple","none"],"description":"Format of the attestation"}},"required":["id","counter","publicKey","authenticator","userVerified","deviceType","backedUp","origin","attestationFormat"],"description":"User credential"},"country":{"type":"string","description":"Country where the session was initiated"},"origin":{"type":"string","description":"A URL of the application where the session was initiated"},"device":{"type":"object","properties":{"type":{"type":"string","enum":["desktop","mobile","tablet","console","smarttv","wearable","xr","embedded"],"description":"Type of the device"},"browser":{"type":"string","description":"Browser name"},"browserVersion":{"type":"string","description":"Browser version"},"vendor":{"type":"string","description":"Device vendor"},"device":{"type":"string","description":"Device name"},"os":{"type":"string","description":"Operating system name"},"osVersion":{"type":"string","description":"Operating system version"}},"required":["type"],"description":"User device information"},"startedAt":{"type":"string","format":"date-time","description":"The time when the session was initiated"}},"required":["ceremonyId","credential","startedAt"],"description":"User session information"},"description":"List of sessions associated with the user"},"createdAt":{"type":"string","format":"date-time","description":"The time when the user was created"}},"required":["id","appId","enabled","name","displayName","credentials","sessions","createdAt"],"description":"The user of the application"}},"required":["user"]}}}},"400":{"description":"Invalid state","content":{"application/problem+json":{"schema":{"oneOf":[{"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"},{"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"}]}}}},"401":{"description":"Unauthorized","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["urn:ctrlkey:error:unauthorized"],"description":"URN reference that identifies the error type"},"title":{"type":"string","description":"Short, human-readable summary of the problem","example":"Unauthorized"},"status":{"type":"number","enum":[401],"description":"HTTP status code"},"detail":{"type":"string","description":"Detailed explanation specific to this occurrence of the problem","example":"API key is missing or invalid"},"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 unauthorized error"}}}},"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":"An unexpected error occurred","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}/verify":{"post":{"description":"Verify a credential authentication ceremony","parameters":[{"schema":{"type":"string","description":"The unique identifier of a credential authentication ceremony"},"required":true,"name":"authenticationCeremonyId","in":"path"}],"responses":{"200":{"description":"User details","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier of the user of the application (also used as Webauthn user handle)."},"appId":{"type":"string","description":"The unique identifier of the application"},"enabled":{"type":"boolean","description":"Indicates if the user is enabled (not banned)"},"name":{"type":"string","description":"User name","examples":["john.doe","john.doe@example.com"]},"displayName":{"type":"string","description":"Display name of the user","examples":["John Doe","John"]},"credentials":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier of the credential"},"counter":{"type":"number","description":"Counter of the authenticator"},"publicKey":{"type":"string","description":"Base64url encoded public key of the credential"},"transports":{"type":"array","items":{"type":"string","enum":["usb","nfc","ble","smart-card","hybrid","cable","internal"]},"description":"Transport methods supported by the authenticator"},"authenticator":{"type":"object","properties":{"aaguid":{"type":"string","description":"Unique identifier of the authenticator"},"model":{"type":"string","description":"Model of the authenticator"}},"required":["aaguid"],"description":"Authenticator information"},"userVerified":{"type":"boolean","description":"Indicates if the user was identified with biometric or PIN during registration"},"deviceType":{"type":"string","enum":["singleDevice","multiDevice"],"description":"Type of the credential"},"backedUp":{"type":"boolean","description":"Indicates if the credential is backed up to the cloud and can be synchronized across user devices"},"origin":{"type":"string","description":"The origin of the website that the credential was registered on"},"attestationFormat":{"type":"string","enum":["fido-u2f","packed","android-safetynet","android-key","tpm","apple","none"],"description":"Format of the attestation"}},"required":["id","counter","publicKey","authenticator","userVerified","deviceType","backedUp","origin","attestationFormat"],"description":"User credential"},"description":"List of credentials associated with the user"},"sessions":{"type":"array","items":{"type":"object","properties":{"ceremonyId":{"type":"string","description":"Session ID"},"credential":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier of the credential"},"counter":{"type":"number","description":"Counter of the authenticator"},"publicKey":{"type":"string","description":"Base64url encoded public key of the credential"},"transports":{"type":"array","items":{"type":"string","enum":["usb","nfc","ble","smart-card","hybrid","cable","internal"]},"description":"Transport methods supported by the authenticator"},"authenticator":{"type":"object","properties":{"aaguid":{"type":"string","description":"Unique identifier of the authenticator"},"model":{"type":"string","description":"Model of the authenticator"}},"required":["aaguid"],"description":"Authenticator information"},"userVerified":{"type":"boolean","description":"Indicates if the user was identified with biometric or PIN during registration"},"deviceType":{"type":"string","enum":["singleDevice","multiDevice"],"description":"Type of the credential"},"backedUp":{"type":"boolean","description":"Indicates if the credential is backed up to the cloud and can be synchronized across user devices"},"origin":{"type":"string","description":"The origin of the website that the credential was registered on"},"attestationFormat":{"type":"string","enum":["fido-u2f","packed","android-safetynet","android-key","tpm","apple","none"],"description":"Format of the attestation"}},"required":["id","counter","publicKey","authenticator","userVerified","deviceType","backedUp","origin","attestationFormat"],"description":"User credential"},"country":{"type":"string","description":"Country where the session was initiated"},"origin":{"type":"string","description":"A URL of the application where the session was initiated"},"device":{"type":"object","properties":{"type":{"type":"string","enum":["desktop","mobile","tablet","console","smarttv","wearable","xr","embedded"],"description":"Type of the device"},"browser":{"type":"string","description":"Browser name"},"browserVersion":{"type":"string","description":"Browser version"},"vendor":{"type":"string","description":"Device vendor"},"device":{"type":"string","description":"Device name"},"os":{"type":"string","description":"Operating system name"},"osVersion":{"type":"string","description":"Operating system version"}},"required":["type"],"description":"User device information"},"startedAt":{"type":"string","format":"date-time","description":"The time when the session was initiated"}},"required":["ceremonyId","credential","startedAt"],"description":"User session information"},"description":"List of sessions associated with the user"},"createdAt":{"type":"string","format":"date-time","description":"The time when the user was created"}},"required":["id","appId","enabled","name","displayName","credentials","sessions","createdAt"],"description":"The user of the application"}},"required":["user"]}}}},"400":{"description":"Validation error or invalid state","content":{"application/problem+json":{"schema":{"oneOf":[{"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"},{"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":"An unexpected error occurred","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"}}}}}}}}}