RemittaxSign inBook a demo

Remittax API

Push vendors and invoices from your ERP, raise requests, and pull status, acknowledgements and the filed forms back. Every endpoint lives under https://apps.remittax.com/api/v1.

Machine-readable: openapi.json (OpenAPI 3.1).

Getting started

Keys

A firm or client admin creates keys under Settings → API keys. Send the key on every request as Authorization: Bearer rmx_live_…; test keys start rmx_test_. A key acts for its organisation: a firm key sees the client groups the firm serves (or the ones it was limited to), a client key sees its own group. Revoked or expired keys get 401 at once.

Scopes

Each endpoint names the scope it needs. A write scope includes its read scope. Without the scope the answer is 403 with code missing_permission.

  • certificates:read
  • certificates:write
  • vendors:read
  • vendors:write
  • invoices:read
  • invoices:write
  • companies:read
  • documents:read
  • documents:write

JSON, money and dates

Keys are snake_case. Money is a decimal string such as "24500.00", never a float. Dates are 2026-10-20 and times are ISO 8601 in UTC.

Pages

Lists return { "data": [...], "next_cursor": "..." }. Pass limit (up to 100, default 50) and the cursor from the last page to get the next; next_cursor is null on the last page.

Safe retries

Every POST needs an Idempotency-Key header, any unique string such as a UUID. Retrying with the same key and body returns the first response and creates nothing twice, for 24 hours. The same key with a different body gets 422 idempotency_key_reused.

Rate limits

Each key may make 600 requests a minute unless agreed otherwise. Responses carry RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; over the limit, a 429 says how long to wait in Retry-After.

Errors

Errors are application/problem+json with a stable code. Validation errors list each problem at its path. A 409 means someone changed the record first: read it again and resend with the new expected_version.

{
  "type": "https://remittax.com/problems/validation_failed",
  "title": "Validation failed",
  "status": 400,
  "code": "validation_failed",
  "detail": "Check the body.",
  "errors": [
    {
      "path": "body.currency",
      "message": "Use a 3-letter currency code."
    }
  ]
}

Each code is listed under Error codes.

Uploading files

Files never travel in the JSON body. Ask for an upload URL, PUT the file to it with its content type, then record it with the path you were given.

Certificates

Requests and certificates: create, move through the stages, record acknowledgements, download the forms, and match payments to invoices.

GET/api/v1/certificates

List certificates

Newest first. Filter by client group, company or stage, or changes since a time.

Scope: certificates:read

Parameters

client_group_id
uuid · queryoptionalOnly this client group.
limit
string · queryoptionalHow many to return, 1 to 100. Default 50.
cursor
string · queryoptionalThe next_cursor from the previous page.
company_id
uuid · queryoptionalOnly this company.
stage
draft | in_progress | on_hold | ready_to_file | form_145_pending | filed | rejected · queryoptional
updated_since
date-time · queryoptionalOnly certificates changed at or after this time.

Returns 200: { "data": [ … ], "next_cursor": "…" or null }

curl "https://apps.remittax.com/api/v1/certificates?limit=50" \
  -H "Authorization: Bearer $REMITTAX_KEY"
POST/api/v1/certificates

Raise a request

Creates a draft certificate for a company. A firm key may leave out ca_firm_id.

Scope: certificates:write

Body

company_id
uuidrequired
ca_firm_id
uuidoptional
vendor_id
uuid or nulloptional
bank_account_id
uuid or nulloptional
signatory_id
uuid or nulloptional
nature_code
string or nulloptional
country_code
string or nulloptionalISO 3166 alpha-2 such as DE, or the income-tax portal's code such as 49. Kept and returned as the portal code.
currency
stringrequired
amount
decimal stringrequired
fx_rate
decimal string or nulloptional
proposed_date
date or nulloptional
accrual_date
date or nulloptional
deduction_date
date or nulloptional
recorded_in_books
booleanoptional
grossed_up
booleanoptional
client_notes
string or nulloptional
details
string or nulloptional
tags
array of stringoptional
allocations
array of objectoptional

Returns 201: the created record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/certificates" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "company_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
    "ca_firm_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
    "vendor_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
    "bank_account_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
    "signatory_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
    "nature_code": "16.21",
    "country_code": "DE",
    "currency": "EUR",
    "amount": "24500.00",
    "fx_rate": "24500.00",
    "proposed_date": "2026-10-20",
    "accrual_date": "2026-10-20",
    "deduction_date": "2026-10-20",
    "recorded_in_books": false,
    "grossed_up": false,
    "client_notes": "Second instalment of the annual licence fee",
    "details": "x",
    "tags": [
      "x"
    ],
    "allocations": [
      {
        "invoice_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
        "amount": "24500.00"
      }
    ]
  }'
