> This is Payabli documentation. For a complete page index, fetch https://docs.payabli.com/llms.txt — append .md to any page URL for lightweight markdown. For section-level indexes, query parameters, and other AI-optimized access methods, see https://docs.payabli.com/ai-agents.md

# Validate an application

POST https://api-sandbox.payabli.com/api/v2/requests/{requestsReference}/validate

Checks whether the records linked to an application (the business, its people, and its payment methods) include everything the application's requested services need. The response lists any missing or invalid fields by section. Validation doesn't change the application, and it doesn't return a validation token. The request has no body.

One owner on the application must be the signer, flagged with `isSigner` on their business link. If no one is flagged, the `people` section returns a `missingFields` entry with `field` set to `people.isSigner`, `label` set to `Signer`, and `reason` set to `required — choose the person who signs the application`. The signer rule isn't reported when the application has no people.

The `people` section also checks ownership. At least one person must be the primary controller, flagged with `isPrimaryController`. If no one is, the entry has `field` set to `people.isPrimaryController`, `label` set to `Primary Controller`, and `reason` set to `required — at least one principal must be designated`. Unless the business's `legalStructure` is `government` or `non-profit`, at least one owner must have an `ownershipPercentage` of 25 or more. If no one does, the entry has `field` set to `people.ownershipPercentage`, `label` set to `Qualifying Owner`, and `reason` set to `at least one principal must have an ownership stake of 25% or more`.

Validation also reports required documents that have nothing uploaded. See [List application document requirements](/developers/api-reference/applications/list-application-document-requirements). The bank statement requirement appears in the `business` section, with `field` set to `documents.bankStatement`. A person document appears in the `people` section, with `field` set to `people.{personReference}.` followed by the requirement's `fieldPath`, such as `people.01a0014d-ce1a-7110-9bac-c4c59647a88d.person.documents.w9`. Submit doesn't enforce document requirements.

Reference: https://docs.payabli.com/developers/api-reference/applications/validate-an-application

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Servers

- `https://api-sandbox.payabli.com/api` (Sandbox, default)
- `https://api.payabli.com/api` (Production)

## Request

### Path parameters

- `requestsReference` (string, required) — The application reference.

## Response

### 200

The validation result.

- `success` (boolean, required) — Whether the request succeeded.
- `message` (string, required, nullable) — A human-readable result message.
- `traceId` (string, required, nullable) — The trace identifier for the request, useful for support.
- `data` (ValidationResult, required, nullable) — The validation result.

## Errors

### 401 Unauthorized Error

Unauthorized request.

- `isSuccess` (boolean, required) — Always `false` for error responses.
- `responseText` (string, required) — Error text describing what went wrong.
- `responseCode` (integer, optional) — Code for the response. Learn more in [API Response Codes](/developers/api-reference/api-responses).
- `responseData` (PayabliErrorBodyResponseData, optional) — Object with detailed error context.

### 404 Not Found Error

The requested resource wasn't found.

- `isSuccess` (boolean, required) — Always `false` for error responses.
- `responseText` (string, required) — Error text describing what went wrong.
- `responseCode` (integer, optional) — Code for the response. Learn more in [API Response Codes](/developers/api-reference/api-responses).
- `responseData` (PayabliErrorBodyResponseData, optional) — Object with detailed error context.

### 500 Internal Server Error

Internal server error.

- `isSuccess` (boolean, required) — Always `false` for error responses.
- `responseText` (string, required) — Error text describing what went wrong.
- `responseCode` (integer, optional) — Code for the response. Learn more in [API Response Codes](/developers/api-reference/api-responses).
- `responseData` (PayabliErrorBodyResponseData, optional) — Object with detailed error context.

## Types

### ValidationResult

Whether the application's stored records meet the requirements for the services it requests.

- `valid` (boolean, required) — Whether nothing is missing or invalid in any section.
- `servicesEvaluated` (list of string, required) — The requirement groups that validation checked, named with Payabli's internal service names (for example, `payInCard` for the `Card` Pay In service).
- `sections` (ValidationSections, required) — The validation result for each section of the application.

### PayabliErrorBodyResponseData

Object with detailed error context.

- `explanation` (string, optional) — Human-readable explanation of what happened.
- `todoAction` (string, optional) — Suggested resolution.

### ValidationSections

The validation result for each section of the application.

- `business` (ValidationSection, required) — The business's details.
- `salesAndPayments` (ValidationSection, required) — The business's processing details, such as volumes and transaction sizes.
- `banking` (ValidationSection, required) — The business's payment methods.
- `people` (ValidationSection, required) — The business's owners and officers.

### ValidationSection

The validation result for one section of the application.

- `complete` (boolean, required) — Whether the section has no missing or invalid fields.
- `missingFields` (list of ValidationMissingField, required) — The fields that are missing or invalid in this section. Empty when the section is complete.

### ValidationMissingField

A field that's missing or invalid for the requested services.

- `field` (string, required) — The field's path on the entity record to fix, such as `business.taxReference` or `business.processingMetrics.numberOfTransactions`.
- `label` (string, required) — A human-readable name for the field.
- `reason` (string, required) — A short code for why the field failed, such as `required`.

## Examples

### ValidateNewApplication

**Response**

```json
{
  "success": true,
  "message": "Validation completed",
  "traceId": "0HNP4OM1AUIEG:00000008",
  "data": {
    "valid": true,
    "servicesEvaluated": [
      "payInCard",
      "payInAch",
      "payOutAch",
      "payOutCheck"
    ],
    "sections": {
      "business": {
        "complete": true,
        "missingFields": []
      },
      "salesAndPayments": {
        "complete": true,
        "missingFields": []
      },
      "banking": {
        "complete": true,
        "missingFields": []
      },
      "people": {
        "complete": true,
        "missingFields": []
      }
    }
  }
}
```

