Register a payslip and build its barcode badge
const url = 'https://register.verifiabl.io/v1/registerAndBuildBarcode';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"schema":"au.payslip.v1","issued_at":"2026-04-04T00:00:00.000Z","payslip_non_pii":{"period_start":"2026-03-21","period_end":"2026-04-03","payment_date":"2026-04-04","currency":"AUD","pay_frequency":"fortnightly","gross_cents":360000,"taxable_gross_cents":340000,"paygw_cents":75200,"net_cents":268250,"ytd_gross_cents":4320000,"ytd_paygw_cents":902400,"earnings":[{"type":"ordinary","units":76,"rate_cents":4000,"amount_cents":304000},{"type":"overtime","units":4,"rate_cents":6000,"amount_cents":24000},{"type":"allowance","allowance_type":"tools","amount_cents":4000},{"type":"paid_leave","leave_type":"other_paid_leave","amount_cents":28000}],"salary_sacrifice":[{"type":"super","amount_cents":20000}],"deductions":[{"type":"other_post_tax","amount_cents":4550}],"superannuation":[{"contribution_type":"superannuation_guarantee","amount_cents":39840,"usi":"STA0100AU"},{"contribution_type":"salary_sacrifice","amount_cents":20000,"usi":"STA0100AU"}],"reimbursements_cents":8000},"encryption_metadata":{"iv":"ICEiIyQlJicoKSor","tag":"eHl6e3x9fn-AgYKDhIWGhw"},"encrypted_pii":"Q2lwaGVydGV4dA"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://register.verifiabl.io/v1/registerAndBuildBarcode \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "schema": "au.payslip.v1", "issued_at": "2026-04-04T00:00:00.000Z", "payslip_non_pii": { "period_start": "2026-03-21", "period_end": "2026-04-03", "payment_date": "2026-04-04", "currency": "AUD", "pay_frequency": "fortnightly", "gross_cents": 360000, "taxable_gross_cents": 340000, "paygw_cents": 75200, "net_cents": 268250, "ytd_gross_cents": 4320000, "ytd_paygw_cents": 902400, "earnings": [ { "type": "ordinary", "units": 76, "rate_cents": 4000, "amount_cents": 304000 }, { "type": "overtime", "units": 4, "rate_cents": 6000, "amount_cents": 24000 }, { "type": "allowance", "allowance_type": "tools", "amount_cents": 4000 }, { "type": "paid_leave", "leave_type": "other_paid_leave", "amount_cents": 28000 } ], "salary_sacrifice": [ { "type": "super", "amount_cents": 20000 } ], "deductions": [ { "type": "other_post_tax", "amount_cents": 4550 } ], "superannuation": [ { "contribution_type": "superannuation_guarantee", "amount_cents": 39840, "usi": "STA0100AU" }, { "contribution_type": "salary_sacrifice", "amount_cents": 20000, "usi": "STA0100AU" } ], "reimbursements_cents": 8000 }, "encryption_metadata": { "iv": "ICEiIyQlJicoKSor", "tag": "eHl6e3x9fn-AgYKDhIWGhw" }, "encrypted_pii": "Q2lwaGVydGV4dA" }'Registers the non-PII record and returns a PNG barcode badge containing the transient ciphertext. The ciphertext and its derivatives are not persisted.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”The encryption values in these structural examples are non-submittable placeholders. For each payslip, perform one AES-256-GCM encryption with a fresh, unpredictable 96-bit IV from a cryptographically secure random number generator, then use that operation’s IV and authentication tag together with its ciphertext. Never copy, mix, or reuse the example encryption values.
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
Examples
Australian payslip (replace all encryption outputs)
{ "schema": "au.payslip.v1", "issued_at": "2026-04-04T00:00:00.000Z", "payslip_non_pii": { "period_start": "2026-03-21", "period_end": "2026-04-03", "payment_date": "2026-04-04", "currency": "AUD", "pay_frequency": "fortnightly", "gross_cents": 360000, "taxable_gross_cents": 340000, "paygw_cents": 75200, "net_cents": 268250, "ytd_gross_cents": 4320000, "ytd_paygw_cents": 902400, "earnings": [ { "type": "ordinary", "units": 76, "rate_cents": 4000, "amount_cents": 304000 }, { "type": "overtime", "units": 4, "rate_cents": 6000, "amount_cents": 24000 }, { "type": "allowance", "allowance_type": "tools", "amount_cents": 4000 }, { "type": "paid_leave", "leave_type": "other_paid_leave", "amount_cents": 28000 } ], "salary_sacrifice": [ { "type": "super", "amount_cents": 20000 } ], "deductions": [ { "type": "other_post_tax", "amount_cents": 4550 } ], "superannuation": [ { "contribution_type": "superannuation_guarantee", "amount_cents": 39840, "usi": "STA0100AU" }, { "contribution_type": "salary_sacrifice", "amount_cents": 20000, "usi": "STA0100AU" } ], "reimbursements_cents": 8000 }, "encryption_metadata": { "iv": "ICEiIyQlJicoKSor", "tag": "eHl6e3x9fn-AgYKDhIWGhw" }, "encrypted_pii": "Q2lwaGVydGV4dA"}New Zealand payslip (replace all encryption outputs)
{ "schema": "nz.payslip.v1", "issued_at": "2026-04-22T00:00:00.000Z", "payslip_non_pii": { "period_start": "2026-04-06", "period_end": "2026-04-19", "payment_date": "2026-04-22", "currency": "NZD", "pay_cycle": "fortnightly", "tax_code": "M SL", "employment_type": "permanent", "hours_paid": 80, "gross_cents": 300000, "paye_cents": 66000, "net_cents": 213500, "ytd_gross_cents": 300000, "ytd_paye_cents": 66000, "earnings": [ { "type": "ordinary", "units": 76, "rate_cents": 3750, "amount_cents": 285000 }, { "type": "overtime", "units": 4, "rate_cents": 3750, "amount_cents": 15000 } ], "student_loan_cents": 10000, "kiwisaver": { "employee_deduction_cents": 10500, "employee_rate_basis_points": 350, "employer_contribution_cents": 10500, "esct_cents": 1837 }, "leave_balances": { "annual": { "value": 4, "unit": "weeks" }, "sick": { "value": 10, "unit": "days" } } }, "encryption_metadata": { "iv": "MDEyMzQ1Njc4OTo7", "tag": "jI2Oj5CRkpOUlZaXmJmamw" }, "encrypted_pii": "Q2lwaGVydGV4dA"}Responses
Section titled “ Responses ”The record and barcode were created.
object
object
Examples
Generated barcode response (PNG data abbreviated)
{ "verifiabl_reference": "n5waC35dPCoRtMXW5_gJqw", "barcode": { "format": "png", "data": "<base64-encoded 720px PNG barcode badge>" }}The request failed strict validation.
object
object
Examples
The request failed strict validation.
{ "error": "Validation failed", "code": "VALIDATION_FAILED", "field_errors": [ { "path": "payslip_non_pii.net_cents", "message": "Invalid input: expected int, received number" }, { "path": "encryption_metadata.iv", "message": "IV must be exactly 16 base64url characters (96 bits)" } ]}The bearer token is missing or invalid.
object
object
Examples
The bearer token is missing or invalid.
{ "error": "Unauthorized", "code": "UNAUTHORIZED"}The authenticated principal cannot use this operation.
object
object
Examples
The authenticated principal cannot use this operation.
{ "error": "Forbidden", "code": "FORBIDDEN"}The IV has already been used by this issuer.
object
object
Examples
The IV has already been used by this issuer.
{ "error": "Conflict", "code": "IV_REUSED", "detail": "encryption_metadata.iv has already been used by this issuer; re-encrypt the record with a fresh iv"}The JSON request body exceeds the route limit.
object
object
Examples
The JSON request body exceeds the route limit.
{ "error": "Request body too large", "code": "PAYLOAD_TOO_LARGE"}The request Content-Type is not supported.
object
object
Examples
The request Content-Type is not supported.
{ "error": "Unsupported media type", "code": "UNSUPPORTED_MEDIA_TYPE"}The request exceeded an IP or client rate limit.
object
object
Examples
The request exceeded an IP or client rate limit.
{ "error": "Too many requests", "code": "RATE_LIMITED", "detail": "Retry after the rate limit resets."}Headers
Section titled “Headers”Seconds to wait before retrying.
Example
60An unexpected internal error occurred.
object
object
Examples
An unexpected internal error occurred.
{ "error": "Internal server error", "code": "INTERNAL_ERROR"}A required service dependency or configuration is unavailable.
object
object
Examples
A required service dependency or configuration is unavailable.
{ "error": "Service temporarily unavailable", "code": "SERVICE_UNAVAILABLE", "detail": "Please retry with exponential backoff."}Headers
Section titled “Headers”Seconds to wait before retrying.
Example
5