GET/api/v1/certificates/{id}

Get a certificate

Scope: certificates:read

Parameters

id
uuid · pathrequired

Returns 200: the record as JSON.

curl "https://apps.remittax.com/api/v1/certificates/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a" \
  -H "Authorization: Bearer $REMITTAX_KEY"
POST/api/v1/certificates/{id}/stage

Move a certificate

Accept (in_progress), hold (on_hold, with a note), reject (rejected, with a note), mark ready_to_file or reopen (draft). Send the version you read; a newer version gets 409 version_conflict.

Scope: certificates:write

Parameters

id
uuid · pathrequired

Body

to
draft | in_progress | on_hold | ready_to_file | form_145_pending | filed | rejectedrequired
note
string or nulloptional
expected_version
integerrequired

Returns 200: the record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/certificates/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/stage" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "draft",
    "note": "Filed on the portal",
    "expected_version": 1
  }'
POST/api/v1/certificates/{id}/acknowledgements

Record a Form 146 or Form 145 acknowledgement

Scope: certificates:write

Parameters

id
uuid · pathrequired

Body when form is form146

form
"form146"required
ack_no
stringrequired
filed_on
daterequired
udin
stringrequired
has_ao_order
booleanoptional
expected_version
integerrequired

Body when form is form145

form
"form145"required
ack_no
stringrequired
filed_on
daterequired
expected_version
integerrequired

Returns 200: the record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/certificates/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/acknowledgements" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "form": "form146",
    "ack_no": "x",
    "filed_on": "2026-10-20",
    "udin": "x",
    "has_ao_order": false,
    "expected_version": 1
  }'
GET/api/v1/certificates/{id}/files/{kind}

Download a certificate's file

Form 146 JSON, Form 145 data, the PDF certificate, or (certificates made before Form 146) 15CB/15CA XML.

Scope: certificates:read

Parameters

id
uuid · pathrequired
kind
form146 | form145 | pdf | 15cb-xml | 15ca-xml · pathrequired

Returns 200: the file, with a Content-Disposition file name.

curl "https://apps.remittax.com/api/v1/certificates/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/files/form146" \
  -H "Authorization: Bearer $REMITTAX_KEY"
POST/api/v1/certificates/{id}/allocations

Pay an invoice from a certificate

Scope: certificates:write

Parameters

id
uuid · pathrequired

Body

invoice_id
uuidrequired
amount
decimal stringrequired

Returns 201: the created record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/certificates/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/allocations" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "invoice_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
    "amount": "24500.00"
  }'
PATCH/api/v1/allocations/{id}

Change an allocation's amount

Scope: certificates:write

Parameters

id
uuid · pathrequired

Body

amount
decimal stringrequired

Returns 200: the record as JSON.

curl -X PATCH "https://apps.remittax.com/api/v1/allocations/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "24500.00"
  }'
DELETE/api/v1/allocations/{id}

Remove an allocation

Scope: certificates:write

Parameters

id
uuid · pathrequired

Returns 204: nothing is returned.

curl -X DELETE "https://apps.remittax.com/api/v1/allocations/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a" \
  -H "Authorization: Bearer $REMITTAX_KEY"

Vendors

The foreign parties paid, with their TRC, Form 10F and no-PE declarations.

GET/api/v1/vendors

List vendors

Scope: vendors:read

Parameters

client_group_id
uuid · queryoptionalOnly this client group.
limit
string · queryoptionalHow many to return, 1 to 100. Default 50.
cursor
string · queryoptionalThe next_cursor from the previous page.

Returns 200: { "data": [ … ], "next_cursor": "…" or null }

curl "https://apps.remittax.com/api/v1/vendors?limit=50" \
  -H "Authorization: Bearer $REMITTAX_KEY"
POST/api/v1/vendors

Add a vendor

Scope: vendors:write

Body

client_group_id
uuidoptional
name
stringrequired
entity_type
company | individual or nulloptional
salutation
string or nulloptional
pan
string or nulloptional
tax_id
string or nulloptional
default_currency
string or nulloptional
flat_door_block
string or nulloptional
premises
string or nulloptional
road
string or nulloptional
area
string or nulloptional
city
string or nulloptional
region
string or nulloptional
postal_code
string or nulloptional
country_code
string or nulloptionalISO 3166 alpha-2 such as DE, or the income-tax portal's code such as 49. Kept and returned as the portal code.
email
string or nulloptional
phone
string or nulloptional
external_ref
string or nulloptional

