One call creates the user and their application:
This page is the guide. Every field and every error is listed in the API reference, Invite a customer.
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.
You can only invite the roles your program has been given. The table below lists every role this route understands, not the ones available to you. Many programs have only one of them, and some have none. Inviting a role your program does not have returns 400. To find out which roles you have, or to have one added, speak to Orenda.
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).
When you read the application back, 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: a confirmation object carrying either a passkey or a TOTP code. A service user never needs this. Leave confirmation out.
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

The user onboards as a customer with their own account. Which of their details you need to send depends on your program; see The user’s details.

Company

Add isCompany: true to invite a company in place of an individual.
The company goes through business verification (KYB). Its legal name, owners and documents are collected during onboarding, not in the invite.
  • Your program must support company onboarding, or the invite returns 400 This program does not support company (KYB) onboarding.
  • isCompany: true cannot be sent with a role. 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.
Both take the same request; only role changes.
If your program uses a client reference, add 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 accountIds and 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:
  1. Submit the cardholder’s KYC (POST /v1/applications/{applicationId}/kyc).
  2. Order their card on the corporate’s account, with forCustomerId: <applicationId>. You can do this as soon as the invite returns.
  3. Once KYC is approved, the cardholder signs in, accepts the legal agreements and uses the card.
From then on, the cardholder’s own requests report the corporate’s 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.
A name your program does not offer returns 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. Send sendInvite: false to create the invite without emailing them yet. This is useful when you need to prepare or review the application first.
When you are ready, send the email with POST /customers/{customerId}/reset, using the applicationId from the invite as customerId.
Until you make that call, the user has an account they do not know about and cannot sign in to.
  • The reset route is not under /v1, and it needs the customers.triage.reset permission as well as accessManagement.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 sendInvite out is the same as sending true.

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 clientReference on 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: false returns 400.
  • Only your integration or an operator can invite. Customers cannot invite on these programs.
Leaving 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
  • role is not written in capitals with underscores, or is one of the reserved names PROGRAM_CUSTOMER, DEFAULT, GUARDIAN, CUSTODIAN
  • role is CORPORATE_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 the role to send instead
  • a detail the role needs is missing
  • the funding account, the corporate, or an account in accountIds cannot be used
  • isCompany: true sent with a role, or by a caller acting for a custodian
  • clientReference missing, or sendInvite: false, on a program that uses a client reference
  • a name in additionalAccounts that your program does not offer
  • no programId in 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.