Step 2 Authenticate with OTP code
curl --request POST \
--url https://sandbox.api.byzantine.fi/v1/submit/otp-auth \
--header 'Content-Type: application/json' \
--header 'X-Pubkey: <x-pubkey>' \
--header 'X-Pubkey, X-Timestamp, X-Signature: <api-key>' \
--header 'X-Signature: <x-signature>' \
--header 'X-Timestamp: <x-timestamp>' \
--data '
{
"accountId": "550e8400-e29b-41d4-a716-446655440000",
"userId": "550e8400-e29b-41d4-a716-446655440000",
"otpId": "otp_a1b2c3d4567890abcdef",
"otpCode": "123456789"
}
'import requests
url = "https://sandbox.api.byzantine.fi/v1/submit/otp-auth"
payload = {
"accountId": "550e8400-e29b-41d4-a716-446655440000",
"userId": "550e8400-e29b-41d4-a716-446655440000",
"otpId": "otp_a1b2c3d4567890abcdef",
"otpCode": "123456789"
}
headers = {
"X-Pubkey": "<x-pubkey>",
"X-Timestamp": "<x-timestamp>",
"X-Signature": "<x-signature>",
"X-Pubkey, X-Timestamp, X-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Pubkey': '<x-pubkey>',
'X-Timestamp': '<x-timestamp>',
'X-Signature': '<x-signature>',
'X-Pubkey, X-Timestamp, X-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
accountId: '550e8400-e29b-41d4-a716-446655440000',
userId: '550e8400-e29b-41d4-a716-446655440000',
otpId: 'otp_a1b2c3d4567890abcdef',
otpCode: '123456789'
})
};
fetch('https://sandbox.api.byzantine.fi/v1/submit/otp-auth', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"session": "<string>",
"sessionId": "550e8400-e29b-41d4-a716-446655440000",
"expiresAt": "2026-02-05T12:00:00Z"
}OTP authentication
Step 2 Authenticate with OTP code
Returns a session ID that can be used to submit an authenticated action.
POST
/
v1
/
submit
/
otp-auth
Step 2 Authenticate with OTP code
curl --request POST \
--url https://sandbox.api.byzantine.fi/v1/submit/otp-auth \
--header 'Content-Type: application/json' \
--header 'X-Pubkey: <x-pubkey>' \
--header 'X-Pubkey, X-Timestamp, X-Signature: <api-key>' \
--header 'X-Signature: <x-signature>' \
--header 'X-Timestamp: <x-timestamp>' \
--data '
{
"accountId": "550e8400-e29b-41d4-a716-446655440000",
"userId": "550e8400-e29b-41d4-a716-446655440000",
"otpId": "otp_a1b2c3d4567890abcdef",
"otpCode": "123456789"
}
'import requests
url = "https://sandbox.api.byzantine.fi/v1/submit/otp-auth"
payload = {
"accountId": "550e8400-e29b-41d4-a716-446655440000",
"userId": "550e8400-e29b-41d4-a716-446655440000",
"otpId": "otp_a1b2c3d4567890abcdef",
"otpCode": "123456789"
}
headers = {
"X-Pubkey": "<x-pubkey>",
"X-Timestamp": "<x-timestamp>",
"X-Signature": "<x-signature>",
"X-Pubkey, X-Timestamp, X-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Pubkey': '<x-pubkey>',
'X-Timestamp': '<x-timestamp>',
'X-Signature': '<x-signature>',
'X-Pubkey, X-Timestamp, X-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
accountId: '550e8400-e29b-41d4-a716-446655440000',
userId: '550e8400-e29b-41d4-a716-446655440000',
otpId: 'otp_a1b2c3d4567890abcdef',
otpCode: '123456789'
})
};
fetch('https://sandbox.api.byzantine.fi/v1/submit/otp-auth', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"session": "<string>",
"sessionId": "550e8400-e29b-41d4-a716-446655440000",
"expiresAt": "2026-02-05T12:00:00Z"
}Authorizations
Headers
Integrator's ECDSA public key (P-256 curve, compressed SEC1 format). Example: 0x038fedef7c12f93bbf342ad8943b7a825a3b41f61c9dc118b2c718efebabbf62fd
Unix timestamp in seconds (UTC). Must be within tolerance window (1 minute) to prevent replay attacks. Example: 1760375826
ECDSA signature (DER-encoded, hex with 0x prefix). Signs the message: {timestamp}{METHOD}{path_and_query}{json_body}. Example: 0x3045022100...
Body
application/json
Authenticate with OTP code
Request to authenticate with OTP code
A UUID string
Example:
"550e8400-e29b-41d4-a716-446655440000"
A UUID string
Example:
"550e8400-e29b-41d4-a716-446655440000"
The OTP ID returned by init-otp
Example:
"otp_a1b2c3d4567890abcdef"
The OTP code received by email
Example:
"123456789"

