Weavr Setup API
Register and manage the lifecycle of users that can access an identity, including authorised users invited by a Corporate or Consumer root user.
Register and manage the lifecycle of users that can access an identity, including authorised users invited by a Corporate or Consumer root user.
openapi: 3.1.0
info:
version: v3
title: Weavr Multi Product BackOffice Access Token Setup API
x-logo:
url: https://storage.googleapis.com/weavr-cdn/weavr_logo-new.png
backgroundColor: '#FFFFFF'
altText: Weavr
description: 'Weavr Multi Back Office API allows you, as an innovator, to perform various back office operations concerning
identities and their instruments, without requiring the users to be logged in.
A token is to be obtained through the `access_token` method, and this will allow relevant operations
to be performed on behalf of this same identity.
'
contact:
name: Weavr
url: https://weavr.io
servers:
- description: Weavr Sandbox Environment
url: https://sandbox.weavr.io/multi/backoffice
tags:
- name: Setup
description: 'Register and manage the lifecycle of users that can access an identity, including authorised users invited by a Corporate or Consumer root user.
'
paths:
/users:
post:
x-permissions:
- i:users:create
tags:
- Setup
description: "Creates a user linked to the logged-in corporate or consumer identity.\n\nOnce on-boarded, users have access to all instruments (cards and accounts) of the identity.\n\nApplication-specific permissions to limit what each user can view and do need to be implemented in your application.\n\nIn order to Create an Authorised User you would need a stepped-up token. Before calling `/multi/users` you need to step-up ( issue a challenge `multi/stepup/challenges/otp/{channel}` )\n\nMore details on how to step-up a token can be found here [Step-Up](/tag/Step-up#operation/stepupSCAChallenge ) \n"
summary: Register a user
operationId: userCreate
parameters:
- $ref: '#/components/parameters/idempotency-ref'
requestBody:
$ref: '#/components/requestBodies/UserCreateRequest'
responses:
'200':
$ref: '#/components/responses/UserResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/UserForbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/UserCreateConflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- auth_token: []
api-key: []
get:
tags:
- Setup
description: Fetches all users associated with the corporate or consumer identity the logged-in user belongs to.
summary: Get all users
operationId: usersGet
x-permissions:
- i:users:list
parameters:
- $ref: '#/components/parameters/offset'
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/active'
- $ref: '#/components/parameters/email'
- $ref: '#/components/parameters/tag'
- name: roles
in: query
required: false
explode: true
schema:
type: array
items:
$ref: '#/components/schemas/UserPredefinedRole'
description: Filter users by role. Multiple roles use OR logic.
responses:
'200':
$ref: '#/components/responses/UsersGetResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- auth_token: []
api-key: []
/users/{user_id}:
get:
tags:
- Setup
description: Retrieves the user identified by the `user_id` path parameter.
summary: Get a user
operationId: userGetById
x-permissions:
- i:users:get
- i:users:get:own
parameters:
- $ref: '#/components/parameters/userId'
responses:
'200':
$ref: '#/components/responses/UserResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- auth_token: []
api-key: []
patch:
tags:
- Setup
description: 'Update the details of a user identified by the `user_id` in the the path parameter.
Only the fields that are specified in the request body will be updated. All other fields will remain unchanged.
When patching a mobile number, the new mobile number should be enrolled for Authentication Factors.
'
summary: Update a user
operationId: userUpdate
x-permissions:
- i:users:update
- i:users:update:own
parameters:
- $ref: '#/components/parameters/userId'
- $ref: '#/components/parameters/idempotency-ref'
requestBody:
$ref: '#/components/requestBodies/UserPatchRequest'
responses:
'200':
$ref: '#/components/responses/UserResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/UserPatchConflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- auth_token: []
api-key: []
/identities:
get:
tags:
- Setup
description: Retrieves a list of identities available to the holder of the token.
summary: Get linked identities
operationId: userIdentities
parameters:
- name: offset
in: query
required: false
description: The number of results to skip from the beginning of the dataset.
schema:
type: integer
minimum: 0
- name: limit
in: query
required: false
description: The maximum number of identities to return.
schema:
type: integer
minimum: 1
maximum: 100
responses:
'200':
$ref: '#/components/responses/UserIdentitiesGetResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/UserIdentitiesConflict'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- auth_token: []
api-key: []
- api-key: []
/users/{user_id}/invite:
post:
x-permissions:
- i:users:send_invite
tags:
- Setup
summary: Invite a user to become an authorised user
operationId: userInviteSend
description: 'Once a user is created using the _userCreate_ operation, the user needs to setup his/her password.
An invitation needs to be sent to the user in order to be able to set up the password for the first time. The invitation email, which remains valid for 1 month, will contain a URL having all information required to setup the password via the _userInviteConsume_.
'
parameters:
- $ref: '#/components/parameters/idempotency-ref'
- $ref: '#/components/parameters/userIdExplode'
responses:
'204':
$ref: '#/components/responses/NoContent'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/UserInviteSendConflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- auth_token: []
api-key: []
/users/{user_id}/invite/validate:
post:
tags:
- Setup
description: Check if a user's invite is still valid. This operation is useful to avoid having the user fill in a form only to be held by a validation issue (eg. expired invite).
summary: Validate a user's invite
operationId: userInviteValidate
parameters:
- $ref: '#/components/parameters/userIdExplode'
requestBody:
$ref: '#/components/requestBodies/UserInviteValidateRequest'
responses:
'204':
$ref: '#/components/responses/NoContent'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/UserInviteValidateConflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- api-key: []
/users/{user_id}/invite/consume:
post:
tags:
- Setup
description: 'Consumes an invitation perviously sent to the user via _userInviteSend_. This is needed so that the invited user sets up the password.
_Note that on the Sandbox Environment, the `inviteCode` is always set to \"123456\"._
'
summary: Consume a user's invite
operationId: userInviteConsume
parameters:
- $ref: '#/components/parameters/idempotency-ref'
- $ref: '#/components/parameters/userIdExplode'
requestBody:
$ref: '#/components/requestBodies/UserInviteConsumeRequest'
responses:
'200':
$ref: '#/components/responses/TokenResponse'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFoundToken'
'409':
$ref: '#/components/responses/UserInviteConsumeConflict'
'410':
$ref: '#/components/responses/TokenExpired'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- api-key: []
/users/verification/email/send:
post:
tags:
- Setup
description: 'The first step in verifying an authorised user''s email. The authorised user whose email address is to be verified is sent an email containing a randomly generated code.
This code must then be provided in the _authorisedUserEmailVerify_ operation to verify the authorised user''s email address.
_Note that on the Sandbox Environment, the `verificationCode` is always set to \"123456\"._
'
summary: Send an email verification code to a user
operationId: authorisedUserEmailVerificationCodeSend
parameters:
- $ref: '#/components/parameters/idempotency-ref'
requestBody:
required: true
content:
application/json:
schema:
required:
- email
type: object
properties:
email:
$ref: '#/components/schemas/Email'
responses:
'204':
$ref: '#/components/responses/NoContent'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'409':
description: Conflict
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- EMAIL_NOT_FOUND
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- api-key: []
/users/verification/email/verify:
post:
tags:
- Setup
description: 'The second step in verifying the authorised user''s email. The randomly generated code sent to the authorised user via
email, using the _authorisedUserEmailVerificationCodeSend_ operation, is submitted here to verify the authorised user''s email.
This is needed as part of the verification process for basic due diligence.
_Note that on the Sandbox Environment, the `verificationCode` is always set to \"123456\"._
'
summary: Verify email of the authorised user
operationId: authorisedUserEmailVerify
requestBody:
required: true
content:
application/json:
schema:
required:
- email
- verificationCode
type: object
properties:
email:
$ref: '#/components/schemas/Email'
verificationCode:
$ref: '#/components/schemas/VerificationCode'
responses:
'204':
$ref: '#/components/responses/NoContent'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'409':
description: Conflict
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- VERIFICATION_CODE_INVALID
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security:
- api-key: []
/users/{user_id}/deactivate:
post:
tags:
- Setup
description: 'De-activate the user identified by the `user_id` path parameter.
Deactivated users cannot log in or execute any operations with their credentials.
This operations is not final and a user can be re-activated using the userActivate operation. Note that another active user would need to log in so as to re-activate the de-activated user.
'
summary: Deactivate an authorised user
operationId: userDeactivate
x-permissions:
- i:users:deactivate
parameters:
- $ref: '#/components/parameters/userId'
responses:
'204':
$ref: '#/components/responses/NoContent'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- auth_token: []
api-key: []
/users/{user_id}/activate:
post:
tags:
- Setup
description: 'Activate the user identified by the `user_id` path parameter.
By default, any new users created will be automatically activated. This operation needs to be used only if the user was previously de-activated using the _userDeactivate_ operation, or if the user was de-activated automatically after multiple incorrect login attempts.
'
summary: Reactivate an authorised user
operationId: userActivate
x-permissions:
- i:users:activate
parameters:
- $ref: '#/components/parameters/userId'
responses:
'204':
$ref: '#/components/responses/NoContent'
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
$ref: '#/components/responses/Error'
security:
- auth_token: []
api-key: []
/users/kyc:
post:
tags:
- Setup
description: 'Perform the kyc for a corporate user.
'
summary: Start KYC to elevate an authorised user to signatory
operationId: userKyc
responses:
'200':
description: Success
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
required:
- reference
type: object
properties:
reference:
type: string
pattern: ^[0-9]+$
description: The reference required to initialise the KYB UI Component.
'400':
$ref: '#/components/responses/BadRequestError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
description: Conflict
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- EMAIL_NOT_VERIFIED
- MOBILE_NOT_VERIFIED
- KYC_ALREADY_APPROVED
- KYC_PENDING_REVIEW
- KYC_REJECTED
- KYB_IDENTITY_NOT_APPROVED
'500':
$ref: '#/components/responses/InternalServerError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
security:
- api-key: []
components:
requestBodies:
UserInviteValidateRequest:
required: true
content:
application/json:
schema:
required:
- inviteCode
type: object
properties:
inviteCode:
$ref: '#/components/schemas/Nonce'
UserCreateRequest:
required: true
content:
application/json:
schema:
required:
- email
- name
- surname
type: object
properties:
name:
minLength: 1
maxLength: 50
type: string
description: The first name of the user.
surname:
minLength: 1
maxLength: 50
type: string
description: The last name of the user.
email:
$ref: '#/components/schemas/Email'
mobile:
$ref: '#/components/schemas/Mobile'
dateOfBirth:
description: Date of birth of the authorised user.
$ref: '#/components/schemas/Date'
tag:
$ref: '#/components/schemas/Tag'
countryOfResidence:
type: string
maxLength: 2
minLength: 2
pattern: ^[A-Z]+$
locale:
$ref: '#/components/schemas/UserLocale'
brand:
$ref: '#/components/schemas/Brand'
roles:
type: array
items:
$ref: '#/components/schemas/UserPredefinedRole'
description: Optional roles to assign to the user. For a full description of the permissions associated with each role, see our product documentation.
UserInviteConsumeRequest:
required: true
content:
application/json:
schema:
required:
- inviteCode
- password
type: object
properties:
inviteCode:
$ref: '#/components/schemas/Nonce'
password:
$ref: '#/components/schemas/SensitivePassword'
mobile:
$ref: '#/components/schemas/Mobile'
description: Optional mobile number for the user. If provided, the user's mobile is set/replaced as part of consuming the invite. The new number is left unverified — it must be enrolled afterwards.
UserPatchRequest:
required: true
content:
application/json:
schema:
type: object
properties:
name:
minLength: 1
maxLength: 50
type: string
description: The first name of the user.
surname:
minLength: 1
maxLength: 50
type: string
description: The last name of the user.
email:
$ref: '#/components/schemas/Email'
mobile:
$ref: '#/components/schemas/Mobile'
dateOfBirth:
description: Date of birth of the authorised user.
$ref: '#/components/schemas/Date'
tag:
$ref: '#/components/schemas/Tag'
locale:
$ref: '#/components/schemas/UserLocale'
brand:
$ref: '#/components/schemas/Brand'
roles:
type: array
items:
$ref: '#/components/schemas/UserPredefinedRole'
description: Optional roles to assign to the user. This uses overwrite behaviour - roles included in this list will be assigned, and roles not included will be unassigned. Users cannot update their own roles. For a full description of the permissions associated to each role, see our product documentation.
responses:
UsersGetResponse:
description: Success
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
type: object
properties:
users:
type: array
description: The list of users matching the criteria specified.
items:
$ref: '#/components/schemas/User'
count:
type: integer
description: The total number of records (excluding the paging limit).
format: int32
responseCount:
type: integer
description: The total number of records returned in this response (always capped at 100).
format: int32
UserCreateConflict:
description: Conflict
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- EMAIL_NOT_UNIQUE
- MOBILE_OR_COUNTRY_CODE_INVALID
- EMAIL_DOMAIN_NOT_ALLOWED
- COUNTRY_OF_RESIDENCE_INVALID
- ROLE_NOT_FOUND
- CANNOT_MODIFY_OWN_ROLES
- ADMIN_ROLE_REMOVAL_NOT_ALLOWED
InternalServerError:
description: Internal Server Error - There is a problem with the server. Please try again later.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
BadRequestError:
description: Bad Request Error - Your request is invalid.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
type: object
properties:
message:
maxLength: 255
type: string
description: When present helps to identify and fix the problem.
syntaxErrors:
$ref: '#/components/schemas/SyntaxError'
TokenExpired:
description: Gone - The requested token is expired.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
$ref: '#/components/schemas/TokenError'
UserResponse:
description: Success
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
$ref: '#/components/schemas/User'
Error:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
TooManyRequests:
description: Too many requests.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
x-ratelimit-limit:
$ref: '#/components/headers/x-ratelimit-limit'
x-ratelimit-reset:
$ref: '#/components/headers/x-ratelimit-reset'
ServiceUnavailable:
description: Service Unavailable - The requested service is temporarily unavailable. Please try again later.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
NotFound:
description: Not found - The requested resource couldn't be found.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
UserInviteSendConflict:
description: Conflict
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- INVITE_ALREADY_CONSUMED
UserIdentitiesConflict:
description: Conflict
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- IDENTITY_TYPE_NOT_SUPPORTED
UserPatchConflict:
description: Conflict
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- EMAIL_NOT_UNIQUE
- MOBILE_OR_COUNTRY_CODE_INVALID
- MOBILE_NO_CHANGE_LIMIT_EXCEEDED
- TOO_FREQUENT_EMAIL_CHANGES
- EMAIL_DOMAIN_NOT_ALLOWED
- MOBILE_CHANGE_NOT_ALLOWED
- UNSUPPORTED_CURRENCY
- ROLE_NOT_FOUND
- CANNOT_MODIFY_OWN_ROLES
- ADMIN_ROLE_REMOVAL_NOT_ALLOWED
UserInviteConsumeConflict:
description: Conflict
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- INVITE_OR_INVITE_CODE_INVALID
- UNRESOLVED_IDENTITY
- PASSWORD_ALREADY_USED
- PASSWORD_PROFILE_NOT_CONFIGURED_FOR_CREDENTIAL_TYPE
- PASSWORD_TOO_SHORT
- PASSWORD_TOO_LONG
- PASSWORD_TOO_SIMPLE
- PASSWORD_KEY_ALREADY_IN_USE
- PASSWORD_ALREADY_CREATED
UserForbidden:
description: Forbidden - Access to the requested resource or action is forbidden.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- STEP_UP_REQUIRED
Forbidden:
description: Forbidden - Access to the requested resource or action is forbidden.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- INSUFFICIENT_PERMISSIONS
UserIdentitiesGetResponse:
description: Success
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
$ref: '#/components/schemas/UserIdentitiesGetResponseSchema'
UserInviteValidateConflict:
description: Conflict
content:
application/json:
schema:
type: object
properties:
errorCode:
type: string
enum:
- INVITE_OR_INVITE_CODE_INVALID
NotFoundToken:
description: Not found - The requested token couldn't be found.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
$ref: '#/components/schemas/TokenError'
Unauthorized:
description: Unauthorized - Your credentials or access token are invalid.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
NoContent:
description: Success - No Content.
headers:
request-ref:
$ref: '#/components/headers/request-ref'
TokenResponse:
description: Success
headers:
request-ref:
$ref: '#/components/headers/request-ref'
content:
application/json:
schema:
$ref: '#/components/schemas/TokenResponse'
schemas:
Brand:
type: string
pattern: ^[a-zA-Z0-9]+$
description: 'Brand identifier used to determine the set of email and SMS user notification templates. Must be alphanumeric, up to 25 characters, and contain no spaces.
'
# --- truncated at 32 KB (42 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/weavr/refs/heads/main/openapi/weavr-setup-api-openapi.yml