Skip to main content
GET
{base_url}
/
otk-service
/
v1
/
certificates
/
:journeyToken
Get Certificate
curl --request GET \
  --url https://api.example.com/{base_url}/otk-service/v1/certificates/:journeyToken \
  --header 'Accept: <accept>' \
  --header 'Content-Type: <content-type>' \
  --header 'x-transaction-key: <x-transaction-key>'
{
    "success": true,
    "data": {
        "uaekyc_id": 12345,
        "certificate_base64": "data:image/jpeg;base64,/9j/4AAQ...",
        "certificate_etag": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
        "issued_on": "2025-01-15T10:30:45.123Z",
        "expires_on": "2026-01-15T10:30:45.123Z",
        "active_status": {
            "code": "ACTIVE",             // ACTIVE | REVOKED | EXPIRED
            "messages": ""
        },
        "last_updated": "2025-01-15T14:30:45.123456+04:00"
    },
    "message": "Retrieved certificate details successfully",
    "signature": "abcdef123...",
    "meta": { "timestamp": "2025-05-13T10:15:30.456Z", "filters": {} },
    "errors": []
}
Certificates are valid for one year from issuance. When revoked or expired, certificate_base64 and certificate_etag will be null.

Authentication

x-transaction-key
string
required
Your API key. Get your key →
Accept
string
required
Must be application/json
Content-Type
string
required
Must be application/json

Path Parameters

journeyToken
string
required
UUID v4 of the journey from the Create Journey API (36 characters).

Code Examples

curl "{base_url}/otk-service/v1/certificates/{journeyToken}" \
  -H "x-transaction-key: your-api-key" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json"

Response Fields

FieldTypePresenceDescription
successbooleanAlwaysWhether the request was successful.
messagestringAlwaysHuman-readable status message.
data.uaekyc_idintegerAlwaysUnique UAE KYC identifier for this customer (same as uaeKycId in the Customer Details API, different casing).
data.certificate_base64string (Base64)OptionalJPEG, typically 100–800 KB. Base64-encoded certificate image. null when the certificate is revoked or expired.
data.certificate_etagstringOptionalETag hash for client-side caching (32 characters). null when revoked or expired.
data.issued_onstring (ISO 8601)AlwaysCertificate issuance date.
data.expires_onstring (ISO 8601)AlwaysCertificate expiration date. Certificates are valid for one year from issuance.
data.active_status.codestringAlwaysCertificate status: ACTIVE (valid), REVOKED (manually revoked), or EXPIRED (past expiry date).
data.active_status.messagesstringAlwaysAdditional context about the certificate status (empty when active).
data.last_updatedstring (ISO 8601)AlwaysTimestamp of the last modification to this certificate record.
signaturestringAlwaysCryptographic signature for response verification.
meta.timestampstring (ISO 8601)AlwaysServer-side timestamp of the response.
errorsarrayAlwaysList of error objects. Each contains code, type, and message.

Next Steps

1
Check active_status.code before using the certificate
2
  • ACTIVE → The certificate is valid. Display or use it for downstream processes.
  • REVOKED → Do not display. certificate_base64 will be null.
  • EXPIRED → Initiate a Re-KYC journey to issue a new one.
  • 3
    Cache the certificate using the ETag
    4
    Use certificate_etag for client-side caching. Compare the ETag on subsequent requests to avoid downloading the same image repeatedly.
    5
    Monitor certificate expiry
    6
    Store expires_on in your system and set up reminders or automated Re-KYC flows before certificates expire. Use the Stale Residents API to identify customers approaching expiry.
    7
    Verify the response signature
    8
    Use the signature field to verify response integrity before displaying or storing the certificate.
    {
        "success": true,
        "data": {
            "uaekyc_id": 12345,
            "certificate_base64": "data:image/jpeg;base64,/9j/4AAQ...",
            "certificate_etag": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
            "issued_on": "2025-01-15T10:30:45.123Z",
            "expires_on": "2026-01-15T10:30:45.123Z",
            "active_status": {
                "code": "ACTIVE",             // ACTIVE | REVOKED | EXPIRED
                "messages": ""
            },
            "last_updated": "2025-01-15T14:30:45.123456+04:00"
        },
        "message": "Retrieved certificate details successfully",
        "signature": "abcdef123...",
        "meta": { "timestamp": "2025-05-13T10:15:30.456Z", "filters": {} },
        "errors": []
    }