Skip to main content

Overview

This guide covers the journey for a partner that owns the customer relationship in its own product and uses etoro as the brokerage and identity layer underneath. The user never has to register on etoro first. The journey has two parts, and they run on different channels:
Access is provisioned per partner. Before you start, your etoro contact must have set up your application (client credentials and redirect URIs), the scopes below, your API key, and the allow-listing of your egress IP addresses. See Before you start.
All endpoints in this guide are production endpoints. The authorization server is https://www.etoro.com; the API is https://public-api.etoro.com.

Before you start

Ask your etoro contact to confirm each of the following:
1

Application and credentials

A client_id and client_secret for your application, and the exact redirect URI or URIs you will use for silent login. Keep the secret on your backend only.
2

Scopes

The scopes this journey uses are listed below; the full scope map is in Permitted operations and scopes. A scope outside your grant is rejected.
3

API key and IP allow-listing

An x-api-key for your application, and your egress addresses registered with etoro, as described in the integration prerequisites.
4

Trusted-partner entitlement

Direct email and phone confirmation, and trusted user verification, are available only to partners etoro has approved as trusted, and only for users your application created.

Part A: Create the user and submit KYC

1. Obtain a partner token

Authenticate your application with the OAuth 2.0 client credentials grant. No end user is involved at this stage.
The response contains an access_token and the scopes granted to your application. Send the client secret in the form body, as above, or as HTTP Basic — not both. Request a new token when it expires. Which legal documents a user must accept depends on their country. Always fetch them for the country you are onboarding; never hard-code document identifiers.
Response 200
If blocked or restricted is true, do not continue to registration for that country. Present every returned document to the user, and record the time they accepted it and their IP address.

3. Register the user

Send one consents entry for every document returned in step 2.
No password is supplied; etoro generates one. A successful call returns 201 and a token bundle for the new user:
Response 201
Persist two values from this response:
  • The sub claim of the id_token. On a partner application this is the user’s externalUserId, and you need it for silent login. It is not an etoro customer id.
  • The access_token. It is short-lived; honor expires_in. Use it as a bearer token for the next user-scoped calls, then replace it with a non-interactive token.
Common errors: 409 for a username, email, or partnerCorrelationId that is already in use (use new values); 422 for an invalid or missing consent, or a stale signedAt. See Errors and rate limits for the rest.

4. Issue a non-interactive token

The registration access_token expires. To keep calling user-scoped endpoints from your backend after that, issue a non-interactive token (NIT) for the user. The NIT published in this portal is the sub-account user token in Issue a non-interactive token. That call needs the registration access_token and an x-sub-account-id, and it returns the secret only once. Store it in a secret store, and set expiresAt and ipsWhitelist.
That path applies when the user is an etoro trading sub-account of your application. If your application registers a user directly and you do not have a sub-account id, confirm the issuance path with your etoro contact before you build it. Do not call an internal host.
Until a NIT exists, user-scoped calls use Authorization: Bearer and the registration access_token. After it exists, they use your x-api-key and the user’s x-user-key. The two are mutually exclusive; see Issue a non-interactive token. The examples below show the key pair.

5. Prepare the profile and submit KYC

Call the operations below for the new user. Each lists the scopes it needs in the Partners API reference. Where your own provider has already verified the user, you can supply that evidence instead of asking the user to repeat it.

Confirm email and phone with your own evidence

Direct confirmation records that you verified the email or phone, so etoro does not send a one-time code. Both calls take a verificationEvidence object:
phoneNumber is digits only, without the country code, and must be a valid national number for that country. A 409 means the email or phone is already verified, or is in use by another user; where the verification was intentional, treat an “already verified” response as done.

Submit trusted user verification

When the user has reached the required verification level, submit your verification evidence to complete trusted verification:
This operation requires the user to be at verification level 2 and then upgrades them to level 3. It is idempotent for a user already at level 3. If the user has not reached level 2, the call returns 400; complete the earlier profile and verification steps and check GET /api/v1/kyc/gaps rather than retrying. Use the verificationMethod value document_verification on this operation; the enumeration in the table above applies to the email and phone confirmations.
Trusted verification asserts that you verified the user. It is only accepted for users your application created, and you are accountable for the evidence you submit. Never send evidence for a verification that did not take place.

Part B: Sign the user in silently

Silent login opens etoro in the user’s browser already signed in. It is a handshake between the browser, your backend, and etoro, and the order matters.
Only etoro’s own response may set the login cookie. The cookie is created when the user’s browser calls initiate. Your application must never create, copy, forge, or proxy it. A call from your server plants the cookie on the server, the browser never receives it, and verify fails. That is expected behavior, not a defect.

1. The user’s browser calls initiate

There is no initiate page to open with query parameters. The user’s browser sends:
The curl shows the contract. Run it in the user’s browser (so the Set-Cookie is stored there), not on your server. X-STS-DeviceId is a GUID you generate for this handshake. fromClientId is your application’s client id and must be a GUID. redirectUri must match a registered redirect URI character for character, including scheme and path. state is optional. A successful call returns 201 and sets etoro-silent-login-tid (HttpOnly, Secure, domain .etoro.com, about five minutes):
Response 201
Navigate that same browser to redirectUrl. tid is a GUID with no dashes. When you sent state, it is appended and URL-encoded; when you omitted it, the callback has tid only. An unregistered redirectUri is rejected with 403.

2. Exchange the tid for a one-time token

On your backend, read tid from the callback and identify the user. Authenticate with a partner token (see step 1 of Part A) and send the user’s externalUserId, which is the sub claim saved at registration:
Response 201
tid must be the GUID from the callback. externalUserId must be the value saved from registration and must belong to your application; a value minted for another application is rejected.

3. Open the verify URL in the same browser

Redirect the browser to the redirectUrl exactly as returned. Do not change its host, path, or query string. The etoro page combines the cookie from step 1 with the one-time token, establishes the session, and lands the user on etoro signed in. You do not call the verify endpoint yourself.

Timing and single use

  • The cookie lives for about five minutes. Complete steps 1 to 3 promptly.
  • The one-time token (ott) is single use. If a sign-in fails, start again from step 1; do not reuse an ott or a tid.
  • The cookie must come from the same browser that opens the verify URL.

Silent login errors

Errors and rate limits

Each operation’s rate limit is stated in the Partners API reference; most share a default of 60 requests per 60 seconds, and exceeding it returns 429. See Rate limits. Common causes of failure across the guide:

Go-live checklist

  • Consent documents fetched per country at registration time, never hard-coded, with an accurate signedAt and the end user’s own clientIp.
  • externalUserId (the sub claim) and partnerCorrelationId stored against your own user record.
  • Every item in the partner security checklist: NIT storage, expiry and IP restriction, egress allow-listing, and no personal data in logs or events.
  • Silent login initiated only from the user’s browser, with partner-login-token called only from your backend.
  • A full dry run of Part A and Part B in a non-production environment, agreed with your etoro contact, before any customer sees it.

Reference

Partners API reference

Every Partners API endpoint, with the scopes each one requires.

Partner integration flow

Non-interactive tokens, account association, scopes, and event reporting.

SSO with OAuth 2.0

The standard sign-in flow for users who already hold an etoro account.

API keys and headers

The x-api-key / x-user-key pair and request header format.