Skip to navigation

Manage applications with the API

Beta
Learn how to create, submit, and track boarding applications with the Payabli API
View as MarkdownOpen in Claude
Applies to:Developers

Intelligent boarding is in beta. To opt in, reach out to your Payabli contact.

An application is a paypoint’s request for service. It boards a business through one of its paypoints, and moves through review until its requested services are live. Use the applications API to create an application, submit it for review, respond to underwriting, and track its status. For how applications fit into the wider model, see the boarding overview.

Considerations

  • The boarding API uses OAuth2. Send a Bearer token on every request. See OAuth2 authentication.
  • An application boards a business that already has a paypoint. Create the business and its paypoint first.
  • You can update an application only while it’s in draft. After you submit it, Payabli’s review moves it from one status to the next. See Boarding application statuses for every status and what moves an application between them.
  • Application responses and lifecycle action responses include an allowedActions array. Check it for the action you want before you call a lifecycle endpoint. The array can also list actions that only Payabli performs.

Create an application

Send a POST request to /v2/requests with the businessReference of the business to board and a requestTemplate with the reference of your organization’s boarding template. Payabli assigns the application’s underwriting policy from the template, so a submitted application without one fails in review. Optionally, send a paypointReference to board a specific paypoint and an externalId from your own system. New applications start in draft. See the API reference for this endpoint for full documentation.

POST
/api/v2/requests
curl -X POST https://api-sandbox.payabli.com/api/v2/requests \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"businessReference": "019fed1a-3d6e-75d3-a81e-cba3874b0a55",
"externalId": "APP-2025-0417",
"tags": [
"priority"
]
}'

The response returns the new application’s reference, status, and allowed actions:

Response
{
"success": true,
"message": "Application created successfully",
"traceId": "0HNNNPRPLVN40:00000012",
"data": {
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"businessReference": "019fed1a-3d6e-75d3-a81e-cba3874b0a55",
"applicationStatus": "draft",
"applicationStatusCode": 1,
"allowedActions": [
"submit",
"withdraw",
"abandon"
],
"createdAt": "2026-07-01T15:00:01.734346",
"_links": {
"self": "/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"business": "/v2/businesses/019fed1a-3d6e-75d3-a81e-cba3874b0a55"
},
"paypointReference": "019ff064-c690-7679-a73e-688418aadc7c",
"paypointStatus": "pending",
"externalId": "APP-2025-0417",
"tags": [
"priority"
]
}
}

The requestsReference in the response is the reference you use to read and manage the application.

To request services, add a services object that lists the Pay In services under moneyIn and the Pay Out services under moneyOut. See the API reference for the accepted values.

POST
/api/v2/requests
curl -X POST https://api-sandbox.payabli.com/api/v2/requests \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"businessReference": "019fed1a-3d6e-75d3-a81e-cba3874b0a55",
"externalId": "APP-2025-0417",
"requestTemplate": "019ff129-d393-7761-9a31-e5afe85b4081",
"services": {
"moneyIn": [
"Ach",
"Card"
],
"moneyOut": [
"Ach",
"Check"
]
}
}'

The response returns the requested services on the application:

Response
{
"success": true,
"message": "Application created successfully",
"traceId": "0HNONVRI1TBCP:00000054",
"data": {
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"businessReference": "019fed1a-3d6e-75d3-a81e-cba3874b0a55",
"applicationStatus": "draft",
"applicationStatusCode": 1,
"allowedActions": [
"submit",
"withdraw",
"abandon"
],
"createdAt": "2026-07-01T15:00:01.734346Z",
"_links": {
"self": "/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"business": "/v2/businesses/019fed1a-3d6e-75d3-a81e-cba3874b0a55"
},
"paypointReference": "019ff064-c690-7679-a73e-688418aadc7c",
"paypointStatus": "pending",
"externalId": "APP-2025-0417",
"parent": "a8806f02-23b3-4f6d-bba3-42e1b94326ea",
"parentOrgName": "PropertyManager Pro",
"requestTemplate": "019ff129-d393-7761-9a31-e5afe85b4081",
"services": {
"moneyIn": [
"Ach",
"Card"
],
"moneyOut": [
"Ach",
"Check"
]
}
}
}

