# Token Response

The response object passed to `onSubmit` [callback](https://docs.finix.com/js/callbacks) or `form.submit()` [method](https://docs.finix.com/js/form-instance) on successful tokenization. Access the token via `response.data`.

Tokens expire **30 minutes** after creation and should be used immediately to create a Payment Instrument.

## Card Token

### Card token shape

On success, `response.data` contains:

```json
{
  "id": "TKeD6uad8xZc52Rqg1VhvSBw",
  "created_at": "2025-06-10T00:31:53.54Z",
  "updated_at": "2025-06-10T00:31:53.54Z",
  "currency": "USD",
  "expires_at": "2025-06-11T00:31:53.54Z",
  "fingerprint": "FPRrcobjtdU98gr4sjiqYR1Qg",
  "instrument_type": "PAYMENT_CARD"
}
```

| Field          | Description                                                    |
|----------------|---------------------------------------------------------------|
| `id`           | Token ID (prefixed `TK`) — use this to create a Payment Instrument |
| `currency`     | `USD` for most countries; `CAD` for Canadian bank accounts     |
| `expires_at`   | Token expires 30 minutes after creation                       |
| `fingerprint`  | Unique fingerprint for the payment instrument (prefixed `FP`) |
| `instrument_type` | `PAYMENT_CARD`, `BANK_ACCOUNT`, or `THIRD_PARTY_TOKEN`  |

### Using the token

Pass `tokenData.id` to your backend, then use it to create a Payment Instrument via the Finix API.

## Bank Account Token

### Bank token shape

Bank account tokens have the same shape as card tokens, with `instrument_type: "BANK_ACCOUNT"`.

### Using the token

Pass `tokenData.id` to your backend, then use it to create a Payment Instrument via the Finix API.

## Error Response

### Error handling

When tokenization fails, `error` is non-null and `response` is `null`.

| Parameter | Type   | Description                               |
|-----------|--------|-------------------------------------------|
| `error`   | `object` | Error details if submission failed       |
| `response`| `null`  | Always `null` when error is present      |

### Example JavaScript Code

```javascript
// Card token — accessed via response.data in the onSubmit callback:
const tokenData = response.data || {};
// tokenData shape:
// {
//   "id": "TKeD6uad8xZc52Rqg1VhvSBw",
//   "created_at": "2025-06-10T00:31:53.54Z",
//   "updated_at": "2025-06-10T00:31:53.54Z",
//   "currency": "USD",
//   "expires_at": "2025-06-11T00:31:53.54Z",
//   "fingerprint": "FPRrcobjtdU98gr4sjiqYR1Qg",
//   "instrument_type": "PAYMENT_CARD"
// }

Finix.PaymentForm("payment-form", "sandbox", "APgPDQrLD52TYvqazjHJJchM", {
  onSubmit: function (error, response) {
    if (error) {
      console.error("Tokenization failed:", error);
      return;
    }

const tokenData = response.data || {};
    const token = tokenData.id; // e.g. "TKeD6uad8xZc52Rqg1VhvSBw"

// Send the token to your backend to create a Payment Instrument
    fetch("/your/backend", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ token: token }),
    });
  },
});

// Bank token — same shape, instrument_type differs:
const tokenData = response.data || {};
// tokenData shape:
// {
//   "id": "TKbFq4r8G5pN2mXvYhL9jW1c",
//   "created_at": "2025-06-10T00:31:53.54Z",
//   "updated_at": "2025-06-10T00:31:53.54Z",
//   "currency": "USD",
//   "expires_at": "2025-06-11T00:31:53.54Z",
//   "fingerprint": "FPaBC123def456ghi789",
//   "instrument_type": "BANK_ACCOUNT"
// }

const tokenData = response.data || {};
    const token = tokenData.id; // e.g. "TKbFq4r8G5pN2mXvYhL9jW1c"

Finix.PaymentForm("payment-form", "sandbox", "APgPDQrLD52TYvqazjHJJchM", {
  onSubmit: function (error, response) {
    if (error) {
      console.error("Tokenization failed:", error);
      return;
    }
    // response is null when error is non-null
  },
});
```
