Create a card application

Cards don't work the way accounts do. With an account you can create the account directly. With a card you can't: every card needs an approved card application behind it first. The application is where Gravv runs the customer's risk and compliance checks before any card is issued.

📘

Do I create the card directly, or apply first?

You apply first. There's no direct "create card" shortcut like there is for accounts. In production you don't call the card application endpoint yourself either. You activate the card feature, and that creates the application for you. Once the application is approved, you call Create a card.

How an application gets created

There are two ways to create a card application, and which one you use depends on the environment:

EnvironmentHow to create the application
LiveActivate the card feature with Activate feature. Activating virtual_cards creates the application.
SandboxActivating the feature works here too, and is the recommended path. A standalone Create card application endpoint also exists for testing. It is not supported in Live, so build your integration around feature activation.

Activating the feature is the one path that works in both environments, so use it everywhere.

Before you start

The customer must already exist and have completed intermediate KYC. Intermediate KYC includes a selfie (liveness) check, which the card application depends on.

Then confirm the customer is ready with Check feature eligibility for virtual_cards. Eligibility returns eligible: true only when KYC is completed and you supply the required provider data shown below.

Step 1: Activate the card feature

Call Activate feature with feature_id set to virtual_cards. For cards, the provider_data object is required:

FieldTypeRequiredDescription
annual_remunerationnumberyesCustomer's expected annual inflow in USD
estimated_monthly_limitnumberyesExpected monthly card spend in USD. Must be lower than annual_remuneration
ip_addressstringyesIP address the request comes from
account_idstringnoThe card account that backs the card. Gravv derives it from your tenant's card account if you leave it out
curl --request POST \
     --url https://api.gravv.xyz/v1/risk/features/activate \
     --header 'Api-Key: <Api Key>' \
     --header 'Idempotency-Key: activate_cards_001' \
     --header 'content-type: application/json' \
     --data '
{
  "customer_id": "9e3cccad-e9ae-47a0-81ee-063af0159310",
  "feature_id": "virtual_cards",
  "provider_data": {
    "annual_remuneration": 120000,
    "estimated_monthly_limit": 5000,
    "ip_address": "12.23.31.23"
  }
}
'

On success, the response confirms the feature is active and returns the application_id of the card application that was created:

{
  "data": {
    "customer_id": "9e3cccad-e9ae-47a0-81ee-063af0159310",
    "feature_id": "virtual_cards",
    "status": "active",
    "activated_at": "2026-01-09T10:29:16.000Z",
    "data": {
      "application_id": "a14ec356-f33d-4384-ba68-4d9bfa19765b"
    }
  },
  "error": null
}

Save the application_id. You'll use it to track the application and, later, to confirm the card can be created.

If liveness isn't complete yet

If the customer hasn't completed their selfie (liveness) check, activation can't finish. The response comes back with a websdk_url instead:

{
  "data": {
    "customer_id": "9e3cccad-e9ae-47a0-81ee-063af0159310",
    "feature_id": "virtual_cards",
    "status": "pending_liveness",
    "websdk_url": "https://verify.gravv.xyz/liveness/abc123xyz"
  },
  "error": null
}

Redirect the customer to the websdk_url to finish verification, then call Activate feature again. Activation is idempotent, so retrying after the check is done returns the existing application rather than creating a second one.

Step 2: Track the application status

A new application starts as pending while Gravv reviews it. Track it one of two ways:

curl --request GET \
     --url https://api.gravv.xyz/v1/cards/applications/{application_id} \
     --header 'Api-Key: <Api Key>'

The application_status field tells you where the application stands:

StatusWhat it meansWhat to do
pendingUnder reviewWait
approvedCleared. You can create the cardCall Create a card
needs_informationMore detail is needed to process the applicationSupply the missing details and re-check
needs_verificationSelfie verification is still required for intermediate KYCSend the customer to the application_link in the response, then re-check
manual_reviewA reviewer is checking the applicationWait
deniedThe application was rejectedStop. The customer can't be issued a card
lockedThe application is locked for a security concernContact support
canceledThe application was canceledStart a new application if still needed

When application_status is needs_verification, the response includes an application_link. Direct the customer there to finish their selfie verification, then poll again.

Next step

Once application_status is approved, move on to Create a card.


Did this page help you?