Skip to content
Download OpenAPI JSON

Register one non-PII payslip record

POST
/v1/registerNonPII
curl --request POST \
--url https://register.verifiabl.io/v1/registerNonPII \
--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": "AAECAwQFBgcICQoL", "tag": "UFFSU1RVVldYWVpbXF1eXw" } }'

Registers a non-PII payslip and its encryption metadata. A provider-supplied Verifiabl reference makes retries idempotent.

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.

Media typeapplication/json
One of:
AU payslip v1
object
schema
required
string
Allowed values: au.payslip.v1
payslip_non_pii
required
object
period_start
required
string format: date
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$/
period_end
required
string format: date
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$/
payment_date
required
string format: date
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$/
currency
required
string
Allowed values: AUD NZD USD GBP EUR CAD SGD HKD CHF ZAR
gross_cents
required
integer
>= -9007199254740991 <= 9007199254740991
paygw_cents
required
integer
>= -9007199254740991 <= 9007199254740991
net_cents
required
integer
>= -9007199254740991 <= 9007199254740991
ytd_gross_cents
required
integer
>= -9007199254740991 <= 9007199254740991
ytd_paygw_cents
required
integer
>= -9007199254740991 <= 9007199254740991
pay_frequency
string
Allowed values: weekly fortnightly monthly quarterly
employment_basis
string
Allowed values: full_time part_time casual labour_hire voluntary_agreement death_beneficiary non_employee
engagement_type
string
Allowed values: permanent fixed_term
hourly
object
ordinary_rate_cents
required
integer
>= -9007199254740991 <= 9007199254740991
hours
required
number
amount_cents
required
integer
>= -9007199254740991 <= 9007199254740991
annual_rate_cents
integer
>= -9007199254740991 <= 9007199254740991
taxable_gross_cents
integer
>= -9007199254740991 <= 9007199254740991
stsl_withholding_cents
integer
>= -9007199254740991 <= 9007199254740991
earnings
Array
One of:
Paid leave
object
type
required
string
Allowed values: paid_leave
leave_type
required
string
Allowed values: cash_out_in_service unused_on_termination paid_parental workers_compensation ancillary_defence other_paid_leave
amount_cents
required
integer
>= -9007199254740991 <= 9007199254740991
units
number
rate_cents
integer
>= -9007199254740991 <= 9007199254740991
salary_sacrifice
Array<object>
object
type
required
string
Allowed values: super other
amount_cents
required
integer
>= -9007199254740991 <= 9007199254740991
deductions
Array<object>
object
type
required
string
Allowed values: union_professional_fees workplace_giving child_support_deduction child_support_garnishee other_post_tax
amount_cents
required
integer
>= -9007199254740991 <= 9007199254740991
superannuation
Array<object>
object
contribution_type
required
string
Allowed values: superannuation_guarantee resc salary_sacrifice
amount_cents
required
integer
>= -9007199254740991 <= 9007199254740991
usi
string
/^(\d{14}|[A-Z]{3}\d{4}[A-Z]{2})$/
fund_abn
string
/^\d{11}$/
reimbursements_cents
integer
>= -9007199254740991 <= 9007199254740991
ytd
object
taxable_cents
integer
>= -9007199254740991 <= 9007199254740991
super_cents
integer
>= -9007199254740991 <= 9007199254740991
non_taxable_cents
integer
>= -9007199254740991 <= 9007199254740991
post_tax_deductions_cents
integer
>= -9007199254740991 <= 9007199254740991
reimbursements_cents
integer
>= -9007199254740991 <= 9007199254740991
issued_at
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$/
encryption_metadata
required
object
iv
required
string
>= 16 characters <= 16 characters /^[A-Za-z0-9_-]+$/
tag
required
string
>= 22 characters <= 22 characters /^[A-Za-z0-9_-]+$/
key_version
string
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.[1-9][0-9]{0,5}$/
verifiabl_reference
string
>= 22 characters <= 22 characters /^[A-Za-z0-9_-]+$/
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": "AAECAwQFBgcICQoL",
"tag": "UFFSU1RVVldYWVpbXF1eXw"
}
}

