API reference
Authentication
Log in, refresh tokens, sessions, email verification and password reset.
BrowseAuthentication
Create an account
POST/
- Access
- Public. No key needed.
- Rate limit
- 200 requests per hour
Creates the account, emails a verification link and signs you in. acceptTerms must be true. An invite code, when given, adds test credit once the email is verified. Returns the same session payload as login.
Request body (application/json)
emailrequiredstring (email)
passwordrequiredstring
max 128 charscontactNamerequiredstring
max 255 charscompanyNamestring
max 255 charscountrystring
max 2 charsinviteCodestring
acceptTermsrequiredboolean
One oftrue
Response 201
datarequiredobject
accessTokenrequiredstring · data.accessToken
JWT access token. Send asAuthorization: Bearer <token>.refreshTokenrequiredstring · data.refreshToken
Refresh token (7 days). Also set as an httpOnly cookie scoped to /api/v1/auth.expiresInrequiredinteger · data.expiresIn
Access-token lifetime in seconds (900)userrequiredobject · data.user
idrequiredstring (uuid) · data.user.id
emailrequiredstring (email) · data.user.email
contactNamerequiredstring · data.user.contactName
companyNamerequiredstring | null · data.user.companyName
jobTitlerequiredstring | null · data.user.jobTitle
phonerequiredstring | null · data.user.phone
countryrequiredstring | null · data.user.country
ISO-3166-1 alpha-2timezonerequiredstring · data.user.timezone
companyLogoUrlrequiredstring | null · data.user.companyLogoUrl
avatarUrlrequiredstring | null · data.user.avatarUrl
rolerequiredstring · data.user.role
One ofuser,adminstatusrequiredstring · data.user.status
One ofactive,suspendedaccountKindrequiredstring · data.user.accountKind
balancerequiredmoney · data.user.balance
USD as a decimal string with exactly 6 places, e.g. "0.012500".testCreditrequiredmoney · data.user.testCredit
Sandbox credit, spendable only by test API keys USD as a decimal string with exactly 6 places, e.g. "0.012500".emailVerifiedAtrequiredstring (date-time) | null · data.user.emailVerifiedAt
ISO-8601 timestamp (UTC)pendingEmailrequiredstring | null · data.user.pendingEmail
An address change waiting for confirmationverificationStatusrequiredstring · data.user.verificationStatus
One ofunverified,verifiedkycStatusrequiredstring · data.user.kycStatus
One ofnot_started,pending,verified,rejectedtotpEnabledrequiredboolean · data.user.totpEnabled
Two-factor authentication is ontaxIdrequiredstring | null · data.user.taxId
taxCountryrequiredstring | null · data.user.taxCountry
payoutMethodrequiredstring | null · data.user.payoutMethod
onboardingGoalrequiredstring | null · data.user.onboardingGoal
onboardingDismissedrequiredboolean · data.user.onboardingDismissed
onboardingSeenrequiredboolean · data.user.onboardingSeen
emailNotificationsOptOutrequiredboolean · data.user.emailNotificationsOptOut
switchStatusrequiredstring · data.user.switchStatus
One ofnone,active,past_due,canceled,compcreatedAtrequiredstring (date-time) · data.user.createdAt
ISO-8601 timestamp (UTC)updatedAtrequiredstring (date-time) · data.user.updatedAt
ISO-8601 timestamp (UTC)
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Log in with email and password
POST/
- Access
- Public. No key needed.
- Rate limit
- 20 requests per 5 minutes
Returns an access token, a refresh token and your profile. When two-factor authentication is on, returns { mfaRequired: true, mfaToken } instead: complete the login with POST /auth/2fa/verify. Repeated failures lock the account temporarily.
Request body (application/json)
emailrequiredstring (email)
passwordrequiredstring
max 128 chars
Response 200
datarequiredobject
accessTokenstring · data.accessToken
JWT access token. Send asAuthorization: Bearer <token>.refreshTokenstring · data.refreshToken
Refresh token (7 days). Also set as an httpOnly cookie scoped to /api/v1/auth.expiresIninteger · data.expiresIn
Access-token lifetime in seconds (900)userobject · data.user
Same fields as AccountProfile, shown earlier on this page.mfaRequiredboolean · data.mfaRequired
One oftruemfaTokenstring · data.mfaToken
Short-lived (5 minutes) token to send with a TOTP code to POST /auth/2fa/verify
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Complete a two-factor login
POST/
- Access
- Public. No key needed.
- Rate limit
- 15 requests per 5 minutes
Exchanges the mfaToken from login plus an authenticator (or backup) code for a session.
Request body (application/json)
mfaTokenrequiredstring
From the login responsecoderequiredstring
6-digit authenticator code, or one of your backup codes
Response 200
datarequiredobject
Same fields as AuthSession, shown earlier on this page.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Refresh an access token
POST/
- Access
- Public. No key needed.
- Rate limit
- 100 requests per second (the default)
Reads the refresh token from the httpOnly cookie, or from the body for non-browser clients. Rotates the refresh token: store the new one. Cross-site browser requests are refused with CSRF_BLOCKED; a missing token is MISSING_TOKEN.
Request body (application/json)
refreshTokenstring
Response 200
datarequiredobject
accessTokenrequiredstring · data.accessToken
JWT access token. Send asAuthorization: Bearer <token>.refreshTokenrequiredstring · data.refreshToken
Refresh token (7 days). Also set as an httpOnly cookie scoped to /api/v1/auth.expiresInrequiredinteger · data.expiresIn
Access-token lifetime in seconds (900)
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
MISSING_TOKEN,CSRF_BLOCKED
Log out the current session
POST/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Revokes only this session (other devices stay signed in) and clears the refresh cookie.
Response 200
datarequiredobject
messagerequiredstring · data.message
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List your active sessions
GET/
- Access
- Dashboard session. API keys are refused with 403. Use a login access token.
- Rate limit
- 100 requests per second (the default)
Signed-in devices, most recently seen first. current marks the one making the request.
Response 200
datarequiredobject[]
idrequiredstring (uuid) · data[].id
iprequiredstring | null · data[].ip
userAgentrequiredstring | null · data[].userAgent
createdAtrequiredstring (date-time) · data[].createdAt
ISO-8601 timestamp (UTC)lastSeenAtrequiredstring (date-time) | null · data[].lastSeenAt
ISO-8601 timestamp (UTC)currentrequiredboolean · data[].current
True for the session making this request (matched via the refresh token)
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Sign out one session
DELETE/
- Access
- Dashboard session. API keys are refused with 403. Use a login access token.
- Rate limit
- 100 requests per second (the default)
Parameters
idrequiredpath · string
Response 200
datarequiredobject
Same fields as Message, shown earlier on this page.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Sign out every other session
POST/
- Access
- Dashboard session. API keys are refused with 403. Use a login access token.
- Rate limit
- 100 requests per second (the default)
Keeps the current session. Needs the refresh token (cookie or body) to know which session is current; without it the answer is NO_SESSION.
Response 200
datarequiredobject
Same fields as Message, shown earlier on this page.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
NO_SESSION
Verify your email address
POST/
- Access
- Public. No key needed.
- Rate limit
- 100 requests per second (the default)
Consumes the token from the verification email. Any invite-code test credit is added at this point.
Request body (application/json)
tokenrequiredstring
Response 200
datarequiredobject
Same fields as Message, shown earlier on this page.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Confirm an email address change
POST/
- Access
- Public. No key needed.
- Rate limit
- 10 requests per 10 minutes
Finishes a change requested with POST /account/email, using the token from the link sent to the NEW address. Public on purpose: the single-use token is the proof, so the link works on any device.
Request body (application/json)
tokenrequiredstring
The token from the confirmation link sent to the new address
Response 200
datarequiredobject
emailrequiredstring (email) · data.email
The address now on the account
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Resend the verification email
POST/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 100 requests per second (the default)
Response 200
datarequiredobject
Same fields as Message, shown earlier on this page.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Redeem an invite code after sign-up
POST/
- Access
- API key. Full-access keys only; not reachable by scoped keys.
- Rate limit
- 10 requests per 10 minutes
For social sign-ups, or a code mistyped at registration. ok: false carries the reason. When the email is not verified yet, the credit is held (pending: true) and added on verification.
Request body (application/json)
coderequiredstring
max 64 chars
Response 200
datarequiredobject
okrequiredboolean · data.ok
amountmoney · data.amount
Test credit granted USD as a decimal string with exactly 6 places, e.g. "0.012500".pendingboolean · data.pending
True when the credit waits for email verificationreasonstring · data.reason
Why the code was not applied
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Resend a verification email by address
POST/
- Access
- Public. No key needed.
- Rate limit
- 5 requests per hour
For users whose link expired and who cannot sign in. Always answers the same way, whether or not the account exists.
Request body (application/json)
emailrequiredstring (email)
Response 200
datarequiredobject
Same fields as Message, shown earlier on this page.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Request a password reset email
POST/
- Access
- Public. No key needed.
- Rate limit
- 5 requests per hour
Always answers the same way, whether or not the account exists.
Request body (application/json)
emailrequiredstring (email)
Response 200
datarequiredobject
Same fields as Message, shown earlier on this page.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Reset your password with a reset token
POST/
- Access
- Public. No key needed.
- Rate limit
- 15 requests per hour
Request body (application/json)
tokenrequiredstring
newPasswordrequiredstring
max 128 chars
Response 200
datarequiredobject
Same fields as Message, shown earlier on this page.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Change your password
POST/
- Access
- Dashboard session. API keys are refused with 403. Use a login access token.
- Rate limit
- 100 requests per second (the default)
Requires the current password. Signs out every session, including this one once its access token expires, and emails a confirmation.
Request body (application/json)
currentPasswordrequiredstring
newPasswordrequiredstring
At least 8 characters and different from the current password
Response 200
datarequiredobject
Same fields as Message, shown earlier on this page.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List the social login providers that are enabled
GET/
- Access
- Public. No key needed.
- Rate limit
- 100 requests per second (the default)
Response 200
datarequiredobject
googlerequiredboolean · data.google
linkedinrequiredboolean · data.linkedin
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Start a social login
GET/
- Access
- Public. No key needed.
- Rate limit
- 100 requests per second (the default)
A browser navigation, not an API call. Redirects to the provider; next is a same-site path to land on afterwards.
Parameters
providerrequiredpath · string
One of google, linkedinnextquery · string
Relative path to open after signing in, e.g. /dashboard
Response 302
Redirect to the provider, or to /login?oauth_error=unavailable when the provider is not configured.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Finish a social login (provider callback)
GET/
- Access
- Public. No key needed.
- Rate limit
- 100 requests per second (the default)
Called by the provider after consent. Signs the browser in and redirects into the app, or to /login?oauth_error=... on failure.
Parameters
providerrequiredpath · string
One of google, linkedincodequery · string
statequery · string
errorquery · string
Response 302
Redirect into the app when signed in, or to /login with an oauth_error reason.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.