> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tracklysms.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Validate Business Profile

> Dry-run: check business-profile fields for field-level errors without saving.

Validates business-profile fields and returns field-level errors **without creating or changing anything**. Use it to drive an inline correction UI before you [create](/api-reference/v2/business-profiles/create-profile) or [update](/api-reference/v2/business-profiles/update-profile) a profile. Works with any key (including sandbox).

Checks performed: country allowlist, tax-id format for the country, state-code coercion, and the US TIN-match legal-name length cap.

## Body Parameters

Accepts the same fields as [create](/api-reference/v2/business-profiles/create-profile#body-parameters); all are optional here — only the fields you send are validated.

## Response Fields

<ResponseField name="valid" type="boolean">
  `true` when no field errors were found.
</ResponseField>

<ResponseField name="errors" type="array">
  Field-level errors. Each has `field` (the offending camelCase field), `code`, and a human `message`.
</ResponseField>

<ResponseField name="readyForVerification" type="boolean">
  `true` when the payload is valid **and** carries every field KYB needs (`name`, `companyLegalName`, `taxId`, `addressCountry`, `businessContactFirstName`, `businessContactLastName`).
</ResponseField>

## Examples

<RequestExample>
  <CodeGroup>
    ```bash cURL theme={null}
    curl -X POST "https://api.tracklysms.com/api/v2/business-profiles/validate" \
      -H "X-Api-Key: trk_your_api_key_here" \
      -H "Content-Type: application/json" \
      -d '{ "name": "Acme", "addressCountry": "US", "taxId": "not-an-ein" }'
    ```

    ```python Python theme={null}
    import requests

    resp = requests.post(
        "https://api.tracklysms.com/api/v2/business-profiles/validate",
        headers={"X-Api-Key": "trk_your_api_key_here"},
        json={"name": "Acme", "addressCountry": "US", "taxId": "not-an-ein"},
    )
    print(resp.json()["errors"])
    ```
  </CodeGroup>
</RequestExample>

<ResponseExample>
  ```json 200 — Invalid theme={null}
  {
    "valid": false,
    "errors": [
      { "field": "taxId", "code": "compliance_tax_id_format", "message": "taxId format is invalid for US" }
    ],
    "readyForVerification": false
  }
  ```

  ```json 200 — Ready theme={null}
  {
    "valid": true,
    "errors": [],
    "readyForVerification": true
  }
  ```
</ResponseExample>

## Error Codes

Field errors are returned inline in `errors` (HTTP 200), not as HTTP error statuses. Common `code` values:

| Code                             | Field              | Meaning                                   |
| -------------------------------- | ------------------ | ----------------------------------------- |
| `address_country_invalid`        | `addressCountry`   | Not a recognized / supported country.     |
| `compliance_tax_id_format`       | `taxId`            | Tax-id format is wrong for the country.   |
| `address_state_invalid`          | `addressState`     | Not a valid state/region for the country. |
| `compliance_legal_name_too_long` | `companyLegalName` | Exceeds the 40-char US TIN-match cap.     |

## Next Steps

<CardGroup cols={2}>
  <Card title="Create the profile" icon="plus" href="/api-reference/v2/business-profiles/create-profile">
    Once validation is clean.
  </Card>

  <Card title="Lifecycle overview" icon="arrows-rotate" href="/api-reference/v2/business-profiles/lifecycle">
    How verification proceeds.
  </Card>
</CardGroup>
