Skip to main content

API Cheat Sheet

Base URL: https://api.qpher.ai

Authentication: x-api-key: qph_live_<your-key> header on every request.

Response format: { "data": { ... }, "request_id": "uuid", "timestamp": "ISO-8601" }


KEM Encryption

Encrypt

POST /api/v1/kem/encrypt
ParameterTypeRequiredDescription
plaintextstring (base64)YesData to encrypt
key_versionintegerYesActive key version
algorithmstringNo"Kyber768" (default) or "X-Wing" (Pro/Enterprise)
modestringNo"standard" (default) or "deterministic"
saltstring (base64)NoRequired if mode is deterministic
curl -X POST https://api.qpher.ai/api/v1/kem/encrypt \
-H "x-api-key: qph_live_abc123" \
-H "Content-Type: application/json" \
-d '{"plaintext": "SGVsbG8gV29ybGQ=", "key_version": 1}'

Response:

{
"data": {
"ciphertext": "base64-encoded-ciphertext...",
"key_version": 1,
"algorithm": "Kyber768"
},
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-02-23T12:00:00Z"
}

Decrypt

POST /api/v1/kem/decrypt
ParameterTypeRequiredDescription
ciphertextstring (base64)YesData to decrypt
key_versionintegerYesKey version used to encrypt
algorithmstringNo"Kyber768" (default) or "X-Wing" (Pro/Enterprise)
curl -X POST https://api.qpher.ai/api/v1/kem/decrypt \
-H "x-api-key: qph_live_abc123" \
-H "Content-Type: application/json" \
-d '{"ciphertext": "base64-encoded-ciphertext...", "key_version": 1}'

Response:

{
"data": {
"plaintext": "SGVsbG8gV29ybGQ=",
"key_version": 1,
"algorithm": "Kyber768"
}
}

Key Wrap

POST /api/v1/kem/wrap
ParameterTypeRequiredDescription
symmetric_keystring (base64)YesSymmetric key to wrap
key_versionintegerYesActive key version
algorithmstringNo"Kyber768" (default) or "X-Wing" (Pro/Enterprise)
curl -X POST https://api.qpher.ai/api/v1/kem/wrap \
-H "x-api-key: qph_live_abc123" \
-H "Content-Type: application/json" \
-d '{"symmetric_key": "c3ltbWV0cmljX2tleV8zMl9ieXRlcw==", "key_version": 1}'

Response:

{
"data": {
"wrapped_key": "base64-encoded-wrapped-key...",
"key_version": 1,
"algorithm": "Kyber768",
"wrapping_method": "KEM-DEM"
}
}

Key Unwrap

POST /api/v1/kem/unwrap
ParameterTypeRequiredDescription
wrapped_keystring (base64)YesWrapped key to unwrap
key_versionintegerYesKey version used to wrap
algorithmstringNo"Kyber768" (default) or "X-Wing" (Pro/Enterprise)
curl -X POST https://api.qpher.ai/api/v1/kem/unwrap \
-H "x-api-key: qph_live_abc123" \
-H "Content-Type: application/json" \
-d '{"wrapped_key": "base64-encoded-wrapped-key...", "key_version": 1}'

Response:

{
"data": {
"symmetric_key": "c3ltbWV0cmljX2tleV8zMl9ieXRlcw==",
"key_version": 1,
"algorithm": "Kyber768"
}
}

Signatures

Sign

POST /api/v1/signature/sign
ParameterTypeRequiredDescription
messagestring (base64)YesMessage to sign
key_versionintegerYesActive signing key version
algorithmstringNo"Dilithium3" (default) or "Composite-ML-DSA" (Pro/Enterprise)
curl -X POST https://api.qpher.ai/api/v1/signature/sign \
-H "x-api-key: qph_live_abc123" \
-H "Content-Type: application/json" \
-d '{"message": "SW52b2ljZSAjMTIzNA==", "key_version": 1}'

Response:

{
"data": {
"signature": "base64-encoded-signature...",
"key_version": 1,
"algorithm": "Dilithium3"
}
}

Verify

POST /api/v1/signature/verify
ParameterTypeRequiredDescription
messagestring (base64)YesOriginal message
signaturestring (base64)YesSignature to verify
key_versionintegerYesSigning key version
algorithmstringNo"Dilithium3" (default) or "Composite-ML-DSA" (Pro/Enterprise)
curl -X POST https://api.qpher.ai/api/v1/signature/verify \
-H "x-api-key: qph_live_abc123" \
-H "Content-Type: application/json" \
-d '{"message": "SW52b2ljZSAjMTIzNA==", "signature": "base64...", "key_version": 1}'

Response:

{
"data": {
"valid": true,
"key_version": 1,
"algorithm": "Dilithium3"
}
}

Sign Hash

POST /api/v1/signature/sign-hash
ParameterTypeRequiredDescription
hashstring (base64)YesPre-computed hash digest to sign
hash_algorithmstringYes"SHA-256", "SHA-384", or "SHA-512"
key_versionintegerYesActive signing key version
algorithmstringNo"Dilithium3" (default) or "Composite-ML-DSA" (Pro/Enterprise)
curl -X POST https://api.qpher.ai/api/v1/signature/sign-hash \
-H "x-api-key: qph_live_abc123" \
-H "Content-Type: application/json" \
-d '{"hash": "n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=", "hash_algorithm": "SHA-256", "key_version": 1}'

