Check server time
curl --request GET \
--url https://txengine.bloobank.com/txengine/v1/time \
--header 'X-Access-Signature: <api-key>'import requests
url = "https://txengine.bloobank.com/txengine/v1/time"
headers = {"X-Access-Signature": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Access-Signature': '<api-key>'}};
fetch('https://txengine.bloobank.com/txengine/v1/time', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://txengine.bloobank.com/txengine/v1/time",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Signature: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://txengine.bloobank.com/txengine/v1/time"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Signature", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://txengine.bloobank.com/txengine/v1/time")
.header("X-Access-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://txengine.bloobank.com/txengine/v1/time")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"time": "2026-08-05T12:00:00.000Z",
"epochMs": 1754392800000
}{
"error": {
"code": 500,
"status": "INTERNAL",
"message": "An unexpected error occurred.",
"details": [
{
"reason": "INTERNAL",
"description": "Internal server error.",
"metadata": {
"id": "exc_5KaHsBxYzW3pM2dV"
}
}
]
}
}{
"error": {
"code": 503,
"status": "PROVIDER_UNAVAILABLE",
"message": "Upstream payment provider is unavailable.",
"details": [
{
"reason": "PROVIDER_UNAVAILABLE",
"description": "The provider returned a transient error or did not respond.",
"metadata": {
"id": "exc_5KaHsBxYzW3pM2dV"
}
}
]
}
}Utilities
Check Server Time
Returns the server’s current time so clients can measure clock skew
before signing requests. Compare epochMs against your local clock
and apply the resulting offset when generating X-Access-Timestamp,
which must stay within the tolerance defined by the Integration Guide.
This endpoint requires no authentication — it can be called before any credentials are provisioned.
GET
/
time
Check server time
curl --request GET \
--url https://txengine.bloobank.com/txengine/v1/time \
--header 'X-Access-Signature: <api-key>'import requests
url = "https://txengine.bloobank.com/txengine/v1/time"
headers = {"X-Access-Signature": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Access-Signature': '<api-key>'}};
fetch('https://txengine.bloobank.com/txengine/v1/time', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://txengine.bloobank.com/txengine/v1/time",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Signature: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://txengine.bloobank.com/txengine/v1/time"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Signature", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://txengine.bloobank.com/txengine/v1/time")
.header("X-Access-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://txengine.bloobank.com/txengine/v1/time")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"time": "2026-08-05T12:00:00.000Z",
"epochMs": 1754392800000
}{
"error": {
"code": 500,
"status": "INTERNAL",
"message": "An unexpected error occurred.",
"details": [
{
"reason": "INTERNAL",
"description": "Internal server error.",
"metadata": {
"id": "exc_5KaHsBxYzW3pM2dV"
}
}
]
}
}{
"error": {
"code": 503,
"status": "PROVIDER_UNAVAILABLE",
"message": "Upstream payment provider is unavailable.",
"details": [
{
"reason": "PROVIDER_UNAVAILABLE",
"description": "The provider returned a transient error or did not respond.",
"metadata": {
"id": "exc_5KaHsBxYzW3pM2dV"
}
}
]
}
}Use this endpoint to measure the offset between your host’s clock and the Bloobank server clock. The signed
X-Access-Timestamp header must stay within ±10 seconds of server time, so checking the offset before your first authenticated call — and periodically thereafter — prevents intermittent TIMESTAMP_SKEW_EXCEEDED rejections.
This endpoint requires no authentication: no signing headers, no credentials. That also makes it a convenient connectivity check before onboarding is complete.
Recommended usage
- Call
GET /timeand read your local clock immediately around the call. - Compute
offset = epochMs − localTimeMs(optionally correct for half the round-trip). - Apply the offset when signing:
X-Access-Timestamp = Date.now() + offset. - Re-check periodically — and on any
TIMESTAMP_SKEW_EXCEEDEDerror — since clocks drift.
epochMs field uses the exact same representation as X-Access-Timestamp (Unix epoch milliseconds, UTC), so it compares directly against Date.now() and equivalents.
For the platform’s time model, see Date & time. If your requests are rejected with clock-related errors, see Troubleshooting.Authorizations
Response
The current server time.
Snapshot of the server's current time, used to measure clock skew before signing requests.
Current server time as an ISO 8601 UTC string with millisecond precision.
Example:
"2026-08-05T12:00:00.000Z"
Current server time in milliseconds since the Unix epoch — the same format expected in the X-Access-Timestamp header.
Example:
1754392800000