Get an application

Send a GET request to /v2/requests/{requestsReference}. See the API reference for this endpoint for full documentation.

GET
/api/v2/requests/:requestsReference
curl https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c \
-H "Authorization: Bearer <token>"

The response returns the application’s full detail, including its current status and allowed actions:

Response
{
"success": true,
"message": "Application retrieved successfully",
"traceId": "0HNNNPRPLVN3H:00000009",
"data": {
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"businessReference": "019fed1a-3d6e-75d3-a81e-cba3874b0a55",
"applicationStatus": "draft",
"applicationStatusCode": 1,
"allowedActions": [
"submit",
"withdraw",
"abandon"
],
"createdAt": "2026-07-01T15:00:01.734346",
"_links": {
"self": "/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"business": "/v2/businesses/019fed1a-3d6e-75d3-a81e-cba3874b0a55"
},
"paypointReference": "019ff064-c690-7679-a73e-688418aadc7c",
"paypointStatus": "pending",
"externalId": "APP-2025-0417",
"tags": [
"priority"
]
}
}

List applications

Send a GET request to /v2/requests. Page the results with the page and limit query parameters. Pages start at 1, and each page holds 20 applications unless you set limit. See the API reference for this endpoint for full documentation.

GET
/api/v2/requests
curl https://api-sandbox.payabli.com/api/v2/requests \
-H "Authorization: Bearer <token>"

The response returns a page of applications with pagination metadata:

Response
{
"success": true,
"message": "Applications retrieved successfully",
"traceId": "0HNNNPRPLVN3G:00000004",
"data": {
"data": [
{
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"businessReference": "019fed1a-3d6e-75d3-a81e-cba3874b0a55",
"applicationStatus": "draft",
"applicationStatusCode": 1,
"allowedActions": [
"submit",
"withdraw",
"abandon"
],
"createdAt": "2026-07-01T15:00:01.734346",
"_links": {
"self": "/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"business": "/v2/businesses/019fed1a-3d6e-75d3-a81e-cba3874b0a55"
},
"paypointName": "Rose Gardens",
"paypointLegalName": "Rose Gardens LLC",
"ein": "****8993",
"primaryOwnerName": "Marcus Delgado",
"primaryOwnerReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"externalId": "APP-2025-0417",
"parent": "a8806f02-23b3-4f6d-bba3-42e1b94326ea",
"parentOrgName": "PropertyManager Pro",
"tags": [
"priority"
]
}
],
"total": 1,
"page": 1,
"pageSize": 20
}
}

Update an application

Send a PATCH request to /v2/requests/{requestsReference} with only the fields you want to change. The application must be in draft. See the API reference for this endpoint for full documentation.

PATCH
/api/v2/requests/:requestsReference
curl -X PATCH https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"externalId": "APP-2025-0417-REV2",
"tags": [
"priority",
"expedited"
]
}'

The response returns the updated application:

Response
{
"success": true,
"message": "Application updated successfully",
"traceId": "0HNNNPRPLVN3H:00000011",
"data": {
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"businessReference": "019fed1a-3d6e-75d3-a81e-cba3874b0a55",
"applicationStatus": "draft",
"applicationStatusCode": 1,
"allowedActions": [
"submit",
"withdraw",
"abandon"
],
"createdAt": "2026-07-01T15:00:01.734346",
"_links": {
"self": "/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"business": "/v2/businesses/019fed1a-3d6e-75d3-a81e-cba3874b0a55"
},
"paypointReference": "019ff064-c690-7679-a73e-688418aadc7c",
"paypointStatus": "pending",
"externalId": "APP-2025-0417-REV2",
"tags": [
"priority",
"expedited"
]
}
}

To change the requested services, send the full services object. It replaces the current services, so include every service you want to keep. Leave services out of the request to keep the current services.

PATCH
/api/v2/requests/:requestsReference
curl -X PATCH https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"services": {
"moneyIn": [
"Ach"
],
"moneyOut": [
"Rtp"
]
}
}'

Validate an application

