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

# Submit applicant

> Submit an applicant for a final decision after its modules have run.

Submits an applicant and triggers the risk engine to produce a final decision based on the widget's configured thresholds. Returns the full applicant object with its updated `status`, `riskScore`, and decision timestamps.

Requires `Authorization: Bearer $TOKEN`. Rate limited to 10 requests per minute.

## Path parameters

<ParamField path="applicantId" type="string" required>
  The applicant ID to submit.
</ParamField>

## Body

<ParamField body="notes" type="string">
  Optional reviewer notes. Up to 2000 characters.
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://api.vouchmark.com/v1/kyb/applicants/app_aBcD.../submit \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "notes": "Manual review completed, documents verified."
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json theme={null}
  {
    "success": true,
    "data": {
      "id": "app_aBcD...",
      "widgetId": "wgt_aBcD...",
      "environment": "live",
      "status": "approved",
      "subject": {
        "businessName": "Acme Trading Ltd",
        "registrationNumber": "RC123456",
        "tin": "12345678-0001",
        "email": "admin@acme.com",
        "phone": "+2348012345678",
        "jurisdiction": "NG",
        "industry": "fintech"
      },
      "referenceId": "your_ref_123",
      "riskScore": 92,
      "decisionReason": null,
      "moduleOrder": ["business_profile", "cac_verification", "tin_verification"],
      "totalSpentKobo": 200000,
      "startedAt": "2026-06-01T10:00:00Z",
      "submittedAt": "2026-06-01T10:25:00Z",
      "decidedAt": "2026-06-01T10:25:30Z",
      "createdAt": "2026-06-01T10:00:00Z",
      "updatedAt": "2026-06-01T10:25:30Z"
    }
  }
  ```
</ResponseExample>

The decision follows the widget's risk configuration:

* Score ≥ `autoApproveThreshold` → `approved`
* Score ≤ `autoRejectThreshold` → `rejected`
* Between thresholds, or a flagged condition (PEP, sanctions, adverse media) → `requires_review`