Response:

{
"data": {
"signature": "base64-encoded-signature...",
"key_version": 1,
"algorithm": "Dilithium3",
"hash_algorithm": "SHA-256",
"signature_type": "detached"
}
}

Verify Hash

POST /api/v1/signature/verify-hash
ParameterTypeRequiredDescription
hashstring (base64)YesPre-computed hash digest
hash_algorithmstringYes"SHA-256", "SHA-384", or "SHA-512"
signaturestring (base64)YesSignature to verify
key_versionintegerYesSigning key version
algorithmstringNo"Dilithium3" (default) or "Composite-ML-DSA" (Pro/Enterprise)
curl -X POST https://api.qpher.ai/api/v1/signature/verify-hash \
-H "x-api-key: qph_live_abc123" \
-H "Content-Type: application/json" \
-d '{"hash": "n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=", "hash_algorithm": "SHA-256", "signature": "base64...", "key_version": 1}'

Response:

{
"data": {
"valid": true,
"key_version": 1,
"algorithm": "Dilithium3",
"hash_algorithm": "SHA-256"
}
}

Key Management

Generate Key Pair

POST /api/v1/kms/keys/generate
ParameterTypeRequiredDescription
algorithmstringYes"Kyber768", "Dilithium3", "X-Wing" (Pro/Enterprise), or "Composite-ML-DSA" (Pro/Enterprise)
curl -X POST https://api.qpher.ai/api/v1/kms/keys/generate \
-H "x-api-key: qph_live_abc123" \
-H "Content-Type: application/json" \
-d '{"algorithm": "Kyber768"}'

Response:

{
"data": {
"key_version": 1,
"algorithm": "Kyber768",
"status": "active",
"public_key": "base64-encoded-public-key...",
"created_at": "2026-02-23T12:00:00Z"
}
}

Rotate Key

POST /api/v1/kms/keys/rotate
ParameterTypeRequiredDescription
algorithmstringYes"Kyber768", "Dilithium3", "X-Wing" (Pro/Enterprise), or "Composite-ML-DSA" (Pro/Enterprise)

Creates a new active key. The previous active key becomes retired (can still decrypt/verify, but not encrypt/sign).

Get Active Key

GET /api/v1/kms/keys/active?algorithm=Kyber768

Returns the current active key for the specified algorithm.

List Keys

GET /api/v1/kms/keys?algorithm=Kyber768&status=active
ParameterTypeRequiredDescription
algorithmstringNoFilter by algorithm
statusstringNoFilter: active, retired, archived

Retire Key

POST /api/v1/kms/keys/retire
ParameterTypeRequiredDescription
algorithmstringYesAlgorithm of key to retire
key_versionintegerYesVersion to retire

Error Codes

CodeHTTPMeaning
ERR_AUTH_001401Missing or invalid API key
ERR_INVALID_001400Invalid request parameters
ERR_NOT_FOUND_001404Resource not found
ERR_FORBIDDEN_001403Access denied by policy
ERR_RATE_001429Rate limit exceeded
ERR_KEM_001400KEM operation: invalid plaintext
ERR_KEM_002400KEM operation: invalid key_version
ERR_KEM_003400KEM operation: key not active
ERR_KEM_004500KEM operation: cryptographic error
ERR_KEM_010400KEM wrap: invalid symmetric_key or key_version
ERR_KEM_011400KEM wrap: symmetric key too large
ERR_KEM_012400KEM unwrap: corrupt wrapped_key or wrong key_version
ERR_SIG_001400Signature: invalid message
ERR_SIG_002400Signature: invalid key_version
ERR_SIG_010400Signature: invalid hash or hash_algorithm
ERR_SIG_011400Signature: unsupported hash algorithm
ERR_KMS_001400KMS: invalid algorithm
ERR_KMS_002404KMS: key not found
ERR_SERVICE_001503Downstream service unavailable
ERR_INTERNAL_001500Internal server error

Error response format:

{
"error": {
"error_code": "ERR_KEM_002",
"message": "Key version 5 not found or not active for Kyber768"
},
"request_id": "uuid",
"timestamp": "ISO-8601"
}

Quick Reference

OperationMethodEndpointKey Requirement
EncryptPOST/api/v1/kem/encryptactive key
DecryptPOST/api/v1/kem/decryptactive or retired key
Key WrapPOST/api/v1/kem/wrapactive key
Key UnwrapPOST/api/v1/kem/unwrapactive or retired key
SignPOST/api/v1/signature/signactive key
VerifyPOST/api/v1/signature/verifyactive or retired key
Sign HashPOST/api/v1/signature/sign-hashactive key
Verify HashPOST/api/v1/signature/verify-hashactive or retired key
Generate KeyPOST/api/v1/kms/keys/generate
Rotate KeyPOST/api/v1/kms/keys/rotate
Get Active KeyGET/api/v1/kms/keys/active
List KeysGET/api/v1/kms/keys
Retire KeyPOST/api/v1/kms/keys/retire