Before you submit, check that the business, its people, and its payment methods have everything the requested services need. Send a POST request to /v2/requests/{requestsReference}/validate. Validation doesn’t change the application. See the API reference for this endpoint for full documentation.

POST
/api/v2/requests/:requestsReference/validate
curl -X POST https://api-sandbox.payabli.com/api/v2/requests/4463979d-6336-4298-90cb-52d446030874/validate \
-H "Authorization: Bearer <token>"

When valid is true, the records have everything the requested services need. When valid is false, each section lists its missingFields. The field value is the path on the record to fix, such as business.taxReference:

Response
{
"success": true,
"message": "Validation completed",
"traceId": "0HNONVR8FHN0R:00000017",
"data": {
"valid": false,
"servicesEvaluated": [
"payInCard",
"payInAch"
],
"sections": {
"business": {
"complete": false,
"missingFields": [
{
"field": "business.description",
"label": "Business Description",
"reason": "required"
},
{
"field": "business.legalStructure",
"label": "Legal Structure",
"reason": "required"
},
{
"field": "business.establishedDate",
"label": "Established Date",
"reason": "required"
},
{
"field": "business.incorporationState",
"label": "Formation State",
"reason": "required"
},
{
"field": "business.merchantCatCode",
"label": "Industry (MCC)",
"reason": "required"
},
{
"field": "business.taxReference",
"label": "Tax ID (EIN/SSN)",
"reason": "required"
},
{
"field": "business.taxIdCountry",
"label": "Tax ID Country",
"reason": "required"
},
{
"field": "business.isForeignOwned",
"label": "Foreign Owned",
"reason": "required"
},
{
"field": "business.operatingSeasons",
"label": "Operating Seasons",
"reason": "required"
},
{
"field": "business.phone",
"label": "Business Phone",
"reason": "required"
},
{
"field": "business.emails",
"label": "Business Email",
"reason": "required"
},
{
"field": "business.addressDetails",
"label": "Business Address",
"reason": "required"
}
]
},
"salesAndPayments": {
"complete": false,
"missingFields": [
{
"field": "business.processingMetrics.monthlyReceivablesVolume",
"label": "Annual Payment Volume",
"reason": "required"
},
{
"field": "business.processingMetrics.largestReceivableSize",
"label": "Largest Transaction",
"reason": "required"
},
{
"field": "business.processingMetrics.environments",
"label": "Payment Environment",
"reason": "required"
},
{
"field": "business.processingMetrics.numberOfTransactions",
"label": "Monthly Payment Count",
"reason": "required"
}
]
},
"banking": {
"complete": false,
"missingFields": [
{
"field": "paymentMethods",
"label": "At least one payment method is required",
"reason": "required"
}
]
},
"people": {
"complete": false,
"missingFields": [
{
"field": "people",
"label": "At least one owner or officer is required",
"reason": "required"
}
]
}
}
}
}

Fix the record that holds the field, such as with a PATCH request to the business, then validate again.

What validation checks

Validation is stricter than the create endpoints, so a record can save without a field that validation still reports as missing. Request services on the application before you validate, because many requirements depend on them. If the application requests no services, validation checks the requirements for every service.

Validation reports any of these requirements that the records don’t meet, whether a field is missing or its value isn’t valid:

  • Business: legalStructure, description, taxReference, establishedDate, merchantCatCode, incorporationState, taxIdCountry, isForeignOwned, at least one address with a street line, and at least one item each in phone, emails, and operatingSeasons. Send isForeignOwned as true or false, even when the business isn’t foreign-owned. If processingMetrics.inboundOnlinePercent is more than 0, the business also needs a website. If isTaxExempt is true, it needs taxExemptClassification.
  • Pay In volumes: when the application requests Pay In services, processingMetrics.numberOfTransactions, the three receivables volumes, and the sales channel percentages. monthlyReceivablesVolume must be more than largestReceivableSize, which must be more than averageReceivableSize. At least one of inboundPresentPercent, inboundOnlinePercent, and inboundMotoPercent must be more than 0, and together they must add up to 100. When the application requests Card, or when advancedDelivery is true, the business also needs advancedDeliveryDays. When advancedDelivery is true, it also needs percentAdvancedDelivery.
  • Pay Out volumes: when the application requests Pay Out services, payoutMetrics.numberOfTransactions, monthlyPayablesVolume, and largestPayablesSize. monthlyPayablesVolume must be more than largestPayablesSize.
  • People: every person needs a phone number and an email. Every person except an Employee also needs title, dateOfBirth, nationality, and an address. People with US nationality need ssn. Everyone else needs nationalIdNumber instead.
  • Ownership: at least one person marked isPrimaryController, exactly one owner marked isSigner, and total ownership of 100% or less. Unless the legal structure is government or non-profit, every owner needs ownershipPercentage, and at least one owner must have 25% or more.
  • Payment methods: when the application requests any service, at least one payment method, with exactly one marked as the default. Each bank account needs nickname, financialInstitution, and at least one usage value. Between them, the accounts need deposits and either billing or refunds. Card services allow at most one deposits account. Check payouts need an account with payOutFunding or returns.
  • Documents: every required document in the application’s document requirements, with at least one file uploaded. A business with an annualRevenue of $1,000,000 or more needs bank statements.