Returns 201: the created record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/vendors" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "client_group_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
    "name": "Nordlicht GmbH",
    "entity_type": "company",
    "salutation": "x",
    "pan": "AAACN1234Q",
    "tax_id": "x",
    "default_currency": "EUR",
    "flat_door_block": "x",
    "premises": "x",
    "road": "x",
    "area": "x",
    "city": "x",
    "region": "x",
    "postal_code": "x",
    "country_code": "DE",
    "email": "accounts@example.com",
    "phone": "x",
    "external_ref": "x"
  }'
GET/api/v1/vendors/{id}

Get a vendor with its tax documents

Scope: vendors:read

Parameters

id
uuid · pathrequired

Returns 200: the record as JSON.

curl "https://apps.remittax.com/api/v1/vendors/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a" \
  -H "Authorization: Bearer $REMITTAX_KEY"
PATCH/api/v1/vendors/{id}

Change a vendor

Send only the fields to change; null clears a field.

Scope: vendors:write

Parameters

id
uuid · pathrequired

Body

name
stringoptional
entity_type
company | individual or nulloptional
salutation
string or nulloptional
pan
string or nulloptional
tax_id
string or nulloptional
default_currency
string or nulloptional
flat_door_block
string or nulloptional
premises
string or nulloptional
road
string or nulloptional
area
string or nulloptional
city
string or nulloptional
region
string or nulloptional
postal_code
string or nulloptional
country_code
string or nulloptionalISO 3166 alpha-2 such as DE, or the income-tax portal's code such as 49. Kept and returned as the portal code.
email
string or nulloptional
phone
string or nulloptional
external_ref
string or nulloptional

Returns 200: the record as JSON.

curl -X PATCH "https://apps.remittax.com/api/v1/vendors/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Nordlicht GmbH",
    "entity_type": "company",
    "salutation": "x",
    "pan": "AAACN1234Q",
    "tax_id": "x",
    "default_currency": "EUR",
    "flat_door_block": "x",
    "premises": "x",
    "road": "x",
    "area": "x",
    "city": "x",
    "region": "x",
    "postal_code": "x",
    "country_code": "DE",
    "email": "accounts@example.com",
    "phone": "x",
    "external_ref": "x"
  }'
POST/api/v1/vendors/{id}/documents/uploads

Get an upload URL for a tax document

PUT the file to upload_url with the content type, then record it.

Scope: vendors:write

Parameters

id
uuid · pathrequired

Body

file_name
stringrequired
size
integerrequired

Returns 201: the created record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/vendors/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/documents/uploads" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "file_name": "trc-2026.pdf",
    "size": 182044
  }'
POST/api/v1/vendors/{id}/documents

Record a vendor's TRC, Form 10F or no-PE declaration

Scope: vendors:write

Parameters

id
uuid · pathrequired

Body

financial_year
stringrequired
kind
trc | form_10f | no_perequired
status
provided | not_applicablerequired
valid_until
date or nulloptional
signed_on
date or nulloptional
path
string or nulloptional
file_name
string or nulloptional

Returns 201: the created record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/vendors/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/documents" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "financial_year": "2026-27",
    "kind": "trc",
    "status": "provided",
    "valid_until": "2026-10-20",
    "signed_on": "2026-10-20",
    "path": "x",
    "file_name": "trc-2026.pdf"
  }'

Invoices

Vendor invoices and what is still open on each.

GET/api/v1/invoices

List invoices

Scope: invoices:read

Parameters

client_group_id
uuid · queryoptionalOnly this client group.
limit
string · queryoptionalHow many to return, 1 to 100. Default 50.
cursor
string · queryoptionalThe next_cursor from the previous page.
vendor_id
uuid · queryoptional
status
unpaid | part_paid | paid · queryoptional

Returns 200: { "data": [ … ], "next_cursor": "…" or null }

curl "https://apps.remittax.com/api/v1/invoices?limit=50" \
  -H "Authorization: Bearer $REMITTAX_KEY"
POST/api/v1/invoices

Add an invoice

Scope: invoices:write

Body

company_id
uuidrequired
vendor_id
uuidrequired
number
stringrequired
invoice_date
date or nulloptional
currency
stringrequired
total_amount
decimal stringrequired
description
string or nulloptional

Returns 201: the created record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/invoices" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "company_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
    "vendor_id": "3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a",
    "number": "INV-2026-0142",
    "invoice_date": "2026-10-20",
    "currency": "EUR",
    "total_amount": "24500.00",
    "description": "Engineering services, September 2026"
  }'
