# Deliver tax statements (non-US)

Deliver copies of tax information to your users for platform tax reporting.

> #### Private preview
> 
> Platform tax reporting is in private preview. [Request early access](https://docs.stripe.com/connect/platform-tax-reporting.md#request-early-access) to join the preview.

Tax authorities require that you deliver a copy of the submitted tax information to the seller, in addition to filing the tax report, in all jurisdictions except Australia.

## E-delivery with the Tax Forms API 

You can use the Tax Forms API to deliver statements to your users directly. With the API, you build and brand the e-delivery flow in your platform and Stripe doesn’t interact with your users directly. You also need to manage how your users access the e-delivered forms, and any user identity changes or corrections that go through your platform.

We’ll use a fictitious account StripeDelivers, a delivery platform to demonstrate the API.

### Indicating that tax forms are filed

StripeDelivers successfully files their generated reports to the relevant authority. They inform Stripe that they’ve filed their reports, and Stripe updates their tax forms accordingly. Now that the forms are in a filed state, they’re available in the API.

### Retrieving tax forms

StripeDelivers wants to create a view of a connected account’s filed Canadian tax information in their platform’s app, to satisfy the platform’s tax reporting requirement and inform the account holder of their taxable income.

The developer needs to upload each statement to the platform’s servers to make them available to the view. The app sends a `GET` request for a list of tax forms from Stripe’s Tax Forms API on each user request.

```curl
curl -G https://api.stripe.com/v1/tax/forms \
  -u "<<YOUR_SECRET_KEY>>:" \
  -H "Stripe-Version: 2026-09-30.preview; retrieve_tax_forms_beta=v1;" \
  -d type=ca_mrdp \
  -d "payee[account]={{CONNECTEDACCOUNT_ID}}" \
  -d "payee[type]=account"
```

When a user requests a PDF version of the form, the app sends a `GET` request to Stripe’s Files API, caches it, and returns it in the response.

#### curl

```bash
curl https://files.stripe.com/v1/tax/forms/taxform_123/pdf \
  -u <<YOUR_SECRET_KEY>>: \
  -H "Stripe-Version: 2022-11-15; retrieve_tax_forms_beta=v1;" \
  -o "/tmp/tmp.pdf"
```

### Notifications

> To receive `tax.form.updated` webhooks, you need to create a webhook endpoint with the Tax Forms API beta `Stripe-Version` header.

StripeDelivers wants to know if a seller’s information is rejected by the tax authority. StripeDelivers receives a `tax.form.updated` webhook and determines that the form has moved to `rejected`.

No `accepted` status exists to generate a webhook, so you won’t receive one after the information has been `filed`, as long as the information hasn’t been rejected.

### Standalone sellers

When sellers not associated with a connected account are created in the Tax Reporting Dashboard, an external account ID is requested. StripeDelivers can access statements for these sellers using those external account IDs—StripeDelivers chooses to use their internal IDs.

```curl
curl -G https://api.stripe.com/v1/tax/forms \
  -u "<<YOUR_SECRET_KEY>>:" \
  -H "Stripe-Version: 2026-09-30.preview; retrieve_tax_forms_beta=v1;" \
  -d type=ca_mrdp \
  -d "payee[external_reference]=stripeDeliversID_123" \
  -d "payee[type]=external_reference"
```
