Boarding Forms API Reference
API endpoints for managing boarding form templates and generating form links
This page documents the API endpoints for creating and managing boarding form templates and the boarding forms generated from them. For a workflow-oriented walkthrough, see Creating Forms. For onboarding a merchant to multiple fintech connections from a single form, see Multi-Connection Boarding Forms.
Form Templates
Create Form Template
Endpoint: POST /v1/formTemplates Content-Type: multipart/form-data
Creates a new form template with branding and configuration settings.
Request Fields:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Template name (displayed in browser tab). |
domain | string | Yes | Configured domain URL (for example, https://boarding.yourdomain.com). |
returnUrl | string | Yes | Redirect URL after form completion. |
expirationUrl | string | Yes | Redirect URL when the form expires. |
expirationInHours | number | Yes | Hours until form links expire (1-2160). |
displayTos | boolean | Yes | Show the Terms & Conditions step in the form. |
tosUrl | string | No | Platform terms-of-service URL. |
autoTransmitMerchantData | boolean | No | Automatically initiate onboarding when the merchant submits the form. |
displayNewUserLogin | boolean | No | Show the Account Login step. |
mccCodes | string | No | Comma-separated MCC codes to override the platform's default list. |
type | string | No | Form type: KYC (default) or RFI. |
headingTitle | string | Yes | Header text. |
headingTitleColor | string | No | Header text color in hex (default: #000000). |
headingAccentColor | string | No | Progress icon color in hex (default: #4013BE). |
buttonTextColor | string | No | Button text color in hex (default: #FFFFFF). |
buttonAccentColor | string | No | Button background color in hex (default: #808080). |
supportUrl | string | No | Support website URL. |
supportEmail | string | No | Support email address. |
supportPhone | string | No | Support phone number (11 digits, no formatting). |
supportText | string | No | Additional support text. |
logo | file | No | Logo image (JPG/PNG, max 2MB, recommended 250×100px). |
Response Example:
{
"id": "formTemp_test_7ffxgaw71x82zsg0psxd7q73nh",
"name": "Standard Onboarding",
"domain": "https://boarding.yourplatform.com",
"returnUrl": "https://yourplatform.com/onboarding/complete",
"expirationUrl": "https://yourplatform.com/onboarding/expired",
"expirationInHours": 48,
"displayTos": true,
"tosUrl": "https://yourplatform.com/terms",
"autoTransmitMerchantData": true,
"type": "KYC",
"heading": {
"title": "Your Platform Name",
"titleColor": "#000000",
"accentColor": "#4013BE",
"logo": "https://..."
},
"button": {
"textColor": "#FFFFFF",
"accentColor": "#808080"
},
"support": {
"url": "https://yourplatform.com/support",
"email": "[email protected]",
"phone": "18005551234",
"text": "Available Monday-Friday"
},
"isTestMode": false,
"createdOn": "2026-05-01T10:30:00Z",
"createdBy": "usr_abc123"
}Update Form Template
Endpoint: PATCH /v1/formTemplates/:id Content-Type: multipart/form-data
Updates an existing form template. Only the fields included in the request are updated.
Path Parameters:
| Parameter | Description |
|---|---|
id | Form template ID. |
Request Fields: Same as Create Form Template — all fields are optional on update.
Template changes apply to new form links onlyExisting form links continue using the configuration that was in place when they were generated. Update the template, then generate new form links to apply the changes.
Get All Form Templates
Endpoint: GET /v1/formTemplates
Returns all form templates for your platform.
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
lastId | string | Pagination cursor from the previous response. |
Response Example:
{
"formTemplates": [
{
"id": "formTemp_test_7ffxgaw71x82zsg0psxd7q73nh",
"name": "Standard Onboarding",
"domain": "https://boarding.yourplatform.com",
"type": "KYC",
"isTestMode": false
}
],
"hasMore": false,
"lastId": null
}Get Form Template by ID
Endpoint: GET /v1/formTemplates/:id
Returns a specific form template.
Path Parameters:
| Parameter | Description |
|---|---|
id | Form template ID. |
Forms
Create Form
Endpoint: POST /v1/forms
Generates a boarding form link for a merchant to complete. A form can target a single fintech connection (connectionId) or multiple connections at once (connectionIds).
Request Body — Single Connection:
{
"merchantId": "mid_1sxmscs49g95t8y6n79nt922xr",
"connectionId": "Payrix",
"formTemplateId": "formTemp_test_7ffxgaw71x82zsg0psxd7q73nh"
}Request Body — Multi-Connection:
{
"merchantId": "mid_1sxmscs49g95t8y6n79nt922xr",
"connectionIds": ["Payrix", "Greensky"],
"formTemplateId": "formTemp_test_7ffxgaw71x82zsg0psxd7q73nh"
}Required Fields:
| Field | Type | Description |
|---|---|---|
merchantId | string | Merchant ID. |
connectionId | string | Single connection name (Payrix, Greensky, AdyenForPlatforms, etc.) or connection ID (midCon_...). Mutually exclusive with connectionIds. Supports both KYC and RFI form types. |
connectionIds | string[] | Array of connection names or connection IDs for a multi-connection form. Mutually exclusive with connectionId. KYC forms only. |
formTemplateId | string | Template ID for default styling and configuration. |
Connection names vs. connection IDsFor both
connectionIdand entries inconnectionIds, you can provide either the connection name (Payrix,Greensky,AdyenForPlatforms, etc.) or the connection ID (midCon_...). We recommend using connection names — they're easier to read, easier to copy from a list of supported connections, and don't require you to look up the connection ID for the specific merchant first. Preczn resolves connection names to the matching connection on the merchant.
PassconnectionIdorconnectionIds, not bothA request must include exactly one of the two fields. Sending both, or neither, returns
400 Bad Request. Multi-connection forms are KYC only — combiningconnectionIdswithtype: "RFI"is rejected with a400 Bad Request. See Multi-Connection Boarding Forms for the full feature guide.
Optional Overrides:
Any field on the form template can be overridden per form by including it in the request body.
| Field | Type | Description |
|---|---|---|
name | string | Browser tab title. |
returnUrl | string | Redirect URL after form completion. |
expirationUrl | string | Redirect URL when the form expires. |
expirationInHours | number | Hours until the form expires (1-2160). |
autoTransmitMerchantData | boolean | Auto-initiate onboarding on submit. |
displayTos | boolean | Show the Terms & Conditions step. |
displayNewUserLogin | boolean | Show the Account Login step. |
tosUrl | string | Platform terms-of-service URL. |
heading | object | Header branding (see Create Form Template). |
button | object | Button styling (see Create Form Template). |
support | object | Support modal content (see Create Form Template). |
mccCodes | string | Comma-separated MCC codes. |
type | string | Form type: KYC or RFI (RFI is single-connection only). |
Response Example — Single Connection:
{
"id": "form_5mno6pqr7stu8vwx",
"merchantId": "mid_1sxmscs49g95t8y6n79nt922xr",
"connectionId": "midCon_6v59stftbs837axmpahj21m8jf",
"processorName": "Payrix",
"url": "https://boarding.yourplatform.com/form_5mno6pqr7stu8vwx/AcmeCorp",
"expiresOn": "2026-05-07T10:30:00Z",
"heading": { },
"button": { },
"support": { }
}Response Example — Multi-Connection:
{
"id": "form_5mno6pqr7stu8vwx",
"merchantId": "mid_1sxmscs49g95t8y6n79nt922xr",
"connectionIds": [
"midCon_6v59stftbs837axmpahj21m8jf",
"midCon_8xq2hbgptn5193cymopdq2x4kc"
],
"processorNames": ["Payrix", "Greensky"],
"url": "https://boarding.yourplatform.com/form_5mno6pqr7stu8vwx/AcmeCorp",
"expiresOn": "2026-05-07T10:30:00Z",
"heading": { },
"button": { },
"support": { }
}Single-connection responses return connectionId and processorName (singular). Multi-connection responses return connectionIds and processorNames (plural). The two shapes are mutually exclusive — a response will never contain both.
You send the url to the merchant the same way you would for any other boarding form.
Get Merchant Forms
Endpoint: GET /v1/forms/merchant/:merchantId
Returns all forms generated for a specific merchant.
Path Parameters:
| Parameter | Description |
|---|---|
merchantId | Merchant ID. |
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
lastId | string | Pagination cursor from the previous response. |
Response Example:
{
"forms": [
{
"id": "form_5mno6pqr7stu8vwx",
"merchantId": "mid_1sxmscs49g95t8y6n79nt922xr",
"connectionId": "midCon_6v59stftbs837axmpahj21m8jf",
"processorName": "Payrix",
"url": "https://boarding.yourplatform.com/form_5mno6pqr7stu8vwx/AcmeCorp",
"expiresOn": "2026-05-07T10:30:00Z",
"createdOn": "2026-05-01T10:30:00Z"
}
],
"hasMore": false,
"lastId": null
}Multi-connection forms in this response use the plural connectionIds and processorNames fields in place of connectionId and processorName.
Get Form by ID
Endpoint: GET /v1/forms/:formId
Returns details for a specific form.
Path Parameters:
| Parameter | Description |
|---|---|
formId | Form ID. |
The response shape matches the Create Form response — single-connection forms return singular fields, multi-connection forms return plural fields.
Related Webhooks
When autoTransmitMerchantData is enabled and a submitted form triggers onboarding, you'll receive a merchant.updated webhook with the updated connection status. For multi-connection forms, you'll receive one merchant.updated event per connection as each one moves through the boarding lifecycle.
Webhook Example:
{
"event": "merchant.updated",
"data": {
"id": "mid_1sxmscs49g95t8y6n79nt922xr",
"connections": [
{
"id": "midCon_6v59stftbs837axmpahj21m8jf",
"processor": "Payrix",
"status": "Queued"
}
]
}
}
No dedicated webhook fires when a form is submittedTo detect form completion, query
GET /v1/forms/:formIdand check thecompletionDatefield, or subscribe to the connection-status webhooks above that fire when each connection moves through the boarding lifecycle.
Error Responses
| Status | Meaning |
|---|---|
400 | Bad Request — invalid input or business-rule violation (for example, sending both connectionId and connectionIds, or combining connectionIds with type: "RFI"). |
401 | Unauthorized — invalid or missing API key. |
403 | Forbidden — the API key doesn't have access to this resource. |
404 | Not Found — template, form, merchant, or referenced connection doesn't exist. |
500 | Server Error — retry the request. |
Example Error:
{
"statusCode": 404,
"message": "Form Template not found",
"error": "Not Found"
}Updated 1 day ago
