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

# vIBAN Activated

> Webhook event fired when a Virtual IBAN is approved by compliance and becomes operational

# vIBAN Activated

<Info>
  **Event Name:** `viban_activated`
</Info>

<Note>
  This event signifies that a previously `PENDING` Virtual IBAN has been approved by compliance and is now ready to receive incoming transfers. The `iban` and `bic` (or `abaRoutingCode` for ACH) can now be shared with end users.
</Note>

## Event Payload

The webhook payload contains the following structure:

<CodeGroup>
  ```json Example Payload - SEPA theme={null}
  {
    "eventId": "550e8400-e29b-41d4-a716-446655440000",
    "eventType": "viban_activated",
    "timestamp": "2026-05-10T12:34:56.789Z",
    "data": {
      "vibanId": "7a1f3c5b-2d8e-4f0a-9b6c-1e3d4f5a6b7c",
      "accountId": "4c2b8e5d-1f6a-4e7c-9d3b-2a8f5c1e9b4d",
      "rail": "SEPA",
      "status": "ACTIVE",
      "iban": "DE89370400440532013000",
      "bic": "COBADEFFXXX"
    }
  }
  ```

  ```json Example Payload - ACH theme={null}
  {
    "eventId": "a3b6c9d2-1e4f-7a8b-9c0d-1e2f3a4b5c6d",
    "eventType": "viban_activated",
    "timestamp": "2026-05-10T12:34:56.789Z",
    "data": {
      "vibanId": "9d8e7f6a-5b4c-3d2e-1f0a-9b8c7d6e5f4a",
      "accountId": "4c2b8e5d-1f6a-4e7c-9d3b-2a8f5c1e9b4d",
      "rail": "ACH",
      "status": "ACTIVE",
      "iban": "123456789012"
    }
  }
  ```
</CodeGroup>

### Payload Fields

<ParamField path="eventId" type="string" required>
  Unique identifier for this webhook event
</ParamField>

<ParamField path="eventType" type="string" required>
  Event type — always `viban_activated` for this webhook
</ParamField>

<ParamField path="timestamp" type="string" required>
  ISO 8601 timestamp indicating when the event occurred
</ParamField>

<ParamField path="data" type="object" required>
  Event-specific payload

  <Expandable title="data">
    <ParamField path="vibanId" type="string" required>
      Unique identifier of the vIBAN that was activated
    </ParamField>

    <ParamField path="accountId" type="string" required>
      Identifier of the account the vIBAN is attached to
    </ParamField>

    <ParamField path="rail" type="string" required>
      Banking rail of the vIBAN — `SEPA` or `ACH`
    </ParamField>

    <ParamField path="status" type="string" required>
      Current vIBAN state — `ACTIVE` for this event
    </ParamField>

    <ParamField path="iban" type="string" required>
      Account number associated with the vIBAN (IBAN for SEPA, account number for ACH)
    </ParamField>

    <ParamField path="bic" type="string">
      BIC/SWIFT code of the underlying bank. Present for SEPA; omitted for ACH (use `abaRoutingCode` from the vIBAN response instead)
    </ParamField>
  </Expandable>
</ParamField>

## Expected Responses

<CardGroup cols={3}>
  <Card title="Success Response" icon="circle-check" color="#16a34a">
    **HTTP 200 OK**

    The webhook was processed successfully.
  </Card>

  <Card title="Client Error" icon="triangle-exclamation" color="#dc2626">
    **HTTP 4xx Status**

    Client-side error. Will not be retried.
  </Card>

  <Card title="Server Error" icon="circle-xmark" color="#ea580c">
    **HTTP 5xx Status**

    Server-side error. Will be retried with exponential backoff.
  </Card>
</CardGroup>

## Implementation Example

<CodeGroup>
  ```javascript Node.js theme={null}
  app.post('/webhooks/ralio', async (req, res) => {
    const { eventType, data } = req.body;

    if (eventType === 'viban_activated') {
      const { vibanId, accountId, iban, bic } = data;
      console.log(`vIBAN ${vibanId} activated on account ${accountId}`);

      // Persist the bank details so they can be shared with the end user
      await markVibanActive(vibanId, { accountId, iban, bic });

      return res.status(200).json({ received: true });
    }
  });
  ```

  ```python Python theme={null}
  @app.route('/webhooks/ralio', methods=['POST'])
  def handle_webhook():
      payload = request.get_json()

      if payload['eventType'] == 'viban_activated':
          data = payload['data']
          viban_id = data['vibanId']
          account_id = data['accountId']
          iban = data['iban']
          bic = data.get('bic', '')

          # Persist the bank details so they can be shared with the end user
          mark_viban_active(viban_id, account_id, iban, bic)

          return jsonify({'received': True}), 200
  ```

  ```go Go theme={null}
  func handleWebhook(w http.ResponseWriter, r *http.Request) {
      var payload struct {
          EventType string `json:"eventType"`
          Data      struct {
              VibanID   string `json:"vibanId"`
              AccountID string `json:"accountId"`
              Rail      string `json:"rail"`
              Status    string `json:"status"`
              IBAN      string `json:"iban"`
              BIC       string `json:"bic"`
          } `json:"data"`
      }

      if err := json.NewDecoder(r.Body).Decode(&payload); err != nil {
          http.Error(w, "Invalid JSON", http.StatusBadRequest)
          return
      }

      if payload.EventType == "viban_activated" {
          log.Printf("vIBAN %s activated on account %s", payload.Data.VibanID, payload.Data.AccountID)

          if err := markVibanActive(payload.Data.VibanID, payload.Data.AccountID, payload.Data.IBAN, payload.Data.BIC); err != nil {
              http.Error(w, "Internal error", http.StatusInternalServerError)
              return
          }

          w.Header().Set("Content-Type", "application/json")
          w.WriteHeader(http.StatusOK)
          json.NewEncoder(w).Encode(map[string]bool{"received": true})
      }
  }
  ```
</CodeGroup>