An identical provider-referenced record already existed.

Media typeapplication/json
object
verifiabl_reference
required
string
>= 22 characters <= 22 characters /^[A-Za-z0-9_-]+$/
Examples
ExampleSuccess

Registered payslip

{
"verifiabl_reference": "n5waC35dPCoRtMXW5_gJqw"
}

The record was created.

Media typeapplication/json
object
verifiabl_reference
required
string
>= 22 characters <= 22 characters /^[A-Za-z0-9_-]+$/
Examples
ExampleSuccess

Registered payslip

{
"verifiabl_reference": "n5waC35dPCoRtMXW5_gJqw"
}

The request failed strict validation.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: VALIDATION_FAILED
reason
string
detail
string
field_errors
Array<object>
object
path
required
string
message
required
string
Examples
ExampleValidation Failed

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.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: UNAUTHORIZED
reason
string
detail
string
field_errors
Array<object>
object
path
required
string
message
required
string
Examples
ExampleUnauthorized

The bearer token is missing or invalid.

{
"error": "Unauthorized",
"code": "UNAUTHORIZED"
}

The authenticated principal cannot use this operation.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: FORBIDDEN
reason
string
detail
string
field_errors
Array<object>
object
path
required
string
message
required
string
Examples
ExampleForbidden

The authenticated principal cannot use this operation.

{
"error": "Forbidden",
"code": "FORBIDDEN"
}

The reference conflicts with another record, or the IV has already been used.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: CONFLICT IV_REUSED
reason
string
detail
string
field_errors
Array<object>
object
path
required
string
message
required
string
Examples

The reference is registered with different data

{
"error": "Conflict",
"code": "CONFLICT",
"detail": "verifiabl_reference already registered with different data"
}

The JSON request body exceeds the route limit.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: PAYLOAD_TOO_LARGE
reason
string
detail
string
field_errors
Array<object>
object
path
required
string
message
required
string
Examples
ExamplePayload Too Large

The JSON request body exceeds the route limit.

{
"error": "Request body too large",
"code": "PAYLOAD_TOO_LARGE"
}

The request Content-Type is not supported.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: UNSUPPORTED_MEDIA_TYPE
reason
string
detail
string
field_errors
Array<object>
object
path
required
string
message
required
string
Examples
ExampleUnsupported Media Type

The request Content-Type is not supported.

{
"error": "Unsupported media type",
"code": "UNSUPPORTED_MEDIA_TYPE"
}

The request exceeded an IP or client rate limit.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: RATE_LIMITED
reason
string
detail
string
field_errors
Array<object>
object
path
required
string
message
required
string
Examples
ExampleRate Limited

The request exceeded an IP or client rate limit.

{
"error": "Too many requests",
"code": "RATE_LIMITED",
"detail": "Retry after the rate limit resets."
}
Retry-After
required
integer
<= 9007199254740991

Seconds to wait before retrying.

Example
60

An unexpected internal error occurred.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: INTERNAL_ERROR
reason
string
detail
string
field_errors
Array<object>
object
path
required
string
message
required
string
Examples
ExampleInternal Error

An unexpected internal error occurred.

{
"error": "Internal server error",
"code": "INTERNAL_ERROR"
}

A required service dependency or configuration is unavailable.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed values: SERVICE_UNAVAILABLE
reason
string
detail
string
field_errors
Array<object>
object
path
required
string
message
required
string
Examples
ExampleService Unavailable

A required service dependency or configuration is unavailable.

{
"error": "Service temporarily unavailable",
"code": "SERVICE_UNAVAILABLE",
"detail": "Please retry with exponential backoff."
}
Retry-After
required
integer
<= 9007199254740991

Seconds to wait before retrying.

Example
5