Skip to main content

Overview

This page applies only to partners whose Ripio account is in Brazil. What decides it is your account’s country, not the customer’s: a Brazilian national operating through a partner in Argentina is never asked for an investor profile, while every customer of a Brazilian account is. Accounts in Argentina, Colombia and Mexico are not affected by anything described here. Resolução BCB nº 520/2025 (arts. 58 and 59) requires Ripio to know the risk profile of every customer operating through a Brazilian account — their familiarity with virtual assets, financial goals and risk tolerance — before they operate, and to keep it on record. Ripio collects it through a short investor profile questionnaire: five single-choice questions whose answers produce one of three profiles. When the investor profile is enabled for your account, a customer cannot create on-ramp or off-ramp orders or sessions, or register a destination account, without a valid profile. As an API partner, you are responsible for showing the questionnaire to your customers and submitting their answers.
Partners on the Ramps widget do not implement any of this: the widget presents the questionnaire itself. See Investor profile in the widget docs.

When it applies

The investor profile is enabled by Ripio per account, and only for accounts whose country is Brazil. Your widget integration and your API integration use different accounts, so each one is enabled on its own. Enforcement starts on October 30, 2026 at 00:00 Brasília time (2026-10-30T03:00:00Z). Until then the questionnaire is already available and the customer is asked for it (REQUIRED_SOON), but nothing is blocked: use that window to collect profiles from your existing customers before they hit an error. An account enabled after that date is enforced from day one.
There is no grace period per customer once enforcement starts. An existing customer without a profile is blocked until they answer the questionnaire — see 20100 below.

Where it fits in the flow

The only hard requirement is that the profile exists before the first order or session. The recommended place is right after KYC, which is where the widget asks for it:
You can also collect it earlier — during your own onboarding, for example. Submission does not depend on the KYC status; it only needs the customer to have an email set, given when creating the customer or later with Update Customer. Otherwise it is refused with 20014.
This applies even if your customers verify their identity in Ripio’s hosted KYC: the hosted flow does not include the questionnaire, so it is still yours to collect via the API.
When a customer is missing more than one step, the errors arrive in that same order: a deactivated customer, then Terms & Conditions (20039), then KYC, then the investor profile (20100). Fix them in the order you receive them.

Statuses

Get Investor Profile Status tells you where a customer stands: Only REQUIRED and EXPIRED block. deadline is set only for REQUIRED_SOON and EXPIRING_SOON, the two statuses where there is something to say “before” about — use it in your copy (“answer before …”).
The status changes with time and without any action on your side: a VALID profile becomes EXPIRING_SOON and then EXPIRED. Re-check it before the customer operates, or handle 20100 wherever you create an order or a session — do not store it as a flag.

Collecting the profile

1

Check whether the customer needs to answer

Show the questionnaire for REQUIRED and EXPIRED; offer it, with the option to postpone, for REQUIRED_SOON and EXPIRING_SOON.→ Get Investor Profile Status
2

Fetch the active questionnaire

The example is cut to one question; the questionnaire has five. Keep the version: you send it back in the next step.→ Get Investor Questionnaire
3

Show it and submit the answers

Show every question with its answers, let the customer pick exactly one per question, and submit them all at once:
The response (201) is the same as the status call, now VALID, with the resulting profile. The customer can operate right away.→ Submit Investor Profile

The resulting profile

profile is one of CONSERVATIVE, MODERATE or AGGRESSIVE. Each answer comes back with the texts of the questionnaire version the customer answered, so the record stands on its own even after the questionnaire changes. Scores are not exposed. What you do with the profile is up to you: showing it to the customer is a good practice, but nothing in the API requires it, and the profile does not restrict which operations the customer can make — it only has to exist and be valid.

Language

The API has no language parameter: question, answer and profile texts are always in Portuguese. Every one of them also carries a stable identifier — questionId, answerId and profile — so you can translate by id into your own app’s languages, and fall back to the Portuguese text for an id you do not know yet. Ids do not change within a questionnaire version. A change to the questionnaire is published as a new version, which may bring new ids.

Validity and renewal

  • A profile is valid for one year from the moment it is submitted (validUntil).
  • During its last 30 days the status is EXPIRING_SOON. The customer can still operate; it is the window to ask them to renew without interrupting them.
  • Once validUntil passes, the status is EXPIRED: the customer is blocked until they answer again.
  • The questionnaire can be answered again at any time. Every submission creates a new profile valid for one more year; earlier ones are kept as history, and the status call always shows the latest.

When the questionnaire changes

Ripio may publish a new version of the questionnaire. Only the active version can be answered, so a customer who fetched version 1 and submits after version 2 went live gets 20096:
Fetch the questionnaire again, show it, and submit with the new version. A new version does not invalidate existing profiles: they remain valid until their own validUntil.

Operating without a valid profile: 20100

When the profile is enforced and the customer has none, or it expired, these endpoints answer 400 with code 20100:
The message carries the customerId you sent. Send the customer through the questionnaire, then retry the same request. Registering a destination account (a PIX key) is gated like an operation because it is the first step of an off-ramp: a customer without a valid profile cannot add one. That includes the replacement account for Change Fiat Account and Reprocess — the reprocess itself is not blocked, but the new account it points to has to be created first. Quotes, the deposit account, KYC, refunds, Sell and Pay and the read endpoints are not affected: a customer without a profile can still get a quote or check their history.

Keeping profiles current

There are no webhooks for the investor profile: nothing tells you that a profile is about to expire or has expired. Two ways to stay ahead of it:
  • Check before operating. Call Get Investor Profile Status when the customer is about to buy or sell, and show the questionnaire if needed. This is what the widget does.
  • Schedule a reminder. Store validUntil when you submit a profile, and ask the customer to renew in the 30 days before it — the EXPIRING_SOON window — so they never hit 20100.

Testing in sandbox

The investor profile is enabled per account in sandbox too. Ask the Ripio team to enable it on your sandbox account; until then, the status call reads NOT_REQUIRED and submissions are refused with 20099. Get Investor Questionnaire does not depend on it: it answers for any Brazilian account, so you can build the questionnaire screens before the feature is enabled. Once enabled, you can go through the whole flow — fetch the questionnaire, submit it, see VALID, and get 20100 on a customer who has not answered. Expiry cannot be simulated: a profile submitted today stays VALID for eleven months, so test EXPIRING_SOON and EXPIRED against the examples on Get Investor Profile Status.

Errors