Extract data from withholding tax certificates
Withholding moves the moment tax is collected from filing time to payment time: the party making a payment holds back a slice and remits it to the tax authority on the recipient’s behalf. A withholding tax certificate is the record of that, the document a payer gives a recipient (and often the authority) showing the gross amount, the rate applied, the amount withheld, and the net actually paid. It is the source proof a recipient uses to claim credit for tax already paid, and it differs from a payroll tax filing (the employer’s aggregate remittance) and from a 1099-MISC (a US information return) in that it certifies a specific payment stream to a named recipient. The figures have to reconcile down the page. A certificate for tax year 2025 from the payer Aurora Media Group GmbH to the recipient Sofia Bianchi might show a gross_amount of 200,000 EUR, a withholding_rate of 15 percent, a withheld_amount of 30,000 EUR, and a net_amount of 170,000 EUR, so 200,000 EUR less 30,000 EUR equals the 170,000 EUR paid, and the withheld amount equals the gross times the rate. The income_type, whether employment, contractor, dividend, interest, royalties, or rental, determines the rate and the treaty position, and a cross-border certificate is exactly what a non-resident presents alongside a W-8BEN to claim a reduced treaty rate. The withholding_period and the tax_year fix which reporting cycle the certificate belongs to. Run against the withholding schema, the certificate returns the payer and recipient identities, the income type, the gross, withheld, and net amounts, and the rate as fields, while the per-income-type detail and the withholding summary stay as tables. With the figures typed, a certificate showing 30,000 EUR withheld on 200,000 EUR of royalties at 15 percent loads into a tax or accounts-payable system, so a recipient reads the withheld figure and the net paid from structured fields rather than a scanned slip. Amounts are captured exactly as certified, and no tax advice is offered.
What gets extracted from withholding tax certificates
How extraction works for withholding tax certificates
Withholding certificates arrive per payer, per recipient, and per country, and the gross, the rate, the withheld amount, and the net are laid out differently on a German Steuerbescheinigung, a Mexican constancia, and a US-style slip. Keyed to the withholding model in the Field Registry, the certificate has its payer and recipient separated (each with a tax ID) and gross_amount, withheld_amount, withholding_rate, and net_amount typed as numbers in the stated currency. It verifies the arithmetic: net_amount equals gross_amount less withheld_amount, and withheld_amount ties to gross_amount times the withholding_rate, so a 30,000 EUR withholding on 200,000 EUR at 15 percent is checked to foot rather than trusted. The income_type resolves to a canonical category so the rate and treaty position are legible, the income_details and withholding_summary tables come back with an effective_rate per category, and the tax_year and withholding_period parse so the certificate lands in the right reporting cycle. Line by line, the certificate returns each value with a confidence score and a pixel-region pointer under DIN SPEC 91491, so a reviewer can confirm the withheld figure against the source before claiming the credit.
Sample extraction
A cross-border withholding tax certificate with per-income-type detail
{
"document_number": "WHT-2025-3312",
"document_date": "2026-02-15",
"tax_year": "2025",
"payer.name": "Aurora Media Group GmbH",
"payer.tax_id": "DE811569869",
"payer.address": "Rosenthaler Str. 40, 10178 Berlin, Germany",
"recipient.name": "Sofia Bianchi",
"recipient.tax_id": "IT12345670017",
"recipient.address": "Via Torino 12, 20123 Milano, Italy",
"income_type": "royalties",
"gross_amount": 200000,
"withholding_rate": 15,
"withheld_amount": 30000,
"net_amount": 170000,
"total_amount": 200000,
"tax_amount": 30000,
"withholding_period": "annual",
"currency": "EUR",
"issuing_authority": "Bundeszentralamt für Steuern",
"certification_date": "2026-02-15",
"note": "Gross 200,000 EUR less withheld 30,000 EUR (15%) = net 170,000 EUR paid",
"income_details": [
{
"income_type": "royalties",
"gross_amount": 120000,
"withholding_rate": 15,
"withheld_amount": 18000,
"net_amount": 102000
},
{
"income_type": "consulting_services",
"gross_amount": 80000,
"withholding_rate": 15,
"withheld_amount": 12000,
"net_amount": 68000
}
],
"withholding_summary": [
{
"category": "Tax year 2025",
"total_gross": 200000,
"total_withheld": 30000,
"total_net": 170000,
"effective_rate": 0.15
}
]
}Frequently asked
How is a withholding certificate different from a 1099 or a payroll tax filing?
A withholding certificate documents tax withheld from a specific payment stream to a named recipient, showing gross, rate, withheld, and net. A 1099-MISC is a US information return, and a payroll tax filing is an employer’s aggregate remittance. Talonic reads each on its own schema.
Does it check that gross, withheld, and net reconcile?
Yes. The extractor verifies that net_amount equals gross_amount less withheld_amount, and that withheld_amount ties to gross_amount times the withholding_rate, so a 30,000 EUR withholding on 200,000 EUR at 15 percent is confirmed to foot.
Can it feed a treaty or foreign-tax-credit claim?
Yes. Because the payer, recipient, income type, and withheld amount return as typed fields, the output supports a reduced-treaty-rate claim presented with a W-8BEN or a foreign-tax-credit calculation. Talonic supplies the structured figures; the claim stays with the taxpayer.
How does it handle multiple income types on one certificate?
The income_details table returns a row per income type with its own gross, rate, and withheld amount, and the withholding_summary rolls them up with an effective_rate, so a certificate covering both royalties and consulting is not collapsed into a single line.
Ready to extract from your own withholding tax certificates?
Author note
Reviewed by Talonic engineering, tax schema review · last reviewed 2026-07-09