GET/api/v1/invoices/{id}

Get an invoice with its balance

Scope: invoices:read

Parameters

id
uuid · pathrequired

Returns 200: the record as JSON.

curl "https://apps.remittax.com/api/v1/invoices/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a" \
  -H "Authorization: Bearer $REMITTAX_KEY"
PATCH/api/v1/invoices/{id}

Change an invoice, with a reason

Every change is kept in the invoice's history with the reason. Send the version you read.

Scope: invoices:write

Parameters

id
uuid · pathrequired

Body

number
stringoptional
invoice_date
date or nulloptional
currency
stringoptional
total_amount
decimal stringoptional
description
string or nulloptional
reason
stringrequired
expected_version
integerrequired

Returns 200: the record as JSON.

curl -X PATCH "https://apps.remittax.com/api/v1/invoices/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "INV-2026-0142",
    "invoice_date": "2026-10-20",
    "currency": "EUR",
    "total_amount": "24500.00",
    "description": "Engineering services, September 2026",
    "reason": "Corrected the total",
    "expected_version": 1
  }'

Companies

The remitting companies and their bank accounts.

GET/api/v1/companies

List companies

Scope: companies:read

Parameters

client_group_id
uuid · queryoptionalOnly this client group.
limit
string · queryoptionalHow many to return, 1 to 100. Default 50.
cursor
string · queryoptionalThe next_cursor from the previous page.

Returns 200: { "data": [ … ], "next_cursor": "…" or null }

curl "https://apps.remittax.com/api/v1/companies?limit=50" \
  -H "Authorization: Bearer $REMITTAX_KEY"
GET/api/v1/companies/{id}/bank_accounts

List a company's bank accounts

Scope: companies:read

Parameters

id
uuid · pathrequired

Returns 200: the record as JSON.

curl "https://apps.remittax.com/api/v1/companies/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/bank_accounts" \
  -H "Authorization: Bearer $REMITTAX_KEY"

Documents

Files attached to a certificate. Files never travel in the JSON body: ask for an upload URL, PUT the file there, then record it.

POST/api/v1/certificates/{id}/documents/uploads

Get an upload URL for a certificate document

Scope: documents:write

Parameters

id
uuid · pathrequired

Body

file_name
stringrequired
size
integerrequired

Returns 201: the created record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/certificates/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/documents/uploads" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "file_name": "trc-2026.pdf",
    "size": 182044
  }'
POST/api/v1/certificates/{id}/documents

Record an uploaded certificate document

Scope: documents:write

Parameters

id
uuid · pathrequired

Body

kind
invoice | agreement | tax_opinion | form146_ack | form145_ack | otherrequired
file_name
stringrequired
path
stringrequired
size_bytes
integerrequired
mime_type
stringrequired

Returns 201: the created record as JSON.

curl -X POST "https://apps.remittax.com/api/v1/certificates/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/documents" \
  -H "Authorization: Bearer $REMITTAX_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "invoice",
    "file_name": "trc-2026.pdf",
    "path": "x",
    "size_bytes": 182044,
    "mime_type": "application/pdf"
  }'
GET/api/v1/documents/{id}/download

Get a download link

A signed link that works for 60 seconds.

Scope: documents:read

Parameters

id
uuid · pathrequired

Returns 200: the record as JSON.

curl "https://apps.remittax.com/api/v1/documents/3f6c2a9e-1b7d-4c55-9a43-2f8e0d6b1c7a/download" \
  -H "Authorization: Bearer $REMITTAX_KEY"

Error codes