Upload documents

An application can ask for documents, such as bank statements or a signed W-9. The requirements come from the application’s template and from Payabli business rules. For example, a business with an annualRevenue of $1,000,000 or more needs bank statements. Upload the documents through the API before you submit, or when underwriting requests them.

List the requirements

Send a GET request to /v2/requests/{requestsReference}/documents/requirements. See the API reference for this endpoint for full documentation.

GET
/api/v2/requests/:requestsReference/documents/requirements
curl https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/documents/requirements \
-H "Authorization: Bearer <token>"

Each requirement gives the fieldPath and subjectTypes to upload with, the allowedFormats, the maxUploads it takes, and its uploadedCount. A person requirement appears once for each owner of the business, with that owner’s personReference. When required is true, validation reports the requirement as missing until a document is uploaded:

Response
{
"success": true,
"message": "Document requirements retrieved successfully",
"traceId": "0HNPA8416RDFS:0000000E",
"data": [
{
"fieldPath": "documents.businessLicense",
"label": "Business License",
"source": "template",
"subjectTypes": [
"paypoint",
"business"
],
"required": false,
"maxUploads": 1,
"allowedFormats": [
"pdf",
"png",
"jpg"
],
"uploadedCount": 0,
"hint": "Current business operating license"
},
{
"fieldPath": "person.documents.w9",
"label": "W-9 Form",
"source": "template",
"subjectTypes": [
"person"
],
"required": true,
"maxUploads": 1,
"allowedFormats": [
"pdf"
],
"uploadedCount": 0,
"hint": "Signed W-9 tax form",
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d"
}
]
}

Upload a document

Send a POST request to /v2/requests/{requestsReference}/documents as multipart form data, with one file and these fields:

  • fieldPath: the requirement’s fieldPath.
  • subject: one of the requirement’s subjectTypes: business, paypoint, or person.
  • personReference: for a person requirement, the personReference from the requirement.

The file can be up to 10 MB, in one of the requirement’s allowedFormats. Payabli checks the file’s content, not only its name. See the API reference for this endpoint for full documentation.

POST
/api/v2/requests/:requestsReference/documents
curl -X POST https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/documents \
-H "Authorization: Bearer <token>" \
-H "Content-Type: multipart/form-data" \
-F fieldPath="person.documents.w9" \
-F file=@<file1> \
-F personReference="01a0014d-ce1a-7110-9bac-c4c59647a88d" \
-F subject="person"

The response returns the document, with the documentReference you use to delete it:

Response
{
"success": true,
"message": "Document uploaded successfully",
"traceId": "0HNPA847I3963:0000002B",
"data": {
"documentReference": "019ff1d7-6e14-7c8b-a2f5-91d3b7e04c62",
"kind": "applicantUpload",
"subjectType": "person",
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"fieldPath": "person.documents.w9",
"fileName": "w9-marcus-delgado.pdf",
"mimeType": "application/pdf",
"fileSizeBytes": 96270,
"uploadedAt": "2026-10-16T13:34:51.3779Z"
}
}

