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

# card.issued

> Fired when a new card is issued

## Event: `card.issued`

Sent when a new card has been successfully issued for a cardholder.

On card programs that provision asynchronously, `POST /partner/cards` returns immediately with `"status": "pending"` and this event fires later — once the card has been fully provisioned and transitioned to `active`. Treat this event (not the issue response) as the signal that the card is ready to use. Sandbox reproduces the same sequence after a short delay.

## Payload

```json theme={null}
{
  "cardId": "card_xyz789",
  "cardholderId": "ch_abc123",
  "programId": "prog_def456",
  "userId": "usr_ghi789"
}
```

| Field | Type | Description |
| - | - | - |
| `cardId` | string | Newly issued card ID |
| `cardholderId` | string | Cardholder the card was issued to |
| `programId` | string | Card program used for issuance |
| `userId` | string | Internal user ID linked to the cardholder |

## Response

Your endpoint must return a **2xx** status code within **30 seconds** to acknowledge receipt. Any non-2xx response or timeout triggers the [retry policy](/partner/webhooks#retry-policy).

| Status code | Meaning |
| - | - |
| `200` | Event received and processed |
| `202` | Event received, will process asynchronously |
| Any non-2xx | Delivery failed — will retry |

## Example handler

```javascript theme={null}
app.post("/webhooks/contro", (req, res) => {
  const eventType = req.headers["x-contro-event"];

  if (eventType === "card.issued") {
    const { cardId, cardholderId, programId } = req.body;
    // Notify your user that their card is ready
  }

  res.status(200).send("OK");
});
```