missing_key
401No Authorization: Bearer header was sent.
key_invalid
401The key isn't one Remittax issued.
key_revoked
401The key was revoked.
key_expired
401The key has passed its expiry date.
key_firm_suspended
401The firm's access is suspended, so its keys are too.
missing_permission
403The key lacks the scope this endpoint needs.
validation_failed
400The query or body isn't valid; errors lists each problem at its path.
invalid_json
400The body isn't valid JSON.
invalid_cursor
400The cursor is from another list or was changed.
idempotency_key_required
400A POST was sent without an Idempotency-Key header.
idempotency_key_reused
422This Idempotency-Key was used with a different body.
idempotency_in_progress
409A request with this Idempotency-Key is still running; retry shortly.
not_found
404Nothing with this id, or the key can't see it.
rate_limited
429Too many requests this minute; wait Retry-After seconds.
unexpected
500Something went wrong on our side. Try again in a moment.
conflict
409That clashes with something that already exists.
in_use
409This is used by certificates, so it can't be removed.
invalid_reference
422One of the choices isn't valid any more. Reload the page and try again.
name_required
422Enter a name.
email_required
422Enter an email address.
already_member
422This person already has access here.
role_not_allowed
422That role isn't available here.
invitation_not_found
422This invitation link isn't valid. Ask for a new one.
invitation_expired
422This invitation has expired. Ask for a new one.
invitation_revoked
422This invitation was withdrawn. Ask for a new one.
invitation_accepted
422This invitation has already been accepted. Sign in to continue.
invitation_email_mismatch
422This invitation is for a different email address.
invitation_token_mismatch
422This invitation link isn't valid. Ask for a new one.
account_exists
422An account already exists for this email. Sign in to accept the invitation.
weak_password
422Choose a stronger password: at least 10 characters, and not one that is easy to guess.
firm_suspended
422This CA firm's access is suspended. Contact Remittax support.
last_firm_admin
422A firm needs at least one active firm admin. Make someone else a firm admin first.
invalid_status
422That status change isn't allowed.
company_in_other_group
422That company belongs to another client group.
membership_not_client_user
422Only client users are given companies.
membership_not_ca_staff
422Only CA staff are given client groups.
group_not_served_by_firm
422Your firm doesn't serve that client group.
companies_required
422Choose at least one company.
contact_in_other_group
422That contact belongs to another client group.
duplicate_contact
422A contact with this email already exists in this client group.
duplicate_external_ref
422Another vendor already uses this reference.
storage_path_invalid
422The uploaded file doesn't belong to this record. Upload it again.
file_type_not_allowed
422Upload a PDF, PNG, JPG, CSV or XLSX file.
file_too_large
422Files can be up to 20 MB.
file_empty
422That file is empty.
immutable_row
422This can't be changed.
no_client_group
422Choose a client group first.
version_conflict
409Someone else changed this certificate while you were looking at it. Reload the page and try again.
invalid_transition
409The certificate can't move to that stage from where it is now.
certificate_locked
409This certificate can't be edited at its current stage.
certificate_incomplete
422Add the vendor, bank account, amount, currency, exchange rate and proposed date first.
computation_incomplete
422Finish the tax computation first: basis, rate, certifying CA and the amounts.
computation_mismatch
422The tax computation no longer matches the amount. Save the computation again.
invoices_do_not_match
422The invoices paid by this certificate must add up to its amount.
tax_documents_missing
422The treaty rate needs the vendor's tax documents for this financial year. Add them, or use the Income-tax Act rate.
duplicate_ack_number
409That acknowledgement number is already recorded on another certificate.
duplicate_udin
422That UDIN is already recorded on another certificate.
invalid_ack_number
422An acknowledgement number has 15 or 16 digits.
invalid_udin
422A UDIN has 18 letters and digits.
invalid_filed_on
422The filing date can't be in the future, or before Form 146 was filed.
reason_required
422Give a reason.
rate_invalid
422A rate is at least 0% and below 100%.
currency_locked
422The currency can't change while invoices and certificates are linked to each other.
currency_mismatch
422The invoices are in a different currency from the certificate.
vendor_in_other_group
422That vendor belongs to another client group.
signatory_in_other_company
422That signatory belongs to another company.
bank_account_in_other_company
422That bank account belongs to another company.
ca_member_in_other_firm
422That chartered accountant belongs to another firm.
tag_in_other_group
422That tag belongs to another client group.
recipient_not_member
422That person can't see this certificate, so they can't get its updates.
firm_not_serving_group
422That CA firm doesn't serve this client group.
ca_firm_required
422Choose the CA firm that certifies this request.
invoice_over_allocated
422That pays more than the invoice still owes.
invoice_over_credited
422Credit notes and payments can't add up to more than the invoice total.
invoice_below_allocated
422The total can't be less than what certificates and credit notes already cover.
invoice_total_invalid
422Enter a total above zero.
invoice_in_other_group
422That invoice belongs to another client group.
allocation_amount_invalid
422Enter an amount above zero.
credit_note_amount_invalid
422Enter an amount above zero.
already_allocated
409This invoice is already on this certificate. Change its amount instead.
duplicate_invoice_number
409This vendor already has an invoice with that number.
output_not_available
422The 15CB and 15CA XML files are only for certificates made before Form 146.
too_many_certificates
422Download up to 200 certificates at a time.
message_empty
422Write a message first.
message_too_long
422Keep a message under 4,000 characters.
urgent_members_only
422Only the firm and client team can mark a message urgent.