If the upload doesn’t fit a requirement, the request fails with 400 and the error VALIDATION_ERROR, and the message says why. For example, fieldPath and personReference don’t match a requirement, the file is empty, too large, or in a format the requirement doesn’t accept, or the requirement already has maxUploads documents. Uploading doesn’t change the application’s status.

List and delete documents

To see what’s uploaded, send a GET request to /v2/requests/{requestsReference}/documents. See the API reference for this endpoint for full documentation.

Response
{
"success": true,
"message": "Documents retrieved successfully",
"traceId": "0HNPA8416RDEU:00000001",
"data": [
{
"documentReference": "019ff1d7-5c2e-7a41-9b3d-2f6e8c1a4d90",
"kind": "applicantUpload",
"subjectType": "business",
"personReference": null,
"fieldPath": "documents.bankStatement",
"fileName": "bank-statement-september.pdf",
"mimeType": "application/pdf",
"fileSizeBytes": 482113,
"uploadedAt": "2026-10-16T13:20:22.876789Z"
},
{
"documentReference": "019ff1d7-6e14-7c8b-a2f5-91d3b7e04c62",
"kind": "applicantUpload",
"subjectType": "person",
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"fieldPath": "person.documents.w9",
"fileName": "w9-marcus-delgado.pdf",
"mimeType": "application/pdf",
"fileSizeBytes": 96270,
"uploadedAt": "2026-10-16T13:34:51.3779Z"
}
]
}

To remove a document, such as to replace it, send a DELETE request to /v2/requests/{requestsReference}/documents/{documentReference}. A deleted document no longer counts toward its requirement’s maxUploads. See the API reference for this endpoint for full documentation.

DELETE
/api/v2/requests/:requestsReference/documents/:documentReference
curl -X DELETE https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/documents/019ff1d7-6e14-7c8b-a2f5-91d3b7e04c62 \
-H "Authorization: Bearer <token>"

Submit an application

When the business, its people, payment methods, and services are in place, send a POST request to /v2/requests/{requestsReference}/submit. The application must be in draft and have a signer. The signer is the owner flagged with isSigner on their business link. To choose the signer on this call instead, send their personReference in signer. Payabli records the signer’s identity from their person record and business link, so update those with the people endpoints before you submit. Include a signer with the signature details. To record the IP address of the signer’s device as your system saw it, include reportedSignerIp in signer. Payabli stores it separately from the IP address it observes on the request. See the API reference for this endpoint for every signature option, including drawn signatures and signatures from your own e-sign tool.

POST
/api/v2/requests/:requestsReference/submit
curl -X POST https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/submit \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"signer": {
"personReference": "01a0014d-ce1a-7110-9bac-c4c59647a88d",
"signature": "Marcus J Delgado",
"signatureType": "type",
"acceptance": true,
"pciAttestation": true,
"reportedSignerIp": "203.0.113.7"
}
}'

The response returns the application’s new status and allowed actions:

Response
{
"success": true,
"message": "Application submitted",
"traceId": "0HNONVRI1SMEU:0000068E",
"data": {
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"applicationStatus": "submitted",
"allowedActions": [
"startVerification",
"withdraw",
"abandon",
"markError"
]
}
}

If the application has no signer, the request fails with 422 and the error SIGNER_REQUIRED. Set isSigner on one of the business’s owners, or send signer.personReference, then submit again. If signer.personReference names a person who isn’t an owner, the request fails with 422 and the error SIGNER_NOT_OWNER.

Submit doesn’t check every rule that validation reports, such as the primary controller and ownership rules. Validate the application and resolve its missing fields before you submit.

After you submit the application, verification starts automatically. The application then either approves automatically or goes to underwriting for review. If processing fails, the application moves to error, and Payabli can recover it to the status it had before the error.

Respond to underwriting requests

During review, underwriting can request documents or ask a question. The application waits in pendingdocuments or pendingresponse until you mark the request as answered, and then returns to review. Neither endpoint takes a request body. When underwriting requests documents, upload them first, then mark them as provided.

When the application is in pendingdocuments, mark the documents as provided with a POST request to /v2/requests/{requestsReference}/provide-documents. See the API reference for this endpoint for full documentation.

