Integration Users
The QA API exposes two endpoints for creating integration test users. The predefined states approach is quick and opinionated — you pick a named state and the service wires up a complete, realistic user behind the scenes. The custom users approach is flexible and JSON-driven — you supply every field explicitly and the service writes only what you describe.
Both endpoints return a user_id that can be stored and reused across test scenarios.
Predefined States (POST /qa/integration/user)
A predefined state is a named configuration that sets up a complete user in a specific condition —
for example float_ready (bank account connected, income detected, float eligibility confirmed) or
banned (account created and immediately banned in User Service).
The request body requires three fields:
| Field | Description |
|---|---|
|
Email address for the new user. Must be unique. |
|
Initial Auth0 password. |
|
One of the enumerated state names (see below). |
38 named states are defined, plus the sub_overdue_<N>d wildcard (any positive integer N). The full list with descriptions is in
Predefined States.
| Predefined states are opinionated by design. Bank account institution, starting balance, transaction history depth, and float limits are all chosen by the handler. Use custom users when you need to control those parameters. |
Custom Users (POST /qa/integration/custom-user)
The custom user endpoint accepts a single JSON object whose top-level keys correspond to independent
subsystems. Only user and plaid are required; all other sections are optional and are silently
skipped when absent.
user — Base User Profile
| Field | Required | Description |
|---|---|---|
|
yes |
First name. A random value is generated when left blank. |
|
yes |
Last name. A random value is generated when left blank. |
|
yes |
Email address. If empty, a unique |
|
yes |
Auth0 password. |
|
yes |
Phone number string (digits only). Defaults to |
|
yes |
Residential address. Each defaults to a random fake value when empty. |
|
yes |
ISO-8601 timestamp of account creation. |
|
yes |
Initial account status. Accepted values: |
|
yes |
Verification flags written to the Auth0 and User Service profiles. |
|
no (output) |
Populated by the service after creation. Returned in the response body. |
plaid — Bank Account Configuration
Controls the Plaid sandbox item linked to the user. override_accounts, credit_accounts,
student_accounts, institution_id, invalid, and removed are all required fields on the
object (arrays may be empty).
| Field | Description |
|---|---|
|
Array of depository accounts (checking, savings). Each account specifies |
|
Array of credit card accounts with APR, payment amounts, and transactions. When non-empty, a Plaid liabilities webhook is fired after item creation. |
|
Array of student loan accounts. Also triggers the liabilities webhook when non-empty. |
|
Plaid institution ID to associate with the item (e.g. |
|
When |
|
When |
| When all three account arrays are empty no Plaid item is created and no webhook is fired. |
subscriptions — Subscription Records
An array of subscription records written directly to the Subscription Service, bypassing the normal
billing pipeline. Each record maps to a QASubscription object.
| Field | Required | Description |
|---|---|---|
|
yes |
Unique identifier for the subscription record. |
|
yes |
Billing date (RFC 3339). |
|
yes |
Amount as a string (e.g. |
|
yes |
Current status (e.g. |
|
yes |
Billing period in |
|
yes |
Record creation timestamp (RFC 3339). |
|
no |
Array of |
floats — Float Records
An array of advance (float) records written directly to the Float Service. Floats are added after all concurrent steps complete because scheduling a float can interfere with debit card and bank account setup.
| Field | Required | Description |
|---|---|---|
|
yes |
Float amount (e.g. |
|
yes |
Fee charged for the advance. |
|
yes |
Advance type: |
|
yes |
Current credit and debit leg statuses. |
|
no |
Scheduled or actual settlement dates (RFC 3339). |
|
yes |
Record creation timestamp (RFC 3339). |
|
yes |
Underwriting evaluation ID linked to this advance. |
|
no |
Array of |
loans — LOC Loan Records
An array of line-of-credit loan records written to the LOC Service. Each loan may include
installment schedules and payment records. Payments are created as a second call to
QACreatePayments after the loan itself is written.
| Field | Required | Description |
|---|---|---|
|
yes |
Unique loan identifier. |
|
yes |
Monetary amounts in cents. |
|
yes |
Fee configuration. |
|
yes |
Loan status (e.g. |
|
yes |
Whether autopay is enabled for the loan. |
|
yes |
Array of installment records, each with |
|
no |
Array of |
float_profile — Underwriting Float Profile
Sets the user’s float eligibility configuration in the Underwriting Service, including the maximum float limit and whether LOC loans are enabled.
| Field | Required | Description |
|---|---|---|
|
yes |
Maximum float limit in dollars (e.g. |
|
yes |
Maximum LOC loan limit. |
|
yes |
Whether LOC products are available to this user. |
|
no |
Whether float advances are available. Defaults to |
debit_card — Payment Card Configuration
An array of debit card records added to the Payments Service. The first card marked is_primary:
true (or the first card in the array if none is marked) is registered as the primary card type
ALL. Subsequent cards use type NONE.
| Field | Required | Description |
|---|---|---|
|
yes |
When |
|
no |
When |
|
no |
Designates the primary card. First card in the array is used as primary if none is flagged. |
income — Employment / Income Record
Creates an employment record in the Insight Service. Income is added after floats to avoid it being overwritten when a bank account connection triggers an institution-change handler.
| Field | Required | Description |
|---|---|---|
|
yes |
Employer name. |
|
yes |
Pay frequency (e.g. |
|
yes |
First payday date string. |
|
yes |
Pay type (e.g. |
iterable — Push Notification Device Registration
Registers a mobile device token with Iterable for push notification testing.
| Field | Required | Description |
|---|---|---|
|
yes |
Firebase device token. |
|
yes |
|
|
yes |
Push integration name configured in Iterable. |
|
no |
Whether the push endpoint is active. |
|
no |
Whether notifications are enabled for this device. |
|
no |
Device model or phone type string. |
Downstream Effects
The CreateCustomIntegrationUser handler writes to downstream services in the following order:
-
Auth0 —
createUser()registers the account and returns anauth0_user_id. The FloatMe user ID is extracted from the Auth0 ID by splitting on|. -
User Service —
createUserInFloatmeAPI()invokes theuser-handler-floatme-testLambda directly (bypassing API Gateway) to create the user profile record. These two steps are sequential and must complete before anything else proceeds. -
The following steps run concurrently via
executeConcurrently():-
Plaid —
addPlaid()creates a sandbox Plaid item and saves it via the Transactions Service. Past balance records are written after the item is linked. Invalid/removed flags trigger additional Plaid sandbox calls. -
Payments Service —
addDebitCards()registers each debit card. The primary card is added first; non-primary cards use an exponential backoff retry policy. -
Subscription Service —
addSubscriptions()writes subscription records including full payment history. -
Payments Service (payments) —
addPayments()posts subscription payment records to the Payments Service. -
Underwriting / Float Service —
updateFloatProfile()creates the float eligibility profile. -
LOC Service —
addLocLoans()creates loan records and then loan payment records. -
Iterable —
addIterableUser()registers the device token for push notifications.
-
-
Float Service —
addFloats()writes advance records. This step runs after the concurrent block because scheduling a float can block debit card and bank account setup. -
Insight Service —
addIncome()creates the employment record. A short sleep precedes this step to prevent the income record from being deleted when a bank account event fires the institution-change handler. -
User Service (status) —
handleCustomUserStatus()applies any requested account status mutation (ban, pause, close, clear) as the final step.
Bypass rules are not written by the custom user handler. They are written by specific
predefined state handlers (e.g. float_ready_bypass, multiple_items) via createBypass(),
which saves a RequirementsByPass record directly to DynamoDB through the BypassRepo.
|
Related Pages
-
Predefined States — full list of named state configurations
-
API Reference — complete endpoint reference with request/response schemas
-
Simulation Flows — how to simulate billing and collection events after user creation