---
title: "Check feature eligibility"
description: "Check if a customer is eligible for a specific feature and get the list of requirements"
protocol: rest
method: POST
endpoint: "/v1/risk/features/eligibility"
baseUrl: "https://api.gravv.xyz"
group: "Features"
auth:
  label: "Api-Key"
  name: "Api-Key"
  in: header
---

# Check feature eligibility

<Endpoint method="POST" path="/v1/risk/features/eligibility" />

Check if a customer is eligible for a specific feature and get the list of requirements

## Headers

<ParamField name="Idempotency-Key" header="Idempotency-Key" type="string" required>
  Required for POST requests. Reuse only for an identical retry.
</ParamField>

## Request Body

<ParamField name="feature_id" body="feature_id" type="string" required>
  The unique identifier of the feature to check eligibility for

  Possible values: `crypto_wallet`, `virtual_cards`, `eur_account`, `usd_account`, `gbp_account`, `international_transfers`
</ParamField>

<ParamField name="customer_id" body="customer_id" type="string" required>
  The customer ID to check eligibility for
</ParamField>

## Responses

| Status | Description |
| --- | --- |
| `200` | Feature eligibility check successful |
| `400` | Bad request - Invalid parameters |
| `401` | Unauthorized - Missing Authorization Token or API Key |
| `404` | Feature not found |

### 200 response

<ResponseField name="data" type="object">

  <Expandable title="properties">
    <ResponseField name="customer_id" type="string" required>
      The unique identifier of the customer
    </ResponseField>

    <ResponseField name="eligible" type="boolean" required>
      Whether the customer is eligible for the feature
    </ResponseField>

    <ResponseField name="feature_id" type="string" required>
      The unique identifier of the feature
    </ResponseField>

    <ResponseField name="requirements_fulfilled" type="object[]" required>
      Date and time the requirements are met

      <Expandable title="properties">
        <ResponseField name="fulfilled_at" type="string">
        </ResponseField>

        <ResponseField name="type" type="string">

          Possible values: `kyc_status`, `provider_data`, `document`
        </ResponseField>

        <ResponseField name="value" type="string">
        </ResponseField>

      </Expandable>
    </ResponseField>

    <ResponseField name="requirements_pending" type="object[]" required>
      List of requirements that haven’t been met

      <Expandable title="properties">
        <ResponseField name="action" type="oneOf">
          Describes how to fulfill the requirement. The shape depends on `type`: - **provider_data** — `{ type: "provider_data", data_key: string, field_type: string, description: string }`. `field_type` is the expected value type (e.g. `"string"`, `"number"`). - **kyc_status** — `{ type: "kyc_verification", url: string, method: "POST", description: string }`. `url` is the endpoint to call to initiate KYC (e.g. `/v1/risk/start-kyc`). - **document** — `{ type: "document", url: string, method: "POST", doc_type: string, description: string }`. `url` is the document upload endpoint.

          One of the following variants:

          <Expandable title="provider_data action">
            <ResponseField name="type" type="string">

              Possible values: `provider_data`
            </ResponseField>

            <ResponseField name="data_key" type="string">
              Key name of the field to supply in `provider_data`
            </ResponseField>

            <ResponseField name="field_type" type="string">
              Expected value type for the field
            </ResponseField>

            <ResponseField name="description" type="string">
            </ResponseField>

          </Expandable>

          <Expandable title="kyc_verification action">
            <ResponseField name="type" type="string">

              Possible values: `kyc_verification`
            </ResponseField>

            <ResponseField name="url" type="string">
              Endpoint to call to initiate KYC verification
            </ResponseField>

            <ResponseField name="method" type="string">
            </ResponseField>

            <ResponseField name="description" type="string">
            </ResponseField>

          </Expandable>

          <Expandable title="document action">
            <ResponseField name="type" type="string">

              Possible values: `document`
            </ResponseField>

            <ResponseField name="url" type="string">
              Document upload endpoint
            </ResponseField>

            <ResponseField name="method" type="string">
            </ResponseField>

            <ResponseField name="doc_type" type="string">
            </ResponseField>

            <ResponseField name="description" type="string">
            </ResponseField>

          </Expandable>
        </ResponseField>

        <ResponseField name="required" type="string">
        </ResponseField>

        <ResponseField name="type" type="string">

          Possible values: `kyc_status`, `provider_data`, `document`
        </ResponseField>

      </Expandable>
    </ResponseField>

  </Expandable>
</ResponseField>

<ResponseField name="error" type="string">
</ResponseField>

<ResponseExample>

```json title="eligible"
{
  "data": {
    "customer_id": "5793f1ea-91f0-4892-9705-d37e0592dd3a",
    "eligible": true,
    "feature_id": "virtual_cards",
    "requirements_fulfilled": [
      {
        "type": "kyc_status",
        "value": "completed",
        "fulfilled_at": "2025-12-16T10:52:29Z"
      },
      {
        "type": "provider_data",
        "value": "annual_remuneration",
        "fulfilled_at": "2025-12-16T10:52:29Z"
      },
      {
        "type": "provider_data",
        "value": "estimated_monthly_limit",
        "fulfilled_at": "2025-12-16T10:52:29Z"
      },
      {
        "type": "provider_data",
        "value": "ip_address",
        "fulfilled_at": "2025-12-16T10:52:29Z"
      }
    ],
    "requirements_pending": []
  },
  "error": null
}
```

```json title="not_eligible"
{
  "data": {
    "customer_id": "5793f1ea-91f0-4892-9705-d37e0592dd3a",
    "eligible": false,
    "feature_id": "virtual_cards",
    "requirements_fulfilled": [
      {
        "type": "kyc_status",
        "value": "completed",
        "fulfilled_at": "2025-12-16T10:52:29Z"
      }
    ],
    "requirements_pending": [
      {
        "type": "provider_data",
        "required": "annual_remuneration",
        "action": {
          "type": "provider_data",
          "data_key": "annual_remuneration"
        }
      },
      {
        "type": "provider_data",
        "required": "estimated_monthly_limit",
        "action": {
          "type": "provider_data",
          "data_key": "estimated_monthly_limit"
        }
      },
      {
        "type": "provider_data",
        "required": "ip_address",
        "action": {
          "type": "provider_data",
          "data_key": "ip_address"
        }
      }
    ]
  },
  "error": null
}
```

</ResponseExample>

### 400 response

<ResponseField name="data" type="any" required>
  Always null for error responses
</ResponseField>

<ResponseField name="error" type="string" required>
  Human-readable error message
</ResponseField>

<ResponseExample>

```json title="Response"
{
  "data": null,
  "error": "feature_id is required"
}
```

</ResponseExample>

### 401 response

<ResponseField name="data" type="any" required>
  Always null for error responses
</ResponseField>

<ResponseField name="error" type="string" required>
  Human-readable error message
</ResponseField>

<ResponseExample>

```json title="Response"
{
  "data": null,
  "error": "Invalid or missing Api-Key header. Api-Key is required!"
}
```

</ResponseExample>

### 404 response

<ResponseField name="data" type="any" required>
  Always null for error responses
</ResponseField>

<ResponseField name="error" type="string" required>
  Human-readable error message
</ResponseField>

<ResponseExample>

```json title="Response"
{
  "data": null,
  "error": "Feature not found"
}
```

</ResponseExample>

## Authorization

- **ApiKeyAuth**
