Register a batch of non-PII payslip records
const url = 'https://register.verifiabl.io/v1/registerNonPIIBatch';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"records":[{"verifiabl_reference":"K3mXq8Rt2pLz9wQv1AYb_w","external_id":"payslip-84213","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":"QEFCQ0RFRkdISUpL","tag":"oKGio6SlpqeoqaqrrK2urw"}}]}'};
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/registerNonPIIBatch \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "records": [ { "verifiabl_reference": "K3mXq8Rt2pLz9wQv1AYb_w", "external_id": "payslip-84213", "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": "QEFCQ0RFRkdISUpL", "tag": "oKGio6SlpqeoqaqrrK2urw" } } ] }'Registers up to 1,000 records with ordered per-record outcomes. Record-level validation failures are represented in the successful response.
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
Examples
One record from a pay run (replace all encryption outputs)
{ "records": [ { "verifiabl_reference": "K3mXq8Rt2pLz9wQv1AYb_w", "external_id": "payslip-84213", "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": "QEFCQ0RFRkdISUpL", "tag": "oKGio6SlpqeoqaqrrK2urw" } } ]}Responses
Section titled “ Responses ”The batch was processed.
object
object
object
object
Examples
Created, duplicate, and rejected records
{ "results": [ { "status": "created", "verifiabl_reference": "K3mXq8Rt2pLz9wQv1AYb_w", "external_id": "payslip-84213" }, { "status": "duplicate", "verifiabl_reference": "B2nYr7St3qMa0xRw2BdEfg", "external_id": "payslip-84214" }, { "status": "error", "code": "VALIDATION_FAILED", "detail": "payslip_non_pii does not conform to au.payslip.v1: net_cents: Invalid input: expected int, received number", "verifiabl_reference": "C3oZs8Tu4rNb1ySx3CgHij", "external_id": "payslip-84215" }, { "status": "error", "code": "CONFLICT", "detail": "verifiabl_reference already registered with different data", "verifiabl_reference": "D4pAt9Uv5sOc2zTy4DhIjk", "external_id": "payslip-84216" }, { "status": "error", "code": "IV_REUSED", "detail": "encryption_metadata.iv has already been used by this issuer; re-encrypt the record with a fresh iv", "verifiabl_reference": "E5qBu0Vw6tPd3aUz5EiJkl", "external_id": "payslip-84217" } ]}The batch request envelope failed strict validation.
object
object
Examples
The batch request envelope failed strict validation.
{ "error": "Validation failed", "code": "VALIDATION_FAILED", "field_errors": [ { "path": "records", "message": "records must contain at least one record" } ]}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 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"}The instance has reached its concurrent batch limit.
object
object
Examples
The instance has reached its concurrent batch limit.
{ "error": "Service temporarily unavailable", "code": "SERVICE_UNAVAILABLE", "detail": "Please retry with exponential backoff."}Headers
Section titled “Headers”Seconds to wait before retrying.
Example
5