Operating Model:
Operating Model:

User tax onboarding

This guide provides you with the necessary knowledge you need to understand why Upvest requires additional tax-related information from our users prior to account opening, what information has to be provided to Upvest and how you to interact with our Investment API endpoints to accomplish exactly that.

How user tax onboarding works

Upvest is obliged to collect tax-specific information from its users in order to determine their appropriate tax status as well as for other applications (e.g., to comply with regulatory reporting requirements under Common Reporting Standards). If a user is a German tax resident (i.e. has the primary tax residence in Germany), Upvest automatically deducts German withholding tax, solidarity charge and church tax (depending on confession) prior to payout. Currently, users with non-German primary tax residence are considered tax-aliens for Upvest, which is why no automatic tax deduction is supported.

Similarly, Upvest does not currently permit onboarding of US citizens who are subject to US taxation or FATCA requirements. FATCA (“Foreign Account Tax Compliance Act”) is a US regulation that applies to US citizens and other persons who are liable to pay tax in the US.

COMING SOON
In the future, the Investment API will support the automated computation and withholding of capital gain taxes for non-German tax residencies as well as onboarding for US citizens.

Determining the user tax residency

During your user onboarding, users need to explicitly declare their individual tax residencies. The Investment API supports single and multiple tax residencies per user. For example, multiple tax residencies might exist because of a user's foreign real estate ownership. Regardless of the total number of tax residencies, every user is required to determine a single primary tax residency (see tax_residency object in the POST body below). When a given user certifies that all tax residencies are declared properly, Upvest activates this specific user and the connected accounts within the Investment API.

INFO
  • If a user certifies a German tax residency amongst others, the German tax residency needs to be submitted as primary in any case.
  • Using postal addresses to determine a user’s tax residency might lead to incorrect results. Upvest therefore asks you to have your users explicitly state their tax residency.

User tax onboarding (incl. tax identification and residency)

Declaring a user’s tax residency can be achieved by sending a POST /users/{user_id}/tax_residencies request to our API. The following JSON bodies serve as examples highlighting valid use cases of the underlying Investment API endpoint.

Declaring a single German tax residency

This decalaration is made without providing the user’s tax identification number.

Send POST /users/{user_id}/tax_residencies:

Example request

{
   "fatca_relevance": {
      "status": false,
      "confirmed_at": "2021-08-24T14:15:22Z"
   },
   "residencies_declared_at": "2021-09-24T12:56:22Z",
   "tax_residency": {
      "country": "DE",
      "tax_identifier_number": "12345678901"
   }
}
INFO

For users with German tax residency, the Investment API can enrich the provided user data by retrieving a German tax identification number (TIN) and other taxation attributes (e.g., church tax status) through an overnight backend process. Due to this automated process, the German TIN is an optional field and intentionally left out in the above API call. As in this case the TIN has not been provided by the user, the Investment API queries it via respective backend process, which allows for a smoother and more convenient user onboarding experience.

Declaring multiple tax residencies

Send POST /users/{user_id}/tax_residencies:

Example request

{
    "fatca_relevance": {
        "status": false,
        "confirmed_at": "2021-08-24T14:15:22Z"
    },
    "tax_residency": {
        "country": "DE",
        "tax_identifier_number": "12345678901"
    },
    "residencies_declared_at": "2021-09-24T12:56:22Z",
    "additional_tax_residencies": [
        {
            "country": "IT",
            "tax_identifier_number": "40021158793"
        },
        {
            "country": "FR",
            "reason_missing_tin": "COUNTRY_HAS_NO_TIN"
        }
    ]
}

In the example above, the user provides her German TIN. This would allow the user to apply for a tax exemption directly during onboarding. If a user does not provide her TIN during onboarding, she can either declare a tax exemption after the onboarding process has been fully completed (including automatic TIN retrieval in the background), or she needs to provide the TIN separately via the tax_exemptions resource. Although the user has declared two additional tax residencies, she indicated Germany to be her primary tax residency, which is why she is subject to German withholding taxes.

In the multi tax residency example, additional tax residencies are declared for Italy and France. Generally, for non-German tax residencies the TIN information of a given country is a required field (see the Italian tax residency). However, certain cases exist in which a user has a legitimate reason why she cannot provide a TIN (e.g., certain countries do not issue official TINs or that a TIN has not yet been issued from the authorities). In these cases, a valid JSON body must indicate a reason why a user has not provided the required (foreign) TIN (see reason_missing_tin in the second array entry).

The API endpoint /users/{user_id}/tax_residencies always requires the complete set of a user’s tax residencies at a given time, because a timestamp for residency_declared_at for the full record of residencies must be provided. Thus, updates on tax residencies always contain the full set of tax residencies. Each request to this API endpoint is treated as "self-contained", which is also the reason why Upvest does not provide a separate PATCH resource. All updates of a user’s tax residencies need to be transmitted via the same POST endpoint resource.

Was this page helpful?