**SDK Code**

```python ValidateNewApplication
import requests

url = "https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript ValidateNewApplication
const url = 'https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go ValidateNewApplication
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby ValidateNewApplication
require 'uri'
require 'net/http'

url = URI("https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java ValidateNewApplication
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php ValidateNewApplication
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp ValidateNewApplication
using RestSharp;

var client = new RestClient("https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift ValidateNewApplication
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### ValidateNewLocationApplication

**Response**

```json
{
  "success": true,
  "message": "Validation completed",
  "traceId": "0HNP8M4GTH3J0:00000015",
  "data": {
    "valid": true,
    "servicesEvaluated": [
      "payInCard"
    ],
    "sections": {
      "business": {
        "complete": true,
        "missingFields": []
      },
      "salesAndPayments": {
        "complete": true,
        "missingFields": []
      },
      "banking": {
        "complete": true,
        "missingFields": []
      },
      "people": {
        "complete": true,
        "missingFields": []
      }
    }
  }
}
```

**SDK Code**

```python ValidateNewLocationApplication
import requests

url = "https://api-sandbox.payabli.com/api/v2/requests/b7e2c915-4f0a-4d6b-a3c8-91e5d2f7c406/validate"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript ValidateNewLocationApplication
const url = 'https://api-sandbox.payabli.com/api/v2/requests/b7e2c915-4f0a-4d6b-a3c8-91e5d2f7c406/validate';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go ValidateNewLocationApplication
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api-sandbox.payabli.com/api/v2/requests/b7e2c915-4f0a-4d6b-a3c8-91e5d2f7c406/validate"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby ValidateNewLocationApplication
require 'uri'
require 'net/http'

url = URI("https://api-sandbox.payabli.com/api/v2/requests/b7e2c915-4f0a-4d6b-a3c8-91e5d2f7c406/validate")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java ValidateNewLocationApplication
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api-sandbox.payabli.com/api/v2/requests/b7e2c915-4f0a-4d6b-a3c8-91e5d2f7c406/validate")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php ValidateNewLocationApplication
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api-sandbox.payabli.com/api/v2/requests/b7e2c915-4f0a-4d6b-a3c8-91e5d2f7c406/validate', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp ValidateNewLocationApplication
using RestSharp;

var client = new RestClient("https://api-sandbox.payabli.com/api/v2/requests/b7e2c915-4f0a-4d6b-a3c8-91e5d2f7c406/validate");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift ValidateNewLocationApplication
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api-sandbox.payabli.com/api/v2/requests/b7e2c915-4f0a-4d6b-a3c8-91e5d2f7c406/validate")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### ValidateApplication

**Response**

```json
{
  "success": true,
  "message": "Validation completed",
  "traceId": "0HNONVRI1TD2T:00000012",
  "data": {
    "valid": true,
    "servicesEvaluated": [
      "payOutAch",
      "payOutCheck"
    ],
    "sections": {
      "business": {
        "complete": true,
        "missingFields": []
      },
      "salesAndPayments": {
        "complete": true,
        "missingFields": []
      },
      "banking": {
        "complete": true,
        "missingFields": []
      },
      "people": {
        "complete": true,
        "missingFields": []
      }
    }
  }
}
```

**SDK Code**

```python ValidateApplication
import requests

url = "https://api-sandbox.payabli.com/api/v2/requests/4463979d-6336-4298-90cb-52d446030874/validate"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript ValidateApplication
const url = 'https://api-sandbox.payabli.com/api/v2/requests/4463979d-6336-4298-90cb-52d446030874/validate';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go ValidateApplication
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api-sandbox.payabli.com/api/v2/requests/4463979d-6336-4298-90cb-52d446030874/validate"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby ValidateApplication
require 'uri'
require 'net/http'

url = URI("https://api-sandbox.payabli.com/api/v2/requests/4463979d-6336-4298-90cb-52d446030874/validate")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java ValidateApplication
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api-sandbox.payabli.com/api/v2/requests/4463979d-6336-4298-90cb-52d446030874/validate")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php ValidateApplication
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api-sandbox.payabli.com/api/v2/requests/4463979d-6336-4298-90cb-52d446030874/validate', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp ValidateApplication
using RestSharp;

var client = new RestClient("https://api-sandbox.payabli.com/api/v2/requests/4463979d-6336-4298-90cb-52d446030874/validate");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift ValidateApplication
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api-sandbox.payabli.com/api/v2/requests/4463979d-6336-4298-90cb-52d446030874/validate")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### ValidateApplicationMissingFields

**Response**

```json
{
  "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"
          }
        ]
      }
    }
  }
}
```

**SDK Code**

```python ValidateApplicationMissingFields
import requests

url = "https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript ValidateApplicationMissingFields
const url = 'https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go ValidateApplicationMissingFields
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby ValidateApplicationMissingFields
require 'uri'
require 'net/http'

url = URI("https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java ValidateApplicationMissingFields
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php ValidateApplicationMissingFields
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp ValidateApplicationMissingFields
using RestSharp;

var client = new RestClient("https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift ValidateApplicationMissingFields
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api-sandbox.payabli.com/api/v2/requests/3f3caa7b-bdfe-4bf1-814b-30d54859247c/validate")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```