This page covers invites sent by your integration or by an operator. A signed-in customer
inviting their own sub-users or a corporate manager uses the same route on the Customer API,
with a different request.
Who calls it
Most integrations use a service user, so the examples on this page are written for one. An
operator sends the same body and adds a
confirmation; see
Step-up for operators.
What you can invite
role says what the user becomes. Leave it out to invite a customer.
Write
role exactly as shown, in capitals with underscores. consumer_cardholder is refused.
CORPORATE_MANAGER cannot be invited here. A corporate invites its own managers on the
Customer API.
Response
Every successful invite returns:applicationId identifies the user’s application, and is also their customerId. Use it to:
- follow their onboarding (Search
GET /v1/applications, or the customer status webhook); - submit KYC for them (
POST /v1/applications/{applicationId}/kyc); - order a card for a cardholder on a corporate, as
forCustomerId(Issue cards).
onboardingRole holds the role when it is one set up for
your program, and parent.relation names the user’s relation to the corporate (EMPLOYEE,
CONSUMER_CARDHOLDER).
Step-up for operators
An invite creates an account, so an operator must confirm it with a second factor: aconfirmation object carrying either a passkey or a TOTP code.
A service user never needs this. Leave confirmation out.
- TOTP
- Passkey
Send the 6-digit code from the operator’s authenticator app, with the operator’s
accessToken. This is the access token returned by the operator’s sign-in, not the ID
token you send as the bearer:
Nothing is created when step-up fails.
Customer
Company
AddisCompany: true to invite a company in place of an individual.
- Your program must support company onboarding, or the invite returns
400 This program does not support company (KYB) onboarding. isCompany: truecannot be sent with arole. Every role invites an individual.- A caller acting for a custodian cannot invite a company.
Sub-users
A sub-user is an individual funded from one of the parent customer’s accounts.PREPAID_CARD_CUSTOMER, CARD_ONLY and CHILD are sub-user roles. They
all take the same request; only role changes.
The funding account
accountId is the parent account the sub-user is funded from. It is checked before anything
is created. The account must:
- exist and be
ACTIVE, - be a real account, not one that is itself funded from a parent, and
- be in your program. For a caller acting for a custodian, it must also be under that custodian.
For security, the second message does not say whether the account exists.
Cardholders on a corporate
For programs where a corporate holds the account and other people hold cards on it. The cardholder is an individual with no account of their own. You say which corporate they belong to and which of its accounts they may use. There are two kinds of role:EMPLOYEE, for the corporate’s staff.- A role set up for your program, for cardholders who are not staff. For example
CONSUMER_CARDHOLDER, for consumers who hold a card on a corporate’s account.
role changes.
clientReference as well.
Rules
If one account in
accountIds is wrong, the whole invite is refused, and the message does not
say which one. The last error in the table is a problem with your program’s setup, not with
your request: tell Orenda the role and the program.
Send firstName and lastName: they are printed on the card. Your program may or may not
insist on them at invite time, so do not rely on a 400 to catch a missing name.
Only your integration or an operator can invite these roles. A signed-in customer cannot.
What the cardholder sees
Once onboarded:- Their own cards only. Another cardholder’s card on the same account is refused
(
422 CARD_ACCESS_NOT_PERMITTED). What they may do with their own card depends on the permissions of their role. - The accounts in
accountIdsand no others. They see every transaction on those accounts, including other cardholders’ card spending.
What happens next
After the invite, the next steps are yours:- Submit the cardholder’s KYC (
POST /v1/applications/{applicationId}/kyc). - Order their card on the corporate’s account, with
forCustomerId: <applicationId>. You can do this as soon as the invite returns. - Once KYC is approved, the cardholder signs in, accepts the legal agreements and uses the card.
customerId, and
webhooks for their card carry the corporate’s customerId and clientReference. So identify
these users in your own system by the applicationId from the invite, and match card webhooks
by cardId.
The user’s details
email is always required. Whether you also need to send firstName, lastName, dob,
nationality, phone and address depends on the role and on your program.
Send what you have. If a required detail is missing, the API returns
400 <field> is required for this invite.
For some sub-user roles,
address and phone are copied from the funding account’s owner. In
that case you can leave them out.
Optional extras
Additional accounts
additionalAccounts opens extra accounts for the user, on top of the ones onboarding creates.
List the names of the optional accounts your program offers.
400, and the message lists the names it does.
Pay-in IBAN
payInIBAN is assigned to the user. If the role has pay-in switched on, it is required,
and leaving it out returns
400 payInIBAN is required when pay-in is enabled for this role. Otherwise it is ignored.
Holding back the invitation email
Normally the user is emailed a temporary password as soon as you invite them. SendsendInvite: false to create the invite without emailing them yet. This is useful when
you need to prepare or review the application first.
POST /customers/{customerId}/reset, using the
applicationId from the invite as customerId.
- The reset route is not under
/v1, and it needs thecustomers.triage.resetpermission as well asaccessManagement.invite.customer. - A temporary password expires a fixed number of days after it is sent. Holding the email back until the application is ready means the user does not receive one that has already expired.
- Leaving
sendInviteout is the same as sendingtrue.
Programs that use a client reference
Some programs sign their users in with their own identity provider, and Orenda does not create a sign-in for them. Ask Orenda whether yours is one. If it is:- Send
clientReferenceon every invite, whatever the role. It is the user’s id in your identity provider, at most 36 characters, and it becomes their identity with Orenda. - It must be unique. Using one twice returns
409 An application already exists for this clientReference. - No invitation email is sent.
sendInvite: falsereturns400. - Only your integration or an operator can invite. Customers cannot invite on these programs.
clientReference out returns 400 clientReference is required for this program. On
every other program the field is ignored.
Field names are case-sensitive
role, isCompany and sendInvite must be written exactly. A mis-cased name is refused:
{ "Role": "CHILD" } returns 400 Unknown field "Role" — did you mean "role"?.
Errors at a glance
400 because of the request. Fix the request and send it again:
- a field is missing, mis-cased or in the wrong format
roleis not written in capitals with underscores, or is one of the reserved namesPROGRAM_CUSTOMER,DEFAULT,GUARDIAN,CUSTODIANroleisCORPORATE_MANAGER: a manager reaches the whole corporate, so the corporate invites them itself- a retired role field was sent (
isPrepaidCardCustomer,isCardOnly,isSpouse,isChild,isCorporateManager,isEmployee): the message names theroleto send instead - a detail the role needs is missing
- the funding account, the corporate, or an account in
accountIdscannot be used isCompany: truesent with a role, or by a caller acting for a custodianclientReferencemissing, orsendInvite: false, on a program that uses a client reference- a name in
additionalAccountsthat your program does not offer - no
programIdin the query
400 because of your program’s setup. Your request is fine; speak to Orenda:
When a request breaks more than one rule,
message lists them all, separated by ; .A few messages use Orenda’s internal names: a wrong account in accountIds is reported as
delegatedAccountIds, and an account funded from a parent is called a pseudo account. Act
on the status and the rest of the message.