POST
/api/v2/requests/:requestsReference/provide-documents
curl -X POST https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/provide-documents \
-H "Authorization: Bearer <token>"

When the application is in pendingresponse, mark the information as provided with a POST request to /v2/requests/{requestsReference}/provide-response. See the API reference for this endpoint for full documentation.

POST
/api/v2/requests/:requestsReference/provide-response
curl -X POST https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/provide-response \
-H "Authorization: Bearer <token>"

Both endpoints return the application to pendingreview:

Response
{
"success": true,
"message": "Information provided",
"traceId": "0HNONVR8FH0HG:000000A7",
"data": {
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"applicationStatus": "pendingreview",
"allowedActions": [
"approve",
"deny",
"escalate",
"requestDocuments",
"requestResponse",
"markError"
]
}
}

Withdraw an application

Send a POST request to /v2/requests/{requestsReference}/withdraw, with an optional reason that’s recorded in the status history. You can withdraw an application in draft, submitted, pendingdocuments, or pendingresponse. You can’t reopen a withdrawn application. See the API reference for this endpoint for full documentation.

POST
/api/v2/requests/:requestsReference/withdraw
curl -X POST https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/withdraw \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"reason": "Duplicate application"
}'

The response returns the application’s new status. A withdrawn application has no allowed actions:

Response
{
"success": true,
"message": "Application withdrawn",
"traceId": "0HNNNPRPLVN4C:0000001B",
"data": {
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"applicationStatus": "withdrawn",
"allowedActions": []
}
}

Track status changes

To see how an application reached its current status, send a GET request to /v2/requests/{requestsReference}/history. See the API reference for this endpoint for full documentation.

GET
/api/v2/requests/:requestsReference/history
curl https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/history \
-H "Authorization: Bearer <token>"

The response lists every transition, oldest first, with what triggered each change and any reason recorded with it:

Response
{
"success": true,
"message": "Application status history",
"traceId": "0HNNNPRPLVN4C:0000001C",
"data": {
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"history": [
{
"fromStatus": "none",
"toStatus": "draft",
"trigger": "Create",
"actor": "0",
"reason": null,
"metadata": null,
"createdAt": "2026-07-01T15:00:01.734346"
},
{
"fromStatus": "draft",
"toStatus": "withdrawn",
"trigger": "Withdraw",
"actor": "0",
"reason": "Duplicate application",
"metadata": null,
"createdAt": "2026-07-01T15:12:44.132073"
}
]
}
}

History records changes only. An approved application that fails enablement the same way on every attempt doesn’t add new entries, so check enablement to follow it.

Check enablement after approval

After an application is approved, Payabli sets up each requested service with its processor. This is called enablement. The application stays approved or autoapproved while enablement runs, and it moves to activated after every service is set up. To see why an approved merchant isn’t live yet, send a GET request to /v2/requests/{requestsReference}/enablement. Enablement doesn’t send webhooks, so poll this endpoint to follow it. See the API reference for this endpoint for full documentation.

GET
/api/v2/requests/:requestsReference/enablement
curl https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/enablement \
-H "Authorization: Bearer <token>"

The response shows the overall state, the state of each service, and blockedOn, which says why enablement isn’t moving. In this example, Payabli is waiting on a processor and retries automatically:

Response
{
"success": true,
"message": "Application boarding status",
"traceId": "0HNP4OL9M4GDO:00000001",
"data": {
"requestsReference": "3f3caa7b-bdfe-4bf1-814b-30d54859247c",
"state": "Submitted",
"services": [
{
"service": "Card",
"rail": "MoneyIn",
"state": "Submitted",
"message": null,
"missingFields": null
}
],
"blockedOn": "processor",
"message": "Boarding is waiting on a processor for at least one service and is retried automatically. The service list says which. It has been attempted 63 times so far.",
"attempts": 63,
"firstAttemptAt": "2026-10-12T18:41:18.945616+00:00",
"lastAttemptAt": "2026-10-12T19:43:10.983059+00:00"
}
}

When blockedOn is merchant_data, the merchant’s data needs a correction before enablement can continue. Each service’s missingFields lists the fields the processor refused or reported as missing, and its message explains what’s needed.

See these related resources to help you get the most out of Payabli.