API Response Mock
The exact payloads a client app receives for TZ — rebuilt from the configuration in this studio. Hand these to the web / iOS / Android teams to stub against before the config ships.
tz-retail_onboarding-web-api-mock.json. tz-retail_onboarding-web-api-mock.zip: journey-config.json, forms/{formKey}.json ×13, status/{stepId}/*.json ×2, lookups/*.json ×4, and a README.txt describing the contract. GET /journey-configs?countryCode=TZ&journeyId=retail_onboarding&channel=web{
"countryCode": "TZ",
"journeyId": "retail_onboarding",
"channel": "web",
"journeyVersion": 1,
"workflowConfig": {
"initiateAfterStepId": "basic_info",
"completeOnStepId": "confirm"
},
"steps": [
{
"stepId": "basic_info",
"type": "Form",
"formKey": "basic_info",
"formVersion": 1,
"title": "retail_onboarding.tz.step.basic_info.title",
"sequence": 1
},
{
"stepId": "biometric_fingerprints",
"type": "Form",
"formKey": "biometric_fingerprints",
"formVersion": 1,
"title": "retail_onboarding.tz.step.biometric_fingerprints.title",
"sequence": 2
},
{
"stepId": "selfie_liveness",
"type": "Form",
"formKey": "selfie_liveness",
"formVersion": 1,
"title": "retail_onboarding.tz.step.selfie_liveness.title",
"sequence": 3
},
{
"stepId": "identity_verification",
"type": "StatusPage",
"formKey": "identity_verification",
"formVersion": 1,
"title": "retail_onboarding.tz.step.identity_verification.title",
"sequence": 4
},
{
"stepId": "review_information",
"type": "ReviewForm",
"formKey": "review_information",
"formVersion": 1,
"title": "retail_onboarding.tz.step.review_information.title",
"sequence": 5
},
{
"stepId": "address",
"type": "Form",
"formKey": "address",
"formVersion": 1,
"title": "retail_onboarding.tz.step.address.title",
"sequence": 6
},
{
"stepId": "occupation",
"type": "Form",
"formKey": "occupation",
"formVersion": 1,
"title": "retail_onboarding.tz.step.occupation.title",
"sequence": 7
},
{
"stepId": "email",
"type": "Form",
"formKey": "email",
"formVersion": 1,
"title": "retail_onboarding.tz.step.email.title",
"sequence": 8
},
{
"stepId": "confirm",
"type": "ConfirmForm",
"formKey": "confirm",
"formVersion": 1,
"title": "retail_onboarding.tz.step.confirm.title",
"sequence": 9
},
{
"stepId": "account_opening",
"type": "StatusPage",
"formKey": "account_opening",
"formVersion": 1,
"title": "retail_onboarding.tz.step.account_opening.title",
"sequence": 10
}
],
"branches": [
{
"branchId": "fatca",
"triggerAfterStep": "occupation",
"resumeBeforeStep": "confirm",
"description": "retail_onboarding.tz.branch.fatca.description",
"triggerHint": {
"field": "/countryOfResidence",
"displayCondition": "is_not_equal_to",
"displayValue": "TZ"
},
"steps": [
{
"stepId": "confidentiality_waiver",
"type": "ConsentForm",
"formKey": "confidentiality_waiver",
"formVersion": 1,
"title": "retail_onboarding.tz.branch.fatca.confidentiality_waiver.title",
"sequence": 1
},
{
"stepId": "fatca_tax_details",
"type": "Form",
"formKey": "fatca_tax_details",
"formVersion": 1,
"title": "retail_onboarding.tz.branch.fatca.fatca_tax_details.title",
"sequence": 2
},
{
"stepId": "fatca_documents",
"type": "Form",
"formKey": "fatca_documents",
"formVersion": 1,
"title": "retail_onboarding.tz.branch.fatca.fatca_documents.title",
"sequence": 3
}
]
},
{
"branchId": "crs",
"triggerAfterStep": "occupation",
"resumeBeforeStep": "confirm",
"description": "retail_onboarding.tz.branch.crs.description",
"triggerHint": {
"field": "/countryOfResidence",
"displayCondition": "is_not_equal_to",
"displayValue": "TZ"
},
"steps": [
{
"stepId": "crs_declaration",
"type": "ConsentForm",
"formKey": "crs_declaration",
"formVersion": 1,
"title": "retail_onboarding.tz.branch.crs.crs_declaration.title",
"sequence": 1
},
{
"stepId": "crs_tax_details",
"type": "Form",
"formKey": "crs_tax_details",
"formVersion": 1,
"title": "retail_onboarding.tz.branch.crs.crs_tax_details.title",
"sequence": 2
}
]
}
]
}Form config responses
One per step, resolved as base form + TZ overlays for web. Reaches the client embedded as form on the step response.
Status page responses
A STATUS_PAGE step reaches the client with form: null — there is nothing to render from config. The app shows a waiting screen whose button polls the step's status endpoint, and the actionCode in the reply decides what happens next. Posting a payload to the step is rejected.
identity_verificationGET /onboarding/onboardings/{onboardingId}/steps/identity_verification/statuspendingStill processingNo action code yet — the service is still waiting on the upstream check. The client keeps polling.
{
"stepId": "identity_verification",
"stepStatus": "Draft",
"actionCode": null,
"businessReason": null,
"nextStepId": null,
"nextStepType": null,
"nextStep": null
}00ProceedThe service records the fetched data as this step’s submission and advances. The reply carries nextStepId/nextStepType/nextStep, so the client renders the next screen without a second call.
{
"stepId": "identity_verification",
"stepStatus": "Validated",
"actionCode": "00",
"businessReason": null,
"nextStepId": "review_information",
"nextStepType": "ReviewForm",
"nextStep": null
}80RetryThe service reverts the earlier capture steps and sends the customer back to re-capture. For TZ that is biometric_fingerprints, which also forces selfie_liveness to be redone — the target is fixed in the service, not in this config.
{
"stepId": "identity_verification",
"stepStatus": "Invalid",
"actionCode": "80",
"businessReason": "Reported by the upstream identity check",
"nextStepId": null,
"nextStepType": null,
"nextStep": null
}99KillThe service discards the workflow and the journey. The onboarding ends here.
{
"stepId": "identity_verification",
"stepStatus": "Invalid",
"actionCode": "99",
"businessReason": "Reported by the upstream identity check",
"nextStepId": null,
"nextStepType": null,
"nextStep": null
}account_openingGET /onboarding/onboardings/{onboardingId}/steps/account_opening/statuspendingStill processingNo action code yet — the service is still waiting on the upstream check. The client keeps polling.
{
"stepId": "account_opening",
"stepStatus": "Draft",
"actionCode": null,
"businessReason": null,
"nextStepId": null,
"nextStepType": null,
"nextStep": null
}00ProceedThe service records the fetched data as this step’s submission and advances. The reply carries nextStepId/nextStepType/nextStep, so the client renders the next screen without a second call.
{
"stepId": "account_opening",
"stepStatus": "Validated",
"actionCode": "00",
"businessReason": null,
"nextStepId": null,
"nextStepType": null,
"nextStep": null
}80RetryThe service reverts the earlier capture steps and sends the customer back to re-capture. For TZ that is biometric_fingerprints, which also forces selfie_liveness to be redone — the target is fixed in the service, not in this config.
{
"stepId": "account_opening",
"stepStatus": "Invalid",
"actionCode": "80",
"businessReason": "Reported by the upstream identity check",
"nextStepId": null,
"nextStepType": null,
"nextStep": null
}99KillThe service discards the workflow and the journey. The onboarding ends here.
{
"stepId": "account_opening",
"stepStatus": "Invalid",
"actionCode": "99",
"businessReason": "Reported by the upstream identity check",
"nextStepId": null,
"nextStepType": null,
"nextStep": null
}Lookup responses
Country data, not form config — the client calls these separately from the journey. Edit TZ country data →
GET /onboarding/lookups/currencies?countryCode=TZ{
"statusCode": 200,
"message": "Success",
"data": {
"items": [
{
"id": 1,
"currencyCode": "EUR",
"currencyDescription": null
},
{
"id": 2,
"currencyCode": "GBP",
"currencyDescription": null
},
{
"id": 3,
"currencyCode": "TZS",
"currencyDescription": null
},
{
"id": 4,
"currencyCode": "USD",
"currencyDescription": null
}
]
}
}GET /onboarding/lookups/account-products?countryCode=TZ&residenceCountryCode=TZ{
"statusCode": 200,
"message": "Success",
"data": {
"items": [
{
"schemeCode": "SB100",
"accountType": "Savings Account",
"description": "An Ordinary Account is a standard personal banking account offering easy access to funds through cash and cheque deposits, mobile, and internet banking. It has no minimum balance or monthly charges.",
"imageUrl": null,
"residencyType": "Resident",
"features": [
"No minimum operating balance",
"No monthly charges",
"Full access to mobile banking and internet banking",
"Customer can choose a payment card that best suits their needs, including prepaid cards, debit cards, and credit cards",
"Cash and cheque deposits"
],
"requirements": [
"Original and copy National Identity Card/ Valid Passport/Valid Maisha Identification Card",
"KRA Pin Certificate"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": null
},
{
"schemeCode": "SB110",
"accountType": "Savings Account",
"description": "The Non-Resident Account is tailored for individuals living abroad to manage finances in Kenya conveniently. It offers full access to mobile and internet banking with no minimum balance or monthly charges.",
"imageUrl": null,
"residencyType": "NonResident",
"features": [
"No minimum operating balance",
"No monthly charges",
"Full access to mobile banking and internet banking",
"Customer can choose a payment card that best suits their needs",
"Cash and cheque deposits",
"No maintenance fees",
"No ledger fees",
"Customers can access accounts from any of the countries Equity Bank operates in"
],
"requirements": [
"Individuals (singly or jointly) – Original Identification document & KRA PIN",
"Registered Groups – Registration Certificate, Constitution, minutes of resolution to open account certified by the DSDO",
"An introduction letter from the DSDO"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": null
},
{
"schemeCode": "CA201",
"accountType": "Current Account",
"description": "The Equity Bank Personal Current Account (CA201) is a non-interest bearing account with no minimum balance or monthly charges, offering full mobile banking access and flexible payment card options.",
"imageUrl": null,
"residencyType": "Resident",
"features": [
"No minimum operating balance",
"Non-interest earning",
"No monthly charges",
"Full access to mobile banking",
"Customer can choose a payment card that best suits their needs: Prepaid cards, Debit cards, Credit cards",
"Cash and cheque deposits",
"Chequebook"
],
"requirements": [
"Original and copy National Identity Card/ Valid Passport/Valid Maisha Identification Card",
"KRA Pin Certificate"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": "This account does not earn interest."
},
{
"schemeCode": "CA210",
"accountType": "Current Account",
"description": "A convenient and flexible medium for a range of transactions. With this account you can make deposits, receive money, make payments, make withdrawals and set up standing orders.",
"imageUrl": null,
"residencyType": "NonResident",
"features": [
"No minimum opening balance",
"No minimum operating balance",
"Non-interest earning",
"No monthly charges",
"No maintenance fees",
"No ledger fees",
"Full access to mobile banking",
"Customer can choose a payment card that best suits their needs",
"Cash and cheque deposits",
"Cheque book available when required",
"Customers can access the account from any of the countries Equity Bank operates in"
],
"requirements": [
"Individuals (singly or jointly) – Original Identification document & KRA PIN",
"Registered Groups – Registration Certificate, Constitution, minutes of resolution certified by the DSDO",
"An introduction letter from the DSDO"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": null
},
{
"schemeCode": "SB100",
"accountType": "Savings Account",
"description": "An Ordinary Account is a standard personal banking account offering easy access to funds through cash and cheque deposits, mobile, and internet banking. It has no minimum balance or monthly charges.",
"imageUrl": null,
"residencyType": "Resident",
"features": [
"No minimum operating balance",
"No monthly charges",
"Full access to mobile banking and internet banking",
"Customer can choose a payment card that best suits their needs, including prepaid cards, debit cards, and credit cards",
"Cash and cheque deposits"
],
"requirements": [
"Original and copy National Identity Card/ Valid Passport/Valid Maisha Identification Card",
"KRA Pin Certificate"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": null
},
{
"schemeCode": "SB100",
"accountType": "Savings Account",
"description": "An Ordinary Account is a standard personal banking account offering easy access to funds through cash and cheque deposits, mobile, and internet banking. It has no minimum balance or monthly charges.",
"imageUrl": null,
"residencyType": "Resident",
"features": [
"No minimum operating balance",
"No monthly charges",
"Full access to mobile banking and internet banking",
"Customer can choose a payment card that best suits their needs, including prepaid cards, debit cards, and credit cards",
"Cash and cheque deposits"
],
"requirements": [
"Original and copy National Identity Card/ Valid Passport/Valid Maisha Identification Card",
"KRA Pin Certificate"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": null
},
{
"schemeCode": "SB100",
"accountType": "Savings Account",
"description": "An Ordinary Account is a standard personal banking account offering easy access to funds through cash and cheque deposits, mobile, and internet banking. It has no minimum balance or monthly charges.",
"imageUrl": null,
"residencyType": "Resident",
"features": [
"No minimum operating balance",
"No monthly charges",
"Full access to mobile banking and internet banking",
"Customer can choose a payment card that best suits their needs, including prepaid cards, debit cards, and credit cards",
"Cash and cheque deposits"
],
"requirements": [
"Original and copy National Identity Card/ Valid Passport/Valid Maisha Identification Card",
"KRA Pin Certificate"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": null
},
{
"schemeCode": "CA201",
"accountType": "Current Account",
"description": "The Equity Bank Personal Current Account (CA201) is a non-interest bearing account with no minimum balance or monthly charges, offering full mobile banking access and flexible payment card options.",
"imageUrl": null,
"residencyType": "Resident",
"features": [
"No minimum operating balance",
"Non-interest earning",
"No monthly charges",
"Full access to mobile banking",
"Customer can choose a payment card that best suits their needs: Prepaid cards, Debit cards, Credit cards",
"Cash and cheque deposits",
"Chequebook"
],
"requirements": [
"Original and copy National Identity Card/ Valid Passport/Valid Maisha Identification Card",
"KRA Pin Certificate"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": "This account does not earn interest."
},
{
"schemeCode": "CA201",
"accountType": "Current Account",
"description": "The Equity Bank Personal Current Account (CA201) is a non-interest bearing account with no minimum balance or monthly charges, offering full mobile banking access and flexible payment card options.",
"imageUrl": null,
"residencyType": "Resident",
"features": [
"No minimum operating balance",
"Non-interest earning",
"No monthly charges",
"Full access to mobile banking",
"Customer can choose a payment card that best suits their needs: Prepaid cards, Debit cards, Credit cards",
"Cash and cheque deposits",
"Chequebook"
],
"requirements": [
"Original and copy National Identity Card/ Valid Passport/Valid Maisha Identification Card",
"KRA Pin Certificate"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": "This account does not earn interest."
},
{
"schemeCode": "CA201",
"accountType": "Current Account",
"description": "The Equity Bank Personal Current Account (CA201) is a non-interest bearing account with no minimum balance or monthly charges, offering full mobile banking access and flexible payment card options.",
"imageUrl": null,
"residencyType": "Resident",
"features": [
"No minimum operating balance",
"Non-interest earning",
"No monthly charges",
"Full access to mobile banking",
"Customer can choose a payment card that best suits their needs: Prepaid cards, Debit cards, Credit cards",
"Cash and cheque deposits",
"Chequebook"
],
"requirements": [
"Original and copy National Identity Card/ Valid Passport/Valid Maisha Identification Card",
"KRA Pin Certificate"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": "This account does not earn interest."
},
{
"schemeCode": "SB110",
"accountType": "Savings Account",
"description": "The Non-Resident Account is tailored for individuals living abroad to manage finances in Kenya conveniently.",
"imageUrl": null,
"residencyType": "NonResident",
"features": [
"No minimum operating balance",
"No monthly charges",
"Full access to mobile banking and internet banking",
"No maintenance fees",
"No ledger fees",
"Customers can access accounts from any of the countries Equity Bank operates in"
],
"requirements": [
"Individuals (singly or jointly) – Original Identification document & KRA PIN",
"Registered Groups – Registration Certificate, Constitution, minutes of resolution certified by the DSDO"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": null
},
{
"schemeCode": "SB110",
"accountType": "Savings Account",
"description": "The Non-Resident Account is tailored for individuals living abroad to manage finances in Kenya conveniently.",
"imageUrl": null,
"residencyType": "NonResident",
"features": [
"No minimum operating balance",
"No monthly charges",
"Full access to mobile banking and internet banking",
"No maintenance fees",
"No ledger fees",
"Customers can access accounts from any of the countries Equity Bank operates in"
],
"requirements": [
"Individuals (singly or jointly) – Original Identification document & KRA PIN",
"Registered Groups – Registration Certificate, Constitution, minutes of resolution certified by the DSDO"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": null
},
{
"schemeCode": "SB110",
"accountType": "Savings Account",
"description": "The Non-Resident Account is tailored for individuals living abroad to manage finances in Kenya conveniently.",
"imageUrl": null,
"residencyType": "NonResident",
"features": [
"No minimum operating balance",
"No monthly charges",
"Full access to mobile banking and internet banking",
"No maintenance fees",
"No ledger fees",
"Customers can access accounts from any of the countries Equity Bank operates in"
],
"requirements": [
"Individuals (singly or jointly) – Original Identification document & KRA PIN",
"Registered Groups – Registration Certificate, Constitution, minutes of resolution certified by the DSDO"
],
"tariffGuideUrl": "https://equitygroupholdings.com/ke/media/images/docs/tariff-guide.pdf",
"costNote": "You can find all charges in our tariff guide.",
"specialNotes": null
}
]
}
}GET /onboarding/lookups/terms-and-conditions?journeyId=retail_onboarding&countryCode=TZ{
"content": "https://oneequity.blob.core.windows.net/tnc/digital-onboarding/ke/Updated%20Terms%20and%20Conditions%20(for%20Digital%20Onboarding)%20v2026.02.05.pdf",
"mediaType": "application/pdf",
"contentType": "url"
}GET /onboarding/lookups/privacy-policy?journeyId=retail_onboarding&countryCode=TZ{
"content": "https://oneequity.blob.core.windows.net/tnc/digital-onboarding/ke/Digital%20Onboarding%20App%20-%20Abbreviated%20EBKL%20Privacy%20Notice%20v2026.02.05.pdf",
"mediaType": "application/pdf",
"contentType": "url"
}- hash & context. The live form payload also carries a server-computed
hash(SHA-256 over the resolved schema + ui) and acontextdictionary. Both are computed at resolve time, so the mock omits them rather than inventing values — treat them as present-but-opaque. - Branch conditions stay server-side. A branch exposes only
triggerHintto clients; the realconditiontree and any stepexitRulesare evaluated by the backend and never serialized. - otpEnabled is internal.
workflowConfigreaches clients withinitiateAfterStepIdandcompleteOnStepIdonly. - Step types are PascalCase on the wire. Seed files say
REVIEW_FORM; the API emitsReviewForm. Nulls are serialized, not dropped. - Status pages carry no form. A
STATUS_PAGEstep binds a form so the service can validate what it fetches itself, but the client receivesform: null. The replies shown above are composed from the contract, not captured — what comes back depends on the upstream check, and the00reply also inlines the next step's resolved